如何在Azure Pipelines中设置阶段依赖任意两个前置阶段之一的成功执行?
流水线阶段依赖任意前置阶段成功的实现方案
默认dependsOn属性的逻辑为所有依赖的前置阶段全部成功后才会触发后续阶段,如果需要实现两个互斥前置阶段任意一个成功就触发后续阶段,可以按照以下方案操作:
通用实现方案(适配所有CI/CD平台)
- 先给两个互斥前置阶段各加一个成功后设置全局标记变量的逻辑:
- 前置阶段1成功后,设置全局变量
STAGE_1_FINISH = "true" - 前置阶段2成功后,设置全局变量
STAGE_2_FINISH = "true"
- 前置阶段1成功后,设置全局变量
- 配置后续阶段的依赖规则:
dependsOn同时填入两个前置阶段,同时给两个前置阶段都开启allow_failure: true,避免其中一个失败直接阻塞后续阶段运行- 给后续阶段添加执行条件:仅当
STAGE_1_FINISH == "true"或STAGE_2_FINISH == "true"时才执行该阶段的实际业务逻辑,不满足条件则直接跳过
主流平台原生语法简化方案
GitHub Actions
直接给后续阶段配置如下规则即可:
needs: [job1, job2] if: ${{ always() && (needs.job1.result == 'success' || needs.job2.result == 'success') }}
GitLab CI(14.3及以上版本)
配置如下规则即可:
needs: - job: job1 allow_failure: true - job: job2 allow_failure: true rules: - if: '$CI_JOB_STATUS == "success" && ($JOB1_SUCCESS == "true" || $JOB2_SUCCESS == "true")'
Jenkins
在声明式流水线中使用parallel块配合变量标记即可:
pipeline { stages { stage('并行前置阶段') { parallel { stage('前置1') { steps { script { // 业务逻辑 env.STAGE1_SUCCESS = "true" } } } stage('前置2') { steps { script { // 业务逻辑 env.STAGE2_SUCCESS = "true" } } } } } stage('后续执行阶段') { when { expression { return env.STAGE1_SUCCESS == "true" || env.STAGE2_SUCCESS == "true" } } steps { // 后续业务逻辑 } } } }
注意:如果两个前置阶段是完全互斥的,同一运行周期内只会有一个被触发执行,可以省略变量标记步骤,直接在后续阶段的执行条件中判断两个前置阶段的执行结果即可。
内容的提问来源于stack exchange,提问作者lpacheco
相关产品推荐
相关产品推荐

