Azure环境下如何从提交触发的构建中获取Pull Request ID
分支提交触发构建中获取Pull Request ID的解决方案
我明白你遇到的这个痛点:之前找到的通过BuildId获取PR ID的方案只适配Pull Request触发的构建,而当构建是由分支直接提交触发时,parameters对象是空的,根本拿不到PR相关参数。别担心,咱们换个思路,从构建的关联资源或者Azure DevOps API入手来解决这个问题。
方法一:通过构建详情API直接获取关联PR ID
分支提交触发的构建虽然不会在parameters里携带PR信息,但Azure DevOps会记录该构建关联的所有PR(比如这个提交被包含在某个PR的分支里)。你可以调用Builds - Get Build API来提取pullRequestIds字段:
举个PowerShell示例,你可以直接把这个集成到Pipeline里:
# 替换成你的组织、项目信息,PAT可通过Azure DevOps生成 $orgUrl = "https://dev.azure.com/your-org-name" $projectName = "your-project-name" $buildId = "$(Build.BuildId)" # 直接使用Pipeline预定义变量获取当前构建ID $pat = "your-personal-access-token" # 构建请求授权头 $headers = @{ Authorization = "Basic $([Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$pat")))" } # 获取构建详情 $buildDetails = Invoke-RestMethod -Uri "$orgUrl/$projectName/_apis/build/builds/$buildId?api-version=7.1-preview.7" -Headers $headers -Method Get # 提取并输出关联的PR ID if ($buildDetails.pullRequestIds.Count -gt 0) { Write-Host "找到关联的Pull Request ID(s): $($buildDetails.pullRequestIds -join ', ')" } else { Write-Host "当前构建没有关联任何Pull Request" }
方法二:通过提交SHA查询关联PR
如果方法一返回空,可能是因为构建的提交还没被关联到任何PR,这时候你可以用构建的sourceVersion(也就是提交的SHA),调用Pull Requests - Get Pull Requests By Commit API,找到所有包含这个提交的PR:
同样是PowerShell示例,利用Pipeline预定义变量$(Build.SourceVersion)获取提交SHA:
# 替换成你的组织、项目、仓库名和PAT $orgUrl = "https://dev.azure.com/your-org-name" $projectName = "your-project-name" $repoName = "your-repo-name" $commitSha = "$(Build.SourceVersion)" # 直接使用Pipeline预定义变量获取当前提交SHA $pat = "your-personal-access-token" $headers = @{ Authorization = "Basic $([Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$pat")))" } # 查询包含该提交的PR $relatedPRs = Invoke-RestMethod -Uri "$orgUrl/$projectName/_apis/git/repositories/$repoName/pullrequests?commitId=$commitSha&api-version=7.1-preview.1" -Headers $headers -Method Get if ($relatedPRs.value.Count -gt 0) { foreach ($pr in $relatedPRs.value) { Write-Host "关联Pull Request: ID=$($pr.pullRequestId) | 标题=$($pr.title)" } } else { Write-Host "该提交未被任何Pull Request包含" }
额外说明
- 如果你的提交是完全独立的(没有被任何PR引用、也没有合并到PR分支),那确实无法获取到PR ID——因为本身就没有关联的PR存在,这是合理的情况。
- 在Pipeline中使用这些脚本时,记得给服务账号或者PAT分配足够的权限(比如
Build (Read)和Pull Request (Read)权限)。
内容的提问来源于stack exchange,提问作者Peter Boomsma
相关产品推荐
相关产品推荐

