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

EdH*_*EdH 4 continuous-integration continuous-deployment azure-devops multistage-pipeline

我有一个 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.
    ...
Run Code Online (Sandbox Code Playgroud)

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

我得到的 vs 我想要的

Tul*_*lly 18

归功于https://github.com/MicrosoftDocs/azure-devops-docs/issues/7738#issuecomment-611815486

@EdH

condition: not(or(failed(), canceled()))
Run Code Online (Sandbox Code Playgroud)

可与多个先前阶段配合使用,并按您的需要工作。succeeded如果之前的所有阶段都是or ,则运行该阶段skipped,但如果它们都是failedor则不运行cancelled

在此输入图像描述

笔记:

  • 跳过不会导致 failed() 或 cancelled() 为 true。
  • 跳过确实会导致 successed() 为 false。


Lev*_*SFT 8

您可以使用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.
    ...
Run Code Online (Sandbox Code Playgroud)

我测试过并且有效,请查看下面的屏幕截图。

在此处输入图片说明


Jes*_*dll 6

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

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