ci: 瞬态故障自动重试——runner 故障时自动 re-run,无需人工干预 #1572
Reference in New Issue
Block a user
Delete Branch "ci/transient-fault-auto-retry"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
背景
run 43170 的 Frontend Lint job 在 runner-8 上 "Set up job" 阶段卡死 10m18s 超时失败(runner-8 有问题),但同一 run 其他 15 个 job 全正常。这种瞬态故障没有自动重试,白白浪费一次 CI run。
方案
ci_transient_retry.sh
独立监控脚本,每 5 分钟扫描最近 30 分钟内的 completed runs:
检测逻辑(只重试 runner 环境问题,不重试代码问题):
安全措施:
--dry-run模式方便调试/var/log/ci-auto-retry.log部署
ci_transient_retry.service+.timer*/5 * * * *不改动的
验证
dry-run 测试通过:正确识别纯代码失败(AI Code Review failure)为"非瞬态",未触发重试。
问题: 当 runner 出现瞬态故障(磁盘满/docker挂/网络抖动),分配到该 runner 的 job 会在 checkout/setup 阶段失败。这种失败与代码无关,但没有自动 重试机制,需要人工干预。 方案: ci_transient_retry.sh - 每 5 分钟扫描最近 30 分钟的 runs: - 检测特征:失败 job 的 checkout/setup 阶段失败 + 同 run 其他 job 成功 - 自动 re-run 整个 workflow(Gitea API /rerun) - 每个 run 最多重试 1 次(状态文件跟踪,24h 自动清理) - 支持 --dry-run 模式 - 日志记录到 /var/log/ci-auto-retry.log 判定逻辑: - 失败 job 第一个 step 是 checkout/setup 且 conclusion=failure → 瞬态 - 同一 run 至少 2 个 job 成功(排除代码全挂) - 纯代码失败(lint/test/compile)→ 不重试 部署: - systemd timer: ci_transient_retry.{service,timer} - 或 crontab: */5 * * * * - Token 通过环境变量 / EnvironmentFile 注入,不硬编码🚀 预览环境已部署
代码审查结果 - PR #1572
⚠️ 问题(2个需要修改)
curl命令通过环境变量传递 Token,导致 Token 可能出现在进程列表(如ps、/proc/<pid>/cmdline)中,被同服务器其他用户窃取。💡 建议(1个可选)
trap命令清理临时目录时未检查变量是否存在,若mktemp失败导致$TMPDIR_WORK为空,rm -rf可能报错或行为异常。建议改为:trap '[ -n "$TMPDIR_WORK" ] && rm -rf "$TMPDIR_WORK"' EXIT。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ❌ 安全审查需修改
🤖 由 AI 代码审查机器人自动生成 | 2026-08-31 07:07:55 | 模型:
🗑️ 预览环境已清理
PR #1572 已关闭或合并,对应的预览环境已被清理。