如何在启用Pull Request Deployment的Release Pipeline中获取关联的Work Item?
我来分享几种在你的Release Pipeline场景下获取关联Work Item信息的标准实现方式,以及你提到的简便方案的细节:
标准实现方法
这些方法不依赖分支命名约定,直接从Azure DevOps的关联关系中获取数据,准确性更高:
1. 通过Azure DevOps REST API手动获取
因为你的Release是由PR触发的Build工件启动的,而Build又和PR、Work Item关联,所以可以通过REST API逐层获取关联信息:
步骤说明:
- 在Release Pipeline中添加一个PowerShell(或Bash)任务,用来调用API
- 利用Release内置变量拿到当前关联的Build ID,再通过Build ID获取关联的Work Items
示例PowerShell脚本:
# 替换成你的工件名称(在Release中配置的工件名称) $artifactName = "MyAppArtifact" $buildId = $(Release.Artifacts.$artifactName.BuildId) $orgUrl = $(System.TeamFoundationCollectionUri) $projectName = $(System.TeamProject) # 使用系统AccessToken进行授权 $token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$(System.AccessToken)")) # 调用API获取Build关联的所有Work Items $wiApiUrl = "$orgUrl/$projectName/_apis/build/builds/$buildId/workitems?api-version=7.1-preview.2" $wiResponse = Invoke-RestMethod -Uri $wiApiUrl -Headers @{Authorization = "Basic $token"} -Method Get # 遍历输出Work Item信息,并设置为Release变量供后续任务使用 foreach ($workItem in $wiResponse.value) { Write-Host "找到关联Work Item: ID=$($workItem.id),标题=$($workItem.fields.'System.Title')" # 设置变量,后续任务可以用$(AssociatedWIId)和$(AssociatedWITitle)引用 Write-Host "##vso[task.setvariable variable=AssociatedWIId;]$($workItem.id)" Write-Host "##vso[task.setvariable variable=AssociatedWITitle;]$($workItem.fields.'System.Title')" }
注意:要确保这个PowerShell任务的"允许脚本访问OAuth令牌"选项已经勾选(在任务的"高级"设置里),否则$(System.AccessToken)无法正常使用。
2. 使用Azure DevOps Marketplace扩展
如果你不想自己写API脚本,可以借助现成的扩展来简化操作:
- 比如Work Item Utilities扩展,提供了专门的任务来获取关联的Work Item,支持从Build/Release上下文提取数据
- 或者Release Work Item Linker,可以自动关联Work Item到Release,并提供变量输出Work Item信息
安装扩展后,直接在Release Pipeline中添加对应任务,按照向导配置即可获取Work Item数据,无需手动编写API调用逻辑。
简便分支名称方案
正如你提到的,依赖团队分支命名约定(比如分支名包含PBI-XXXX)的方案实现起来更快:
示例脚本(提取PBI编号):
$artifactName = "MyAppArtifact" $branchName = $(Release.Artifacts.$artifactName.SourceBranchName) # 用正则匹配提取分支名中的PBI编号 if ($branchName -match "PBI-(\d+)") { $pbiId = $matches[1] Write-Host "从分支名提取到PBI ID: $pbiId" Write-Host "##vso[task.setvariable variable=PBIId;]$pbiId" } else { Write-Warning "未从分支名中找到符合约定的PBI编号" }
这种方案的优点是实现简单,但缺点是依赖团队严格遵守命名规则,如果分支名不符合约定就会失效,可靠性不如标准API方法。
内容的提问来源于stack exchange,提问作者Mathias F
相关产品推荐
相关产品推荐

