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

Azure DevOps中Pull Request CI build无法关联Work Items的问题咨询

解决Azure DevOps PR构建关联并更新工作项的问题

我之前也碰到过一模一样的情况——PR触发的构建默认不会自动关联PR里的工作项,只有合并后的master分支构建能拿到。不过咱们可以通过Azure DevOps REST API + 管道预定义变量来实现你要的功能,让PR构建直接访问并更新关联的工作项状态。

核心思路

PR触发的构建其实自带了和当前PR相关的预定义变量,咱们可以用这些变量调用REST API拉取PR的详情(包括关联的工作项),然后再调用工作项更新API把状态改成"In Code Review"。

具体步骤

1. 确保管道有权限访问API和工作项

首先得给你的CI管道服务账号配置必要权限:

  • 进入项目设置 → 权限 → 找到**[项目名] Build Service ([组织名])**账号
  • 赋予它:读取拉取请求、读取工作项、编辑工作项的权限
  • 在管道编辑页面,勾选允许脚本访问OAuth令牌(在“代理作业”的选项里)

2. 添加PowerShell任务获取PR关联的工作项

在CI管道里添加一个PowerShell任务,只在PR触发构建时执行(用条件判断)。脚本会调用REST API获取PR详情,提取关联的工作项ID:

# 只在PR触发的构建中执行
if ($env:BUILD_REASON -eq "PullRequest") {
    # 构造PR详情API的URL
    $prApiUrl = "https://dev.azure.com/$env:SYSTEM_TEAMPROJECTID/$env:SYSTEM_TEAMPROJECTID/_apis/git/pullrequests/$env:SYSTEM_PULLREQUEST_PULLREQUESTID?api-version=7.1-preview.1"
    
    # 调用API获取PR数据
    $prResponse = Invoke-RestMethod -Uri $prApiUrl -Headers @{
        Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
    }

    # 提取关联的工作项ID列表
    $workItemIds = $prResponse.workItems.id
    Write-Host "关联的工作项ID:$workItemIds"

    # 将工作项ID存入管道变量,供后续任务使用(可选)
    Write-Host "##vso[task.setvariable variable=WorkItemIds;]$($workItemIds -join ',')"
}

3. 添加任务更新工作项状态

接着再添加一个PowerShell任务,用上面拿到的工作项ID,调用API更新状态为"In Code Review":

if ($env:BUILD_REASON -eq "PullRequest" -and $env:WorkItemIds) {
    $workItemIds = $env:WorkItemIds -split ','
    
    foreach ($id in $workItemIds) {
        # 构造工作项更新的请求体
        $updateBody = @(
            @{
                op = "replace"
                path = "/fields/System.State"
                value = "In Code Review"
            }
        ) | ConvertTo-Json

        # 调用工作项更新API
        $updateApiUrl = "https://dev.azure.com/$env:SYSTEM_TEAMPROJECTID/_apis/wit/workitems/$id?api-version=7.1-preview.3"
        Invoke-RestMethod -Uri $updateApiUrl -Method PATCH -Headers @{
            Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
            "Content-Type" = "application/json-patch+json"
        } -Body $updateBody

        Write-Host "已更新工作项 $id 的状态为 In Code Review"
    }
}

4. 给任务添加触发条件

为了避免在计划构建或手动构建时执行这些任务,给两个PowerShell任务都加上条件:

eq(variables['Build.Reason'], 'PullRequest')

可选方案:用Marketplace扩展简化操作

如果你不想写脚本,可以去Azure DevOps Marketplace找类似Work Item Update的扩展,这类扩展能直接在管道里配置,通过PR关联的工作项来更新状态,省去自己写API调用的麻烦。不过要注意扩展的兼容性和权限配置。

关键说明

  • 预定义变量System.PullRequest.PullRequestId和System.TeamProjectId只有在PR触发的构建中才会有值,所以条件判断很重要
  • 确保你的工作项类型确实有"In Code Review"这个状态值,不然API会返回错误

内容的提问来源于stack exchange,提问作者GooseZA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:23:12