#azure-devops #azure-devops-pipelines
#azure-devops #azure-devops-конвейеры
Вопрос:
У меня есть конвейер выпуска, который запускается всякий раз, когда публикуется новая версия универсального пакета. Теперь, поскольку мой пакет может быть повышен до определенного представления (по умолчанию @local, @prereleas или @release), я хотел бы использовать выбранное представление в пользовательском условии для последующих шагов в моем конвейере.
Что-то вроде :
eq($(hopefullysomepredefinedvar), ‘@prerelease’)
Тем не менее, я проверил доступные предопределенные переменные, и информация о «представлении», похоже, недоступна, если я что-то не пропустил.
Вероятно, еще более чистым решением было бы использовать отдельные этапы в конвейере выпуска и оценивать «представление» с помощью некоторого условия перед развертыванием, но я не нашел способа сделать это.
Наконец, я попытался добавить один и тот же артефакт (универсальный пакет) несколько раз, с разными «представлениями» для «фильтрации». Итак, один раз с view @prerelease и один раз с view @release. Однако, похоже, что мой конвейер вообще не запускается при такой конфигурации.
Есть ли решение (или хороший обходной путь) для этого?
Спасибо!
Комментарии:
1. Не удается получить последнюю информацию. Просто хотите проверить, полезен ли для вас приведенный ниже ответ? Если да, вы можете принять ответ , который также может быть полезен для других, у кого такая же головоломка, и мы могли бы заархивировать эту тему. Кроме того, не стесняйтесь оставлять комментарии ниже, если у вас все еще есть какие-либо вопросы по этому поводу:-) Хорошего дня.
Ответ №1:
В качестве обходного пути вы можете написать скрипт через rest api для оценки представления пакета. Если существует представление с именем Prerelease
, задайте condition
переменной значение true
.
GET https://feeds.dev.azure.com/{organization}/{project}/_apis/packaging/Feeds/{feedId}/Packages/{packageId}/versions/{packageVersionId}?api-version=6.0-preview.1
Пример сценария:
$url = 'GET https://feeds.dev.azure.com/{organization}/{project}/_apis/packaging/Feeds/{feedId}/Packages/{packageId}/versions/{packageVersionId}?api-version=6.0-preview.1';
$token = "PAT"
$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($token)"))
$response = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Basic $token"} -Method Get -ContentType application/json
$results = $response.views.name
foreach($view in $response.views){
if($view.name -eq "Prerelease"){
$condition = "true"
}
}
Write-Host "results = $($results | ConvertTo-Json -Depth 100)"
Write-Host "result = $condition"
Затем вы можете задать пользовательское условие следующим eq($(condition), true)
образом.
Второй обходной путь:
Добавьте несколько источников артефактов, а затем укажите псевдоним источника, как показано ниже:
Мы можем использовать Release.TriggeringArtifact.Alias
переменную по умолчанию, чтобы получить псевдоним артефакта, который вызвал выпуск в условии для оценки представления.
Например: condition: contains(variables['Release.TriggeringArtifact.Alias'], '@prerelease' ))
Комментарии:
1. Afaik API предполагает, что я знаю номер версии, верно? В артефакте конвейера выпуска, который запускает конвейер, я просто указываю «Последний», и, кажется, я помню, что где-то читал, что API этого не поддерживает.
2.
I just specify 'Latest'
Вы можете попробовать этот api . По умолчанию используется последняя версия.3. хорошо, я попробую. Я только что понял, что у меня также есть версия, которая запускала конвейер из переменных артефактов запуска, например [BUILD_BUILDID] —> [0.5.0], так что я мог бы даже передать это в API.
4. Вызов API работает нормально. Единственная проблема с этим подходом заключается в том, что если я удалю «фильтр представления» из триггера артефакта, конвейер запускается только при публикации новой версии пакета, а не при продвижении версии до определенного представления.
5. Если вы хотите, чтобы конвейер запускался при продвижении версии до определенного представления, почему вы удаляете view ‘filter’ из триггера артефакта? Кроме того, я добавил в ответ еще одно обходное решение, пожалуйста, просмотрите его.