Плагин Jenkins Artifactory AQL скачать последнюю модель соответствия артефактов

Я нахожусь в процессе перемещения моих существующих рабочих серий Jenkins Jobs, которые связаны в конвейер, в Modern Jenkins As Code Workflow Pipeline.

С этой инициативой приходят различные новые плагины, которые предоставляют шаги, которые может использовать плагин Pipeline. Одним из них является плагин Jenkins Artifactory.

Этот плагин может принимать объект json языка Artifactor "AQL" или, наоборот, очень простой шаблон для поиска в серии репозиториев артефактов, соответствующих шаблону.

Я попытался использовать как "AQL", так и шаблон для разрешения моих артефактов.

Проблема, с которой я столкнулся, заключается в том, что я хотел бы имитировать поведение существующего плагина Jenkins Artifact Resolver, который можно использовать в заданиях Jenkins.

Этот плагин использует те же шаблоны, которые я в настоящее время предоставляю для рабочего процесса 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.

Вот результат использования запроса "AQL" из специально созданного объекта json

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/"
    }
  ]
}

Первый возвращает только почтовые индексы из указанного мной репо, чего я и хочу. Объект json возвращает оба poms и почтовые индексы из указанного мной репо. Я мог бы обойтись без помпонов, так как меня интересует только скачивание молний.

Более того, я хотел бы просто вернуть последний почтовый индекс, используя один из вышеуказанных шаблонов.

Любые предложения будут оценены

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"
}
Другие вопросы по тегам