首页/开发/CI/CD 与发布速查/失败重试策略(Retry)
流水线设计54 条

失败重试策略(Retry)

只对基础设施类抖动做有限重试:Runner 掉线、拉取超时等;业务失败不重试,避免掩盖缺陷。

CI/CD 与发布速查开发更新于 2026-10-13

重试策略是什么

失败重试策略只对基础设施类抖动做有限重试:Runner 掉线、网络拉取超时、资源临时不可用;业务失败(断言失败、编译错误)不重试,避免掩盖缺陷。重试上限一般 1-2 次并保留原始失败记录,否则一个作业最长耗时被放大数倍,还会把真实 bug 的发现时间往后拖。判断标准很简单:这个失败重跑一次有合理概率成功吗?否定或不确定时就不该重试。

基本信息

GitLabretry: max 次数 + when 条件(如 runner_system_failure、stuck_or_timeout_failure)
Jenkinsretry(n) 步骤包裹易抖动逻辑
原则重试上限 1-2 次,并保留原始失败记录
反模式对断言失败与编译错误重试:信号被掩盖

可重试与不可重试

失败类型处理
runner_system_failure、网络超时有限重试
stuck_or_timeout_failure有限重试,结合超时治理
断言失败、编译错误不重试,修代码
镜像拉取失败先查仓库与网络,必要时一次重试

典型使用场景

  • 长流水线稳定性:对易抖动的外部依赖步骤设置精确重试条件
  • 拉取作业:镜像与依赖下载超时按次重试
  • 云资源操作:对接云 API 的幂等操作重试
  • 区分信号:把「重试后成功」的作业单独统计,定位要根治的抖动源
  • 上限管理:重试次数纳入耗时预算,避免排队连锁
  • 重试可视化:把「重试后成功」的作业高亮统计,区分正常抖动与待根治问题
  • 与超时治理配合:超时值决定重试是否有意义,两处参数一起评估

GitLab retry 条件

GitLab retry 条件
test:
  retry:
    max: 2
    when:
      - runner_system_failure
      - stuck_or_timeout_failure
      - unknown_failure
对断言失败重试会制造不稳定信号:先修复用例或环境,再谈重试。
重试要幂等:部署、写库、发消息这类步骤必须可安全重复执行,否则重试会制造第二次故障。中间失败日志要保留,否则排障时只剩最后一次的记录。

易错点

  • 无条件重试全部作业:真实 bug 被重试遮住,回归发现时间被推迟
  • 重试次数过大:单个作业最长耗时被放大数倍,排队连锁
  • 重试掩盖环境退化:反复重试成功说明基础设施在劣化,纳入稳定性看板
  • 对非幂等步骤重试:重复扣款、重复通知这类事故源头,先改幂等再谈重试
  • 重试与告警不联动:重试期间静默,应在连续多次失败后升级通知

数据来源与参考

  • GitLab Docs《retry》
  • Jenkins Handbook《Pipeline Syntax》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌