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

能否通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 11:36:00