【问题标题】:Azure multistage pipelines: conditionally skip one stage but not the nextAzure 多阶段管道:有条件地跳过一个阶段,但不跳过下一个阶段
【发布时间】:2020-05-29 18:55:28
【问题描述】:

我有一个 Azure 多阶段 CI/CD 管道。它具有测试和 UAT 部署阶段。

如果测试成功或被跳过,我希望 UAT 版本运行,但如果失败则不运行。

我不能。无论我尝试什么,如果跳过测试,也会跳过 UAT。除非我使用always(),否则即使测试失败,UAT 也会运行。

  ...
  - stage: Test
    condition: and(succeeded(), ne(variables['build.sourceBranchName'], 'DoUAT')) # Skip for UAT deployment tests
    ...

  - stage: UAT
    condition: and(succeeded(), in(variables['build.sourceBranchName'], 'master', 'DoUAT')) # Only deploy off master branch and branch to test UAT deploys.
    ...

如何跳过一个阶段而不是下一个阶段?

【问题讨论】:

    标签: azure-devops continuous-integration continuous-deployment multistage-pipeline


    【解决方案1】:

    我正在寻找类似的信息,发现您可以对依赖结果执行“IN”子句。在Microsoft Docs about 表达式中找到了这个

    - job: c
      dependsOn:
      - a
      - b
      condition: |
        and
        (
          in(dependencies.a.result, 'Succeeded', 'SucceededWithIssues', 'Skipped'),
          in(dependencies.b.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
        )
    

    【讨论】:

      【解决方案2】:

      您可以使用not(failed('Test'))条件,请尝试以下条件。

      - stage: UAT
          condition: and(not(failed('Test')), in(variables['build.sourceBranchName'], 'master', DoUAT')) # Only deploy off master branch and branch to test UAT deploys.
          ...
      

      我测试过,效果不错,看看下面的截图。

      【讨论】:

      • 谢谢;看起来这正在做我想做的事。
      【解决方案3】:

      我认为这是因为阶段没有运行,它没有获得状态(例如成功、失败、取消等)。 skipped没有状态功能。

      这样,我认为您需要在Test 之前添加对舞台的依赖项,以便可以进行此评估。假设该阶段称为Build

      我认为这种情况应该可以工作:(换行仅是为了便于阅读)

      # run the stage if build is successful 
      # and test succeeded or skipped 
      # AND the branch is correct
      and(
        and(succeeded('Build'), not(failed('Test'))), 
        in(variables['build.sourceBranchName'], 'master', 'DoUAT')
      )
      

      失败

      • 对于工作:
        • 不带参数,仅当依赖关系图中的任何以前的作业失败时才评估为 True。
        • 以作业名称作为参数,仅当任何这些作业失败时评估为True。

      由于这个文档,我认为有必要添加Test 参数来专门针对该阶段。但是,我不确定这是否需要将 Test 名称添加到 UAT 阶段的 dependencies 部分。

      【讨论】:

      • 原来这个解决方案比它需要的更复杂。 not(failed('Test')) 足以实现我想要的。对前面阶段的隐式依赖足以延迟 UAT 部署,直到跳过测试。将显式依赖项添加到前面的所有阶段会变得很混乱,因为我实际上有五个阶段——而不仅仅是我缩减示例中的两个阶段。
      • 我认为您不需要向所有人添加显式依赖项,只需添加到 Test -1,但如果您发现这无论如何都没有必要,那就太好了。
      猜你喜欢
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 2019-03-03
      相关资源
      最近更新 更多