I am using this below script to delete some artifacts in Artifactory based on certain criteria by AQL query. I am a newbie to groovy script but I would like to know if its possible to import the AQL query from an external file so we don't have to edit this script everytime for any change in AQL query. This below query currently works as expected but any help would be appreciated if call AQL from external file.
我使用下面的脚本根据AQL查询的某些条件删除Artifactory中的一些工件。我是groovy脚本的新手,但我想知道是否可以从外部文件导入AQL查询,因此我们不必每次都为AQL查询中的任何更改编辑此脚本。以下查询目前按预期工作,但如果从外部文件调用AQL,将会感激任何帮助。
Thanks in advance
提前致谢
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")
}
}
}
1 个解决方案
#1
0
The searches api exposes the aql method that enables you to execute AQL
queries and act on the results as you see fit.
搜索api公开了aql方法,该方法使您能够执行AQL查询并根据需要对结果进行操作。
You should also check the user plugins documentation, it provides useful information and usage examples.
您还应该检查用户插件文档,它提供了有用的信息和用法示例。
#1
0
The searches api exposes the aql method that enables you to execute AQL
queries and act on the results as you see fit.
搜索api公开了aql方法,该方法使您能够执行AQL查询并根据需要对结果进行操作。
You should also check the user plugins documentation, it provides useful information and usage examples.
您还应该检查用户插件文档,它提供了有用的信息和用法示例。