Мне удалось обойти проблему. Он состоит из нескольких этапов и некоторого жесткого кодирования, но теперь я могу пометить запрос на извлечение определенными определенными тегами и запустить проверку сборки pipeline
, чтобы в результате выполнить только соответствующие части.
Мой Настройка состоит из одного большого pr-pipeline.yml
файла, который запускается при проверке сборки PR в моей ветви dev
. Триггер ручной, но обязательный, что позволяет лицу, выдающему PR, пометить его соответствующим образом до его начала.
После запуска конвейера самый первый шаг использует API-интерфейс Azure DevOps REST для определения присутствующих тегов. на соответствующем PR путем вызова этой конечной точки:
https://dev.azure.com/$(organizationName)/$(System.TeamProjectId)/_apis/git/repositories/$(Build.Repository.ID)/pullRequests/$(System.PullRequest.PullRequestId)/labels?api-version=5.1-preview.1
Каждый требуемый параметр, кроме имени организации, предоставляется предопределенными переменными для конвейера.
Для вызова конечная точка Я использую токен личного доступа (PAT), предоставленный агенту Azure DevOps в предопределенной переменной System.AccessToken
и небольшим скриптом PowerShell:
$accessToken = "$(System.AccessToken)"
$basicAuth = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$accessToken"))
$headers = @{Authorization = "Basic $basicAuth"}
$url = $(url)
$data = Invoke-WebRequest -Method Get -Uri $url -Headers $headers
Write-Host "##vso[task.setvariable variable=prlabels]$data"
После того, как у меня есть теги, я извлекаю каждая из них в виде отдельной переменной с использованием небольшого фрагмента PowerShell. Переменная prlabels
заполняется:
$tagsJson = '$(prlabels)' | ConvertFrom-Json
$tags = $tagsJson.value | ForEach-Object { $_.name }
Write-Host "Tags: $($tags -join ";")"
$tags | ForEach-Object { Write-Host "##vso[task.setvariable variable=prlabel_$_;isOutput=true]true" }
Если мой pr помечен solution-a
и solution-c
, это приведет к определению следующих выходных переменных:
prlabel_solution-a = true
prlabel_solution-c = true
* 1027 Наконец, я могу использовать эти выходные переменные в качестве условий для запуска соответствующих заданий, которые выполняют фактическую сборку и развертывание для соответствующих решений. Задание, которое извлекает теги, называется
PreReq
, а задание, которое выводит отдельные переменные, -
prlabels
:
- job: DeploySolutionA
dependsOn: PreReq
condition: and(succeeded(), eq(dependencies.PreReq.outputs['prlabels.prlabel_solution-a'], 'true'))
# ...
. Все это вместе позволяет мне развернуть одно или несколько указанных c решений в PR на основе того, что определяет пользователь. Пользователю все еще требуется знать эти метки, но, по крайней мере, им не нужно вручную запускать каждый конвейер при каждом запуске за пределами PR.