我正在将我现有的Jenkins Jobs系列工作转移到Modern Jenkins As Code Workflow Pipeline。
通过这一举措,出现了各种新的插件,它们提供了Pipeline插件可以使用的步骤。其中一个是Jenkins Artifactory插件。
这个插件可以接受Artifactorys“AQL”语言的json对象,或者反过来一个非常简单的模式来搜索匹配模式的Artifacts的一系列repos。
我尝试使用“AQL”和模式来解析我的工件。
我遇到的问题是,我想模仿可以在Jenkins Jobs中使用的现有Jenkins Artifact Resolver插件的行为。
此插件使用我当前为DSL工作流程提供的相同模式,并且仅在该特定返回集中下载LATEST或LAST MODIFIED工件。我想为我的新方法做同样的事情。
以下是使用基于图案的搜索的结果:
jfrog rt search "client-snapshots/com/client/content_services/search-dist/*.zip"
[Info:] Pinging Artifactory...
[Info:] Done pinging Artifactory.
[Info:] Searching Artifactory using AQL query: items.find({"repo": "client-snapshots","$or": [{"$and": [{"path": {"$match":"com/client/content_services/search-dist"},"name":{"$match":"*.zip"}}]},{"$and": [{"path": {"$match":"com/client/content_services/search-dist/*"},"name":{"$match":"*.zip"}}]}]}).include("name","repo","path","actual_md5","actual_sha1","size")
[Info:] Artifactory response: 200 OK
[Info:] Found 58 artifacts.
以下是使用精心制作的json对象
中的“AQL”查询的结果jfrog rt search --spec art-search.json
[Info:] Pinging Artifactory...
[Info:] Done pinging Artifactory.
[Info:] Searching Artifactory using AQL query: items.find({"repo":"client-snapshots","$and":[{"$or":[{"path":{"$match":"com/client/content_services"},"name":{"$match":"*search*"}}]},{"$or":[{"path":{"$match":"*dist*"},"name":{"$match":".zip"}}]},{"$or":[{"path":{"$match":"*1.0-SNAPSHOT*"},"name":{"$match":"*"}}]}]}).include("name","repo","path","actual_md5","actual_sha1","size")
[Info:] Artifactory response: 200 OK
[Info:] Found 116 artifacts.
以上查询的json:
{
"files": [
{
"aql": {
"items.find": {
"repo": "client-snapshots",
"$and": [
{
"$or": [
{
"path": {
"$match": "com/client/content_services"
},
"name": {
"$match": "*search*"
}
}
]
},
{
"$or": [
{
"path": {
"$match": "*dist*"
},
"name": {
"$match": ".zip"
}
}
]
},
{
"$or": [
{
"path": {
"$match": "*1.0-SNAPSHOT*"
},
"name": {
"$match": "*"
}
}
]
}
]
}
},
"target": "Bazinga/Artifactory/"
}
]
}
第一个只返回我指定的repo的拉链,这是我真正想要的。 json对象从我指定的repo返回poms和zip。我可以不用poms,因为我只对下载拉链感兴趣。
更重要的是,我想使用上述模式之一返回最新的zip。
任何建议都将受到赞赏
答案 0 :(得分:1)
所以我找到了使用AQL和PowerShell的替代解决方案。
$pair = "$($art_user):$($art_pass)"
Write-Verbose "Attempting to convert Artifactory credentials to a base64 string for automation"
$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair))
$basicAuthValue = "Basic $encodedCreds"
$headers = @{
Authorization = $basicAuthValue
}
Write-Host "Attempting to perform a AQL search."
$aql_search = $art_base_url + "/api/search/aql"
Write-Host "Building aql query with the following parameters, groupID: $group_id, artifactID: $artifact_id, version: $version, classifier: $classifier and repos: $art_generic_repokey."
$aql_query = 'items.find({"repo":"' + $art_generic_repokey + '","$or":[{"$and":[{"path":{"$match":"' + $group_id + '/' + $artifact_id + '/' + $version + '"},"name":{"$match":"' + $artifact_id + '*' + $classifier + '*.' + $extension + '"}}]}]}).sort({"$desc":["modified"]}).limit(1)'
Write-Host "Built the following aql query: '$aql_query' ."
$aql_content = Invoke-RestMethod -Uri $aql_search -Headers $headers -Method Post -Body $aql_query -ContentType 'text/plain'
Write-Host "Attempting to submit the aql query to the following artifactory server: $art_base_url."
$aql_results = ($aql_content).results
Write-Host "Attempting to parse query results and build the artifact download uri."
$aql_repo,$aql_path,$aql_name = ($aql_results).repo,($aql_results).path,($aql_results).name
$artifactDownloadUri = $art_base_url + '/' + $aql_repo + '/' + $aql_path + '/' + $aql_name
Write-Host "Found the following uri: $artifactDownloadUri !!"
if ($artifactMimeType -eq 'application/zip' -or $extension -eq 'zip') {
Write-Verbose "Attempting to save the artifact to $download_dir/$art_dist_name.zip"
Invoke-RestMethod -Uri $artifactDownloadUri -Headers $headers -OutFile "$download_dir/$art_dist_name.zip"
}