我有一个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.
...
如何跳过一个阶段,而不跳过下一个阶段?
答案 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.
...
我进行了测试,并且可以正常工作,请查看下面的屏幕截图。
答案 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
部分中。