2016-11-07 2 views
0

J'utilise ce script ci-dessous pour supprimer certains artefacts dans Artifactory en fonction de certains critères par requête AQL. Je suis un débutant au script groovy mais j'aimerais savoir s'il est possible d'importer la requête AQL à partir d'un fichier externe afin de ne pas avoir à éditer ce script à chaque fois pour tout changement dans la requête AQL. Cette requête ci-dessous fonctionne actuellement comme prévu mais toute aide serait appréciée si vous appelez AQL depuis un fichier externe.Existe-t-il un moyen d'importer le fichier AQL d'importation en externe dans le script groovy de nettoyage artificiel

Merci à l'avance

import groovyx.net.http.RESTClient 
import groovyx.net.http.HttpResponseException 
import org.apache.http.conn.HttpHostConnectException 


def query = '**items.find({"repo": "xxx-repo-for-poc","created_by" : "xxx","name" :{"$match": "*.nupkg"})**' // replace this with your AQL query 
    def artifactoryURL = 'http://Servername:8081/artifactory/' // replace this with Artifactory server 
    def restClient = new RESTClient(artifactoryURL) 
    restClient.setHeaders(['Authorization': 'Basic ' + "admin:password".getBytes('iso-8859-1').encodeBase64()]) //replace the 'admin:password' with your own credentials 
    def dryRun = true //set the value to false if you want the script to actually delete the artifacts 

    def itemsToDelete = this.&getAqlQueryResult(restClient, query) 
    if (itemsToDelete != null && itemsToDelete.size() > 0) { 
     this.&delete(restClient, itemsToDelete, dryRun) 
    } else { 
     println('NOTHING TO DELETE') 
    } 

    /** 
    * Send the AQL to Artifactory and collect the response. 
    */ 
    public List getAqlQueryResult(RESTClient restClient, String query) { 
     def response 
     try { 
      response = restClient.post(path: 'api/search/aql', 
        body: query, 
        requestContentType: 'text/plain' 
      ) 
     } catch (Exception e) { 
      println(e.message) 
     } 
     if (response != null && response.getData()) { 
      def results = []; 
      response.getData().results.each { 
       results.add(constructPath(it)) 
      } 
      return results; 
     } else return null 
    } 

    /** 
    * Construct the full path form the returned items. 
    * If the path is '.' (file is on the root) we ignores it and construct the full path from the repo and the file name only 
    */ 
    public constructPath(groovy.json.internal.LazyMap item) { 
     if (item.path.toString().equals(".")) { 
      return item.repo + "/" + item.name 
     } 
     return item.repo + "/" + item.path + "/" + item.name 
    } 

    /** 
    * Send DELETE request to Artifactory for each one of the returned items 
    */ 
    public delete(RESTClient restClient, List itemsToDelete, def dryRun) { 
     dryMessage = (dryRun) ? "*** This is a dry run ***" : ""; 
     itemsToDelete.each { 
      println("Trying to delete artifact: '$it'. $dryMessage") 
      try { 
       if (!dryRun) { 
        restClient.delete(path: it) 
       } 
       println("Artifact '$it' has been successfully deleted. $dryMessage") 
      } catch (HttpResponseException e) { 
       println("Cannot delete artifact '$it': $e.message" + 
         ", $e.statusCode") 
      } catch (HttpHostConnectException e) { 
       println("Cannot delete artifact '$it': $e.message") 
      } 
     } 
    } 

Répondre

0

Le searches api expose la méthode aql qui vous permet d'exécuter des requêtes AQL et agir sur les résultats comme bon vous semble.

Vous devez également vérifier les plugins utilisateur , il fournit des informations utiles et des exemples d'utilisation.