#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"'
Но, пожалуйста, как я могу записать 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:
Я вижу здесь несколько вариантов…
- Используйте 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
- Разветвите задачи Jfrog, расширьте их, чтобы задать выходную переменную, и опубликуйте раздвоенное частное расширение в частном издателе.
- Отправьте хорошим людям в 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.