能否通过Azure DevOps pipelines创建并合并拉取请求?
方案说明
你之前了解到的「Azure DevOps REST API最多仅支持2次提交」的说法不符合实际情况,该API对PR关联的提交次数没有限制,完全可以满足你的需求。以下是跨平台的实现方案,不依赖仅支持Windows的第三方扩展,可直接在YAML Pipeline中配置使用:
前置准备
- 给Pipeline运行使用的服务账号配置仓库的「贡献者」权限,开放PR创建、合并的操作权限
- 在Pipeline的代理作业设置中开启「允许脚本访问OAuth令牌」选项,或提前创建权限范围为
Code (读写)的个人访问令牌(PAT)备用
Pipeline核心配置示例
trigger: - release/* # 匹配你的release分支规则 stages: # 前置构建、UAT部署阶段(此处省略你的现有逻辑) - stage: DeployUAT jobs: - job: DeployUATJob steps: # 你的现有UAT部署步骤 - script: echo "UAT部署完成" displayName: UAT部署 # PR创建及合并等待阶段 - stage: HandlePR dependsOn: DeployUAT condition: succeeded() jobs: - job: CreateAndMergePR steps: - pwsh: | # 配置参数 $orgUrl = "$(System.TeamFoundationCollectionUri)" $projectName = "$(System.TeamProject)" $repoName = "$(Build.Repository.Name)" $sourceBranch = "$(Build.SourceBranch)" $targetBranch = "refs/heads/master" $prTitle = "Auto PR: Merge $(Build.SourceBranchName) to master" $accessToken = $env:SYSTEM_ACCESSTOKEN # 1. 创建PR $createPrUrl = "$orgUrl$projectName/_apis/git/repositories/$repoName/pullrequests?api-version=7.1-preview.1" $prBody = @{ sourceRefName = $sourceBranch targetRefName = $targetBranch title = $prTitle description = "自动创建的PR,UAT验证已通过" } | ConvertTo-Json $prResponse = Invoke-RestMethod -Uri $createPrUrl -Method Post -Body $prBody -ContentType "application/json" -Headers @{Authorization = "Bearer $accessToken"} $prId = $prResponse.pullRequestId Write-Host "PR已创建,ID: $prId" # 2. 校验是否有合并冲突,无冲突则设置自动完成 if ($prResponse.mergeStatus -eq "succeeded") { $autoCompleteUrl = "$orgUrl$projectName/_apis/git/repositories/$repoName/pullrequests/$prId?api-version=7.1-preview.1" $autoCompleteBody = @{ autoCompleteSetBy = @{id = $prResponse.createdBy.id} completionOptions = @{ deleteSourceBranch = $false # 不需要删除源分支可设为false mergeStrategy = "noFastForward" transitionWorkItems = $false } } | ConvertTo-Json Invoke-RestMethod -Uri $autoCompleteUrl -Method Patch -Body $autoCompleteBody -ContentType "application/json" -Headers @{Authorization = "Bearer $accessToken"} Write-Host "PR无冲突,已设置自动完成" } else { Write-Error "PR存在合并冲突,请手动处理后再继续" exit 1 } # 3. 轮询等待PR合并完成 do { Start-Sleep -Seconds 10 $getPrUrl = "$orgUrl$projectName/_apis/git/repositories/$repoName/pullrequests/$prId?api-version=7.1-preview.1" $prStatus = Invoke-RestMethod -Uri $getPrUrl -Headers @{Authorization = "Bearer $accessToken"} Write-Host "当前PR状态: $($prStatus.status)" } while ($prStatus.status -ne "completed") if ($prStatus.mergeResult -ne "succeeded") { Write-Error "PR合并失败,请手动排查" exit 1 } Write-Host "PR已成功合并到master" env: SYSTEM_ACCESSTOKEN: $(System.AccessToken) displayName: 创建并等待PR合并 # 生产环境部署阶段,仅PR合并成功后运行 - stage: DeployPROD dependsOn: HandlePR condition: succeeded() jobs: - job: DeployPRODJob steps: # 你的现有PROD部署步骤 - script: echo "开始部署PROD环境" displayName: PROD部署
可选调整项
- 若需要保留人工审核PR的流程,删除脚本中设置自动完成的逻辑即可,Pipeline会一直等待PR手动合并完成后再进入生产部署阶段
- 可根据需要调整合并策略、是否自动删除源release分支、PR通知规则等配置
- 若内置OAuth令牌权限不足,将脚本中的
$env:SYSTEM_ACCESSTOKEN替换为你提前创建的PAT变量即可
内容的提问来源于stack exchange,提问作者Shrijit Narkar
相关产品推荐
相关产品推荐

