[英]How to deploy to different environment depending on the branch in Azure DevOps?
我想在 Azure DevOps 中实现以下管道:
Build
阶段Dev
Preprod
和Prod
的 3 个部署阶段,将前一阶段构建的工件部署到各自的环境中我可以使用 Azure DevOps 多级管道和分支名称上的conditions
来做到这一点。 但是,当我首先推送到dev
分支并且它构建成功,然后我推送说preprod
分支作为Fast-forward时,我希望管道能够重用在dev
分支中运行的Build
阶段已经构建的工件,因为这些是相同的提交。
我在 DevOps 中观察到的是,即使对于相同的提交,当我推送到每个不同的分支时, Build
阶段也会重新运行。 是否可以使用基于 YAML 的管道来实现我想要做的事情?
编辑
这个工作流程的重点不是分支,而是分阶段部署,从持续部署最新和最伟大的开发提交到为我们的 500 多个内部用户推出生产就绪软件。 我想要实现的是一种称为构建提升的东西,其中一个相同的构建工件被提升到越来越大的用户圈子。 我很乐意在不摆弄 git 分支的情况下实现这一目标。
这应该是一个评论(因为它更多的是想法,而不是一个真正的工作解决方案)而不是答案,但我担心我会扩大限制。
在我看来这是不可能的,但让我详细解释一下。 因为您实际需要的是提交流的管道 controller。 您需要的是基于某个分支中提交的外观的门/批准。 这种认可是可能的。
想象一下,您向Dev
分支提交了一个提交。 您的管道开始,部署到Dev
环境完成,而不是Preprod
的时间,但在此之前,通过调用 Azure Function 进行批准。 您将传递此标头
{
"Content-Type":"application/json",
"PlanUrl": "$(system.CollectionUri)",
"ProjectId": "$(system.TeamProjectId)",
"HubName": "$(system.HostType)",
"PlanId": "$(system.PlanId)",
"JobId": "$(system.JobId)",
"TimelineId": "$(system.TimelineId)",
"TaskInstanceId": "$(system.TaskInstanceId)",
"AuthToken": "$(system.AccessToken)",
"BuildId":"$(Build.BuildId)",
"StageName":"$(System.StageName)"
}
在 Azure Function 中,您将获得构建 ID 和阶段名称。 使用 build id,您可以调用 REST API 来获取更改并检查它们是否已经在stageName
分支中(在这种情况下它是Preprod
。由于它们不存在,因此阶段将失败。
将此提交移至PreProd
分支后,您应该触发先前失败的构建以再次检查条件并获取已创建的工件。 您可能需要使用某种 web 钩子,更糟糕的是,目前这是不可能的。 您无法触发特定阶段(请查看文档)。 您可以尝试使用失败的阶段进行构建并再次将它们排队,但在这种情况下,您将再次部署到Dev
。
所以你看到这是非常难以实现的。 但也许有人会有更好的主意。
是否可以使用基于 YAML 的管道来实现我想要做的事情?
同意 Krzysztof Madej 的观点,我认为使用基于 YAML 的管道实现您的要求并非不可能。
为了实现它,我们必须确保Preprod
分支上的每个提交都与dev
分支上的每个提交相同,然后我们才能使用分支名称上的条件来跳过构建阶段
stages:
-stage: Build
displayName: Build
and(succeeded(), eq(variables['CommitBranchName'], 'refs/heads/dev'))
然后我们可以通过 git 命令git branch --contains 获取 CommitBranchName CommitBranchName
但是,我们不能保证每个分支都与 dev 提交相同,azure devops 无法确定这两个提交是否相同。 触发构建的事件是提交,而不是提交的内容。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.