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

Azure devops Azure多级管道:有条件地跳过一个阶段,但不跳过下一个阶段,azure-devops,continuous-integration,continuous-deployment,multistage-pipeline,Azure Devops,Continuous Integration,Continuous Deployment,Multistage Pipeline,我有一个Azure多级CI/CD管道。它有测试和UAT部署阶段 我希望UAT版本在测试成功或被跳过时运行,但在测试失败时不运行 我不能。无论我尝试什么,如果跳过测试,UAT也会被跳过。除非我使用总是(),但即使测试失败,UAT也会运行 ... - stage: Test condition: and(succeeded(), ne(variables['build.sourceBranchName'], 'DoUAT')) # Skip for UAT deployment te

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

我希望UAT版本在测试成功或被跳过时运行,但在测试失败时不运行

我不能。无论我尝试什么,如果跳过测试,UAT也会被跳过。除非我使用
总是()
,但即使测试失败,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.
    ...
如何跳过一个阶段而不跳过下一个阶段


我认为这是因为该阶段没有运行,所以它没有获得状态(例如成功、失败、取消等)。已跳过的
没有状态函数

因此,我认为您需要在
Test
之前的阶段上添加一个依赖项,以便进行此评估。假设该阶段称为
Build

我认为这种情况应该有效:(换行符仅用于可读性)

失败

  • 对于工作:
    • 如果没有参数,则仅当依赖关系图中的任何上一个作业失败时,才会计算为True
    • 将作业名称作为参数,仅当这些作业中的任何一个失败时,才计算为True
由于有了这些文档,我认为有必要添加
Test
参数来专门针对该阶段。但是,我不确定这是否需要将
Test
名称添加到
UAT
阶段的
dependencies
部分。

您可以使用
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.
    ...
我进行了测试,它成功了,请查看下面的屏幕截图


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

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

谢谢看起来这正是我想要的。结果证明这个解决方案比它需要的更复杂。not(失败(‘测试’)足以实现我想要的。对前一阶段的隐式依赖足以延迟UAT部署,直到跳过测试。将显式依赖项添加到前面的所有阶段会变得混乱,因为我实际上有五个阶段——而不仅仅是我的简化示例中的两个阶段。我认为您不需要将显式依赖项添加到所有阶段,只是为了
Test-1
,但是如果您发现这是不必要的,那就太好了。
- job: c
  dependsOn:
  - a
  - b
  condition: |
    and
    (
      in(dependencies.a.result, 'Succeeded', 'SucceededWithIssues', 'Skipped'),
      in(dependencies.b.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
    )