多环境GitLab Pipeline如何配置Rollback Job仅在对应Test Job失败时执行
GitLab Pipeline 按环境匹配触发Rollback Job配置方案
核心实现逻辑
要实现仅对应环境Test Job失败时才触发该环境Rollback Job的需求,核心是切断Rollback Job和其他非关联Job的状态联动:
- 每个Rollback Job通过
needs关键字明确绑定仅对应环境的Test Job,完全隔离其他环境、其他阶段Job的状态影响 - 配置触发规则仅在绑定的Test Job失败时执行,其余场景全部跳过
完整示例配置
stages: - Build - Deploy - Test - Rollback # 环境A任务链 Job-1-Build-A: stage: Build script: - echo "构建环境A业务镜像" Job-2-Deploy-A: stage: Deploy needs: ["Job-1-Build-A"] script: - echo "部署镜像到环境A独立VM" Job-3-Test-A: stage: Test needs: ["Job-2-Deploy-A"] script: - echo "执行环境A功能、接口测试" Job-4-Rollback-A: stage: Rollback # 仅绑定环境A的Test Job,和其他所有Job无依赖关系 needs: ["Job-3-Test-A"] script: - echo "回滚环境A到上一个稳定部署版本" rules: # 仅当绑定的Job-3-Test-A失败时触发 - if: $CI_JOB_STATUS == 'failed' && $CI_NEEDS_JOB_NAME == 'Job-3-Test-A' when: on_failure # 其余所有场景都不执行 - when: never # 环境B任务链 Job-1-Build-B: stage: Build script: - echo "构建环境B业务镜像" Job-2-Deploy-B: stage: Deploy needs: ["Job-1-Build-B"] script: - echo "部署镜像到环境B独立VM" Job-3-Test-B: stage: Test needs: ["Job-2-Deploy-B"] script: - echo "执行环境B功能、接口测试" Job-4-Rollback-B: stage: Rollback needs: ["Job-3-Test-B"] script: - echo "回滚环境B到上一个稳定部署版本" rules: - if: $CI_JOB_STATUS == 'failed' && $CI_NEEDS_JOB_NAME == 'Job-3-Test-B' when: on_failure - when: never
注意事项
如果你使用的GitLab版本低于14.3,不支持
CI_NEEDS_JOB_NAME内置变量,可直接简化Rollback Job配置:因为needs已经限定了当前Job的唯一依赖是对应环境的Test Job,只要Test Job没有进入失败状态(包括Test未执行、Test成功、其他Job失败),when: on_failure都不会触发当前Rollback Job,直接去掉rules块,仅保留when: on_failure即可满足需求。
内容的提问来源于stack exchange,提问作者leobip
相关产品推荐
相关产品推荐

