首页 > 解决方案 > 您如何以编程方式提出条件 PR?

问题描述

我们目前有以下分支策略:

开发 > 发布 > 大师

开发人员从开发创建本地分支,将更改合并到开发。我们的开发环境建立在该分支之上。当他们想要测试他们的更改时,他们会推送到 QA 环境,该环境也使用 Develop 分支。这个循环一直持续到迭代的功能测试完成。此时,代码将合并到 Release 分支中,并通过 staging 部署,然后部署到 prod。部署到 prod 后,代码应该合并到 Master,但它经常被遗忘。这会导致利基场景中的问题。

有没有办法使用 devops 管道有条件地自动提高 PR?所以我认为这需要 2 个 PR:

  1. 成功发布到产品后,为 Master 分支提出 PR。这里的想法是一旦获得批准,团队中的某个人就可以批准。
  2. 如果第一个 PR 获得批准并且Master 中的代码现在与 Develop 不同,则为 Develop 分支提出PR。在很多情况下,它不会因此不需要 PR。

我一直在搜索这个并找到了这样的 api 方法但我看不出你如何将它放入管道中并使其成为有条件的。

附加信息:

我的理解是构建定义需要知道根据下图构建哪个分支。因此,每个 sprint 创建一个新的发布分支要么导致每次都必须更新构建定义,要么创建一个新的构建定义,在大多数情况下,这基本上是一个完整的副本,除了分支名称。除非我误解了,我认为我是。

在此处输入图像描述

标签: azure-devops

解决方案


以下 PowerShell 示例创建从 master 到某个目标分支的拉取请求作为构建任务。您可以通过一个 PowerShell 任务将其作为附加阶段“创建 PR 到某个分支”添加到您的版本中。此外,您可以创建定期构建以检查差异并创建拉取请求。

$user = ""
$token = "$(System.AccessToken)"
$branchTarget = "$(Build.SourceBranch)"
$branchSource = "refs/heads/master"
$branchTragetPath = $branchTarget -replace "refs/heads/", ""
$teamProject = "$(System.TeamProject)"
$repoName = "$(Build.Repository.Name)"
$orgUrl = "$(System.CollectionUri)"

$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))
 
$uriBranchStatus = "$orgUrl/$teamProject/_apis/git/repositories/$repoName/stats/branches?name=$branchTragetPath&api-version=5.1"
$uriCheckActivePR = "$orgUrl/$teamProject/_apis/git/repositories/$repoName/pullrequests?searchCriteria.targetRefName=$branchTarget&searchCriteria.sourceRefName=$branchSource&api-version=5.1"
$uriCreatePR = "$orgUrl/$teamProject/_apis/git/repositories/$repoName/pullrequests?api-version=5.1"

$resultStatus = Invoke-RestMethod -Uri $uriBranchStatus -Method Get -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

if ($resultStatus.behindCount -eq 0)
{
    Write-Host "Current branch contains last changes from master"
    Return
}

$resultActivePR = Invoke-RestMethod -Uri $uriCheckActivePR -Method Get -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

if ($resultActivePR.count -gt 0) 
{
    Write-Host "PR exists already"
    Return
}

$bodyCreatePR = "{sourceRefName:'$branchSource',targetRefName:'$branchTarget',title:'Sync changes from $branchSource'}"

$result = Invoke-RestMethod -Uri $uriCreatePR -Method Post -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Body $bodyCreatePR

Write-Host "Created PR" $result.pullRequestId

推荐阅读