Захват выходного результата JSON из задачи Azure Devops

#azure-devops #azure-pipelines #azure-pipelines-yaml #jfrog-cli

Вопрос:

Я хотел бы загрузить пакет на Jfrog Artifactory и автоматически получить его URL-адрес. Это работает :

 - task: ArtifactoryGenericUpload@2
  inputs:
    artifactoryService: connexion_service_id
    fileSpec: |
     {
       "files": [
         {
          "pattern": "myPackage.zip",
          "target": "myRepo/myApp.zip"
         }
       ]
     }
    failNoOp: true

- task: JfrogCli@1
  inputs:
    artifactoryService: connexion_service_id
    command: 'jfrog rt curl -XGET "/api/search/artifact?name=myApp.zipamp;repos=myRepo"'
 

Вывод Json для захвата

Но, пожалуйста, как я могу записать URI результата json в переменную конвейера azure ?

Я попытался использовать powershell в command свойстве или в задаче powershell :

 command: 'jfrog rt curl -XGET "/api/search/artifact?name=myApp.zipamp;repos=myRepo" | ConvertFrom-Json  | Select -ExpandProperty "results"'

Write-Host "##vso[task.setvariable variable=myVar]$jsonResult"
 

Комментарии:

1. Задача JfrogCli является задачей третьей стороны, поэтому вам, возможно, потребуется спросить ее создателей: jfrog.com/confluence/display/JFROG/…

Ответ №1:

Я вижу здесь несколько вариантов…

  1. Используйте API REST для извлечения журнала из задачи JfrogCLI и используйте PowerShell для анализа выходных данных и получения нужных данных. Установите их в качестве переменной в своем PowerShell. Очень уродливый трюк, но он работает. Используйте REST API, чтобы захватить временную шкалу текущей сборки, отфильтровать ее по текущему заданию, найти задачу по ее имени и загрузить файл журнала. См.: https://github.com/jessehouwing/azure-pipelines-tfvc-tasks/blob/features/parallelFix/tf-vc-fixparallel/v2/TfvcFixParallel.v3.ps1
 $buildId = $env:Build_BuildId
$jobId = $env:System_JobId
$org = $env:System_TeamFoundationCollectionUri
$vssCredential = $env:System_AccessToken
$header = @{authorization = "Bearer $vssCredential"}
$teamProject = $env:System_TeamProject

function get-timeline 
{
    [cmdletbinding()]
    param(
        $runId
    )
    $url = "$org$teamProject/_apis/build/builds/$runId/Timeline"
    return Invoke-RestMethod -Uri $url -Method Get -ContentType "application/json" -Headers $header 
}

function get-log
{
    [cmdletbinding()]
    param(
        $timeline,
        $job
    )

    # replace task name filter with the kind of task you want.

    $tasks = @($timeline.records | ?{ ($_.parentId -eq $job.id) -and ($_.type -eq "Task") -and ($_.name -eq "Pre-job: Fix parallel execution on hosted agent 1/2.") -and ($_.state -eq "completed") })
    
    if ($tasks.Length -gt 0)
    {
        $url = $tasks[0].log.url
        if (-not "$url" -eq "")
        {
            $log = (Invoke-WebRequest -Uri $url -Headers $header -UseBasicParsing).Content

            return $log
        }
    }
    return $null
}

$timeline = get-timeline -runId $buildId 
$log = get-log -timeline $timeline -job $jobId
 
  1. Разветвите задачи Jfrog, расширьте их, чтобы задать выходную переменную, и опубликуйте раздвоенное частное расширение в частном издателе.
  2. Отправьте хорошим людям в Jfrog запрос на вывод с желаемыми изменениями.

Комментарии:

1. Спасибо за ответ, я попытаюсь получить журнал, я добавлю код решения здесь позже.

2. Мой код немного чрезмерно сложен, так как он пытается повторить все выполняемые задания. С помощью JobID и buildId вы сможете захватить временную шкалу за один звонок.

3. Действительно, это сложно, я не все понимаю, как вы думаете, можно ли извлечь соответствующую строку для меня, пожалуйста?

4. Я примерно извлек то, что вам нужно. Это еще не на 100% идеально, и вы можете использовать Postman для просмотра точных возвращаемых данных.

Ответ №2:

Я думаю, что вы могли бы объединить powershell с командой JfrogCli в приведенном выше примере, и я не думаю, что это сработает.

Попробуй:

 - pwsh: |
    jfrog rt curl -XGET "/api/search/artifact?name=myApp.zipamp;repos=myRepo" | 
    ConvertFrom-Json | 
    Select -ExpandProperty "results"
 

Возможно, вам потребуется указать путь к интерфейсу командной строки jfrog в этом сценарии, если он не указан в ПУТИ агента сборки.

Комментарии:

1. Извините, что я тоже думал об этом, но я не могу использовать Powershell : без task: JfrogCli@1 него я не могу получить artifactoryService: connexion_service_id учетные данные with.