在Azure DevOps发布管道中控制作业顺序。

7
我有一个涉及多个部署组的复杂发布计划,我计划使用第三方 vsts-git-release-tag 扩展来为发布打标签。理想情况下,在为仓库打标签之前,整个发布(所有作业)都应该先成功完成。
因此,我正在尝试找出实现这一目标的最佳方法。如果这是一个构建流程而不是发布流程,那么很明显我可以使用 dependsOn 来安排它们。
jobs:
- job: Deployment_Group_1
  steps:
  - script: echo hello from Deployment Group 1
- job: Deployment_Group_2
  steps:
  - script: echo hello from Deployment Group 2
- job: Tag_Repo
  steps:
  - script: echo this is where I would tag the Repo
  dependsOn:
  - Deployment_Group_1
  - Deployment_Group_2

然而,在发布管道中似乎没有与此文档中指定的等效功能相对应(至少目前是这样)。

注意

目前仅支持在构建管道中同时运行多个作业。尚不支持在发布管道中运行。

虽然它没有特别提到dependsOn 功能,但是在发布管道中似乎没有可以利用它的方法(如果我错了,请纠正我)。

我意识到我可能可以创建一个单独的阶段,其中包含一个作业和任务来创建 Git 标签,但那感觉像是一个 hack。 有没有更好的方法在所有其他发布作业完成后运行特定的发布作业?


看起来是一个重复的问题 https://dev59.com/3Irda4cB1Zd3GeqPLVoO?r=SearchResults&s=2|55.0695 - Klaus Heinrich
3
@KlausHeinrich - 这个链接的问题是关于谷歌云引擎的,而这个问题是关于Azure管道的。为什么会是重复的问题?请解释一下。 - NightOwl888
4个回答

7

只是一个建议:您可以利用m多阶段流水线,这些阶段也在Azure Devops Ui中非常清晰地表示出来。

阶段有作业,作业有步骤: enter image description here

此示例管道的yml:

trigger:
  batch: true
  branches:
    include:
      - "*"


resources:
  containers:
    - container: ubuntu
      image: ubuntu:18.04

stages:
  - stage: STAGE1
    jobs:
     - job: PrintInfoStage1Job1
       container: ubuntu
       steps:
          - script: |
              echo "THIS IS STAGE 1, JOB 1"
            displayName: "JOB 1"
     - job: PrintInfoStage1Job2
       dependsOn: PrintInfoStage1Job1
       container: ubuntu
       steps:
          - script: |
              echo "THIS IS STAGE 1, JOB 2"
            displayName: "JOB 2"

  - stage: STAGE2
    dependsOn: STAGE1
    jobs:
      - job: PrintInfoStage2Job1
        dependsOn: []
        container: ubuntu
        steps:
          - script: |
               echo "THIS IS THE STAGE 2, JOB 1"
            displayName: "JOB 1"

      - job: PrintInfoStage2Job2
        container: ubuntu
        dependsOn: []
        steps:
          - script: |
               echo "THIS IS THE STAGE 2, JOB 2"
            displayName: "JOB 2"

请确保在用户设置中开启此预览功能,不要错过开关。


阶段仅在构建流水线中受支持。此问题专门涉及发布流水线,目前不支持 YAML 配置。 - NightOwl888
你现在实际上不需要再使用发布管道了。如果需要部署的批准,你可以通过部署作业和与环境的绑定来实现,或者通过强制安全变量或文件的批准来实现。 - chris polzer
这对我们来说不可行,因为我们有一些手动干预任务在构建流程中得不到支持。其中一个任务必须等待72小时投票才能发布,另一个任务是手动部署遗留系统的数据库,由于各种非技术原因,它尚未实现自动化。 - NightOwl888
请在您的回答中包含使用“安全变量或文件上的批准”的示例。如果这些确实是手动批准发布管道的可行替代方案,那么展示一下将会很好。 - NightOwl888
你好,为审批添加示例并不是可行的。基于变量,在Azure DevOps中定义了一个变量组。在你的变量组之上有一个审批选项卡。打开的对话框是自说明的。另一种方法是使用部署作业,其中“环境”参数的字符串内容将在Azure DevOps菜单中创建一个“环境”。这就是你根据环境定义你的批准的地方。(部署工作文档链接:https://learn.microsoft.com/en-us/azure/devops/pipelines/process/deployment-jobs?view=azure-devops) - chris polzer

5

在创建一个测试项目并为其添加多个作业到发布管道后,连续运行几次后,作业的顺序似乎是确定的。也就是说,它们总是以它们在门户中实际出现的顺序运行。

我进行了几次谷歌搜索,但这种行为似乎没有任何文档记录。因此,我不确定它是否得到保证。但它很可能适用于我的情况。

如果有任何官方来源确认作业顺序被保证,请留下评论。


1
你可以使用 dependsOn 在 Azure DevOps 中按顺序运行作业。 - volody
@volody 您的评论应该是答案。实际上,我的作业没有按照它们在 yaml 文件中创建的顺序执行,“dependsOn”是我所需要的。 - Abdelhakim
@Abdelhakim - 不行。据我所知,在发布管道中没有办法指定dependsOn,这就是问题所在。这与构建管道无关,似乎每个人都包含了一个答案。发布管道不能通过YAML进行配置,因此这些答案都不相关。 - NightOwl888
我认为,通过我的上面关于部署作业、环境和批准的回答,一切所需的都应该可以得到满足,以摆脱那些 UI 点击、难以管理的发布流程?我必须说这是非常好的问题和讨论! - chris polzer
关于“dependson”:只要您没有定义它,一切都会自动依赖于其前任。我通过使用具有输出变量的动态阶段学到了这一点,但这些变量对于后继阶段中动态创建的变量是不可用的,这让我吃了苦头。 - chris polzer

3

从指定的示例来看,您不需要为每个步骤创建不同的作业。每个任务都可以添加到一个单独的作业中。

jobs:
- job: 
  steps:
  - script: echo hello from Deployment Group 1
  - script: echo hello from Deployment Group 2
  - script: echo this is where I would tag the Repo

如果需要,您也可以在代码中删除"Jobs > Job"。

我曾经遇到类似的问题,我的作业没有按照定义的顺序执行。此外,我在引用其他作业模板时认为每个模板都必须是一个新的作业。后来,我成功地将我的作业分解成了任务。

需要注意以下几点:

  • 作业在单独的代理上运行。如果您只想执行一系列脚本,则可能不需要这样做。作业实际上包含步骤,即一组任务。
  • 步骤中的任务会逐个执行,因此您无需明确提供顺序。

2
您可以使用条件语句:
jobs:
- job: Deployment_Group_1
  steps:
  - script: echo hello from Deployment Group 1
- job: Deployment_Group_2
  dependsOn: Deployment_Group_1
  condition: succeeded()
  steps:
  - script: echo hello from Deployment Group 2
- job: Tag_Repo
  steps:
  - script: echo this is where I would tag the Repo
  dependsOn:
  - Deployment_Group_1
  - Deployment_Group_2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接