azure-devops - 您如何以编程方式提出条件 PR?
问题描述
我们目前有以下分支策略:
开发 > 发布 > 大师
开发人员从开发创建本地分支,将更改合并到开发。我们的开发环境建立在该分支之上。当他们想要测试他们的更改时,他们会推送到 QA 环境,该环境也使用 Develop 分支。这个循环一直持续到迭代的功能测试完成。此时,代码将合并到 Release 分支中,并通过 staging 部署,然后部署到 prod。部署到 prod 后,代码应该合并到 Master,但它经常被遗忘。这会导致利基场景中的问题。
有没有办法使用 devops 管道有条件地自动提高 PR?所以我认为这需要 2 个 PR:
- 成功发布到产品后,为 Master 分支提出 PR。这里的想法是一旦获得批准,团队中的某个人就可以批准。
- 如果第一个 PR 获得批准并且Master 中的代码现在与 Develop 不同,则为 Develop 分支提出PR。在很多情况下,它不会因此不需要 PR。
我一直在搜索这个并找到了这样的 api 方法,但我看不出你如何将它放入管道中并使其成为有条件的。
附加信息:
我的理解是构建定义需要知道根据下图构建哪个分支。因此,每个 sprint 创建一个新的发布分支要么导致每次都必须更新构建定义,要么创建一个新的构建定义,在大多数情况下,这基本上是一个完整的副本,除了分支名称。除非我误解了,我认为我是。
解决方案
以下 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
推荐阅读
- xamarin - 为什么地理定位得到错误的时间戳 - Xamarin
- java - 将 sql 查询结果映射到 DTO 对象(具有内部列表)
- ruby-on-rails - 你能从 ActiveStorage 中删除一个变体吗?
- python - How >> operator defines task dependencies in Airflow?
- python - Seaborn 联合图——改变两个边际图的带宽
- java - apache骆驼中的类型转换
- mysql - 在 MSSqlServer 和 MySQL 之间自动更改数据
- ssis - 如何使用 SSIS 包拆分表数据单独名称 Excel 文件?
- email - Delphi/Indy 10 - 发送带有附件的文本或 HTML 电子邮件会为文本(正文)本身添加一个附件
- jquery - 使用Jquery提交表单而不刷新页面不起作用