You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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仅指定了Deploy
  • rollback-on-test-fail仅在Test失败时触发(此时Deploy已成功完成,needs条件满足)
  • 两个任务可通过!reference复用同一段回滚脚本,避免代码重复

效果验证

  • Deploy失败:对应回滚任务自动执行
  • Test失败:对应回滚任务自动执行
  • Build失败:回滚任务不会触发,符合你的流水线设计

内容的提问来源于stack exchange,提问作者Mikhail_Sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 22:06:22