如何根据Azure DevOps中的分支部署到不同的环境



我希望在Azure DevOps中实现以下管道:

  • 构建主工件的一个Build阶段
  • DevPreprodProd的3个部署阶段,它们将把前一阶段中构建的工件部署到各自的环境中

我可以使用Azure DevOps多阶段管道和分支名称上的conditions来实现这一点。然而,当我首先推送到dev分支并成功构建时,然后将preprod分支推送为快进时,我希望管道重用在dev分支中运行的Build阶段中已经构建的工件,因为这些都是相同的提交。

我在DevOps中观察到的是,即使对于相同的提交,当我推送到每个不同的分支时,Build阶段也会重新运行。使用基于YAML的管道有可能实现我想要做的事情吗?

编辑

这个工作流程的重点不是分支,而是分阶段部署,从持续部署最新和最优秀的开发人员,到为我们500多名内部用户推出可用于生产的软件。我试图实现的是一种名为构建推广的功能,在这个功能中,同一个构建工件被推广到越来越多的用户中。我很乐意在不摆弄git分支的情况下实现这一目标。

这应该是一个评论(因为这更像是一个想法,而不是一个真正可行的解决方案(,而不是答案,但我担心我会扩大限制。

在我看来,这是不可能的,但让我详细解释一下。因为您实际需要的是一个通过提交流的管道控制器。您需要的是根据某个分支中提交的外观进行审核。这种批准是可能的。

假设您对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。由于它们不在那里,stage将失败。

一旦您将这个提交移动到PreProd分支,您就应该触发以前失败的构建来再次检查条件,并拾取已经创建的工件。你可能需要使用某种网络挂钩,更糟糕的是,这在目前是不可能的。您无法触发特定阶段(请查看文档(。您可以尝试使用失败的阶段进行构建,并再次对它们进行排队,但在这种情况下,您将再次部署到Dev

所以你看,要做到这一点是非常困难的。但也许有人会想出更好的主意。

是否可以使用基于YAML的管道来实现我想要做的事情?

同意Krzysztof Madej的意见,我认为使用基于YAML的管道不可能实现您的请求。

为了实现这一点,我们必须确保Preprod分支上的每一次提交都与dev分支上的每次提交相同,然后才能使用分支名称上的条件跳过构建阶段

stages:
-stage: Build
displayName: Build
and(succeeded(), eq(variables['CommitBranchName'], 'refs/heads/dev'))

然后我们可以通过git命令gitbranch--contains获得CommitBranchName

但是,我们不能保证每个分支都与dev提交相同,azure devops也不能确定这两个提交是否相同。触发生成的事件是提交,而不是提交的内容。

希望这能有所帮助。

最新更新