GitLab CI如何实现特定任务任一失败时触发回滚任务?
GitLab CI:实现指定任务任一失败时触发回滚
问题原因
你当前配置的rollback-on-finish使用了needs: ["Deploy", "Test"],GitLab CI对needs的要求是:所有指定的任务必须处于完成状态(成功/失败均可),才会触发当前任务。但你的流水线是Build -> Deploy -> Test的依赖关系,当Deploy失败时,Test会被自动跳过(状态为skipped,不属于完成状态),因此needs的条件不满足,导致rollback-on-finish无法运行。
解决方案
方案1:使用内置失败任务变量(GitLab 14.0+推荐)
GitLab 14.0及以上版本提供了failed_jobs.names内置变量,可直接获取所有失败任务的名称列表,通过该变量判断是否需要触发回滚:
rollback-on-finish: script: - # 填写你的回滚执行脚本 rules: - if: 'contains(failed_jobs.names, "Deploy") || contains(failed_jobs.names, "Test")' when: on_success # 若回滚需要Deploy阶段的产物,添加以下配置 # needs: ["Deploy"]
contains(failed_jobs.names, "任务名")用于检查指定任务是否在失败列表中when: on_success是因为规则已过滤出符合失败条件的场景,此时任务会正常执行- 保留
needs: ["Deploy"]可确保回滚任务能获取Deploy阶段的产物,不影响触发逻辑
方案2:拆分监听任务(兼容旧版本GitLab)
如果你的GitLab版本低于14.0,不支持failed_jobs变量,可以拆分出两个回滚任务,分别监听Deploy和Test的失败:
# 监听Deploy失败 rollback-on-deploy-fail: script: - # 填写你的回滚执行脚本 when: on_failure needs: ["Deploy"] # 监听Test失败 rollback-on-test-fail: script: - # 填写你的回滚执行脚本 when: on_failure needs: ["Test"]
rollback-on-deploy-fail仅在Deploy失败时触发,因为needs仅指定了Deployrollback-on-test-fail仅在Test失败时触发(此时Deploy已成功完成,needs条件满足)- 两个任务可通过
!reference复用同一段回滚脚本,避免代码重复
效果验证
Deploy失败:对应回滚任务自动执行Test失败:对应回滚任务自动执行Build失败:回滚任务不会触发,符合你的流水线设计
内容的提问来源于stack exchange,提问作者Mikhail_Sam
相关产品推荐
相关产品推荐

