You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在启用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 20:47:43