Azure多阶段管道:有条件地跳过一个阶段,但不跳过下一个阶段

时间:2020-02-14 00:35:40

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

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

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

我不能。无论我尝试什么,如果跳过Test,那么也会跳过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.
    ...

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

What I get vs what I want

3 个答案:

答案 0 :(得分:5)

您可以使用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.
    ...

我进行了测试,并且可以正常工作,请查看下面的屏幕截图。

enter image description here

答案 1 :(得分:1)

我在寻找类似的信息,发现可以对依赖项结果执行“ IN”子句。在关于表达式的Microsoft Docs中发现了这一点

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

答案 2 :(得分:0)

我认为是因为该阶段没有运行,所以它没有获得状态(例如,成功,失败,已取消等)。 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名称添加到dependencies阶段的UAT部分中。