我已经设法解决了这个问题。它涉及几个步骤和一些硬编码,但我现在能够使用某些定义的标签标记拉取请求,并触发构建验证pipeline
,结果只运行相关部分。
我的设置由一个大pr-pipeline.yml
文件组成,该文件由 PR 的构建验证触发到我的dev
分支。触发器是手动的,但需要它允许发布 PR 的人在它开始之前相应地标记它。
管道运行后,第一步使用 Azure DevOps REST API 通过调用此端点来确定关联 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
除组织名称外,所需的每个参数都由管道的预定义变量提供。
要调用端点,我使用 Azure DevOps 在预定义变量中提供给代理的个人访问令牌 (PAT)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
最后,我可以使用这些输出变量作为触发相关作业的条件,这些作业执行相应解决方案的实际构建和部署。获取标签的作业被命名PreReq
,输出单个变量的任务被命名prlabels
:
- job: DeploySolutionA
dependsOn: PreReq
condition: and(succeeded(), eq(dependencies.PreReq.outputs['prlabels.prlabel_solution-a'], 'true'))
# ...
所有这一切使我能够根据用户定义在 PR 中部署一个或多个特定的解决方案。它仍然需要用户知道这些标签,但至少他们不必在 PR 之外的每次运行时手动启动每个管道。