【问题标题】:How can you programmatically raise a conditional PR?您如何以编程方式提出条件 PR?
【发布时间】:2020-09-11 10:41:47
【问题描述】:

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

开发 > 发布 > 大师

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

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

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

我一直在谷歌上搜索并找到了 api 方法 like this 但我看不出你如何将它放入管道中并使其成为条件。

其他信息:

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

【问题讨论】:

  • 你为什么不做其他人都做的理智的事情:在发布完成后将release合并回master
  • @IanKemp - 我希望它值得信任,但我们有多个团队,有时会错过它。这最终导致需要通过发布分支发布修补程序的复杂情况,而计划中的更改已经在发布分支中。在这种情况下,应该能够从 Master 中获取副本,但由于它没有被合并,因此无法完成。
  • 等等,你只有一个 single 永生的release 分支吗?这违背了整个目的。在每个新的 sprint 开始时从 master 创建一个新的 release-<version> 分支(即它将包含前一个 sprint 的工作),将在 sprint 期间出现的任何需要用于该版本的修补程序放在那里,并且在冲刺结束时将其合并回master - 然后清洗,冲洗,重复。您可以轻松地编写 start-new-sprint 来自动执行此操作。
  • 我想说的是,这个问题看起来像是一个 X-Y 问题:你遇到了人们忘记合并代码的问题,你正试图找到一个自动化的解决方案来提醒他们去做所以。这样的解决方案将不简单,易碎,并且需要维护。根据经验,您的真正问题似乎是一个复杂的分支策略,它允许事情从裂缝中消失,和/或开发人员缺乏合并纪律。这些是完全不同的问题,试图用代码解决它们是子弹伤口上的创可贴。
  • @sr28 您不需要对构建定义进行任何更新。在哪个分支上运行不是构建定义的一部分,而只是它的运行时资源。您可以参考这个 REST API Runs - Run Pipeline。您可以使用参数resources 指定管道将在哪个分支上运行而不更新管道。

标签: azure-devops


【解决方案1】:

以下 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

【讨论】:

    猜你喜欢
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    相关资源
    最近更新 更多