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")
}
}
}