簡體   English   中英

Jenkins Artifactory Plugin AQL下載最新神器匹配模式

[英]Jenkins Artifactory Plugin AQL download latest artifact matching pattern

我正在將我現有的工作系列 Jenkins 作業轉移到現代 Jenkins 作為代碼工作流管道的管道中。

這一舉措帶來了各種新插件,它們提供了 Pipeline 插件可以使用的步驟。 其中之一是 Jenkins Artifactory 插件。

這個插件可以接受 Artifactorys “AQL” 語言的 json 對象,或者相反,一個非常簡單的模式來搜索一系列 repos 以尋找匹配模式的 Artifacts。

我已經嘗試使用“AQL”和模式來解決我的工件。

我遇到的問題是,我想模仿可在 Jenkins 工作中使用的現有 Jenkins Artifact Resolver 插件的行為。

這個插件使用我目前提供給 DSL 工作流的相同模式,並且只下載該特定返回集中的最新或最后修改的工件。 我想為我的新方法做同樣的事情。

這是使用基於模式的搜索的結果:

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 中的 zip,這正是我真正想要的。 json 對象從我指定的 repo 中返回 poms 和 zip。 我可以不用 poms,因為我只對下載 zip 感興趣。

更重要的是,我只想使用上述模式之一返回最新的 zip。

任何建議將不勝感激

所以我找到了一個使用 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"
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM