Jenkins Artifactory Plugin AQL下载最新的工件匹配模式

时间:2016-10-12 19:50:52

标签: json maven jenkins artifactory artifactory-query-lang

我正在将我现有的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。

任何建议都将受到赞赏

1 个答案:

答案 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"
}