fix(ci): 僵尸run复活防护——重负载job自检+dedupe竞态增强 [P1] #1562
Reference in New Issue
Block a user
Delete Branch "ci/selfcheck-zombie-run-and-dedupe"
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?
背景
2026-08-30 CI 巡检实证 Gitea 1.26.4 两个调度问题叠加造成 CI 高峰变慢:
改动
1. 新增
scripts/ci/ci_run_selfcheck.shconclusion:若为cancelled/skipped(即 Gitea 复活的僵尸 job),立即exit 78退出,不烧 runner2.
ci-pipeline.yml12 个重量级 job 首步插入自检validate×3、unit-tests、integration-tests、frontend-lint、frontend-unit-test、build-pr、build-staging、staging-e2e、staging-api-tests、build-production
3. dedupe-check 情形2增强
同一 head_sha 的 push 流水线:不只是「在跑/排队」时跳过 PR 侧测试,push 流水线已 success 时同样跳过(消除竞态窗口双跑)
影响面
🤖 Generated by [构建服务器运维] agent
🚀 预览环境已部署
CI全绿,自动审批通过。
CI全绿,自动审批通过。
d459693e00to2f61d5e92d2f61d5e92dtoad4c08de8aad4c08de8atocfb9b5aa9bcfb9b5aa9btoa2c4314905【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
无
💡 改进建议(不阻塞合并)
[scripts/ci/ci_run_selfcheck.sh: 29] 建议扩大僵尸进程拦截范围
cancelled和skipped状态的 Run。如果 Run 的conclusion为success(表示整个流水线已成功),此时仍有 Job 被调度执行,这绝对属于僵尸进程,应当拦截以避免资源浪费。建议在 case 语句的cancelled|skipped分支中加入success。case "${CONCLUSION}" in下的第一行改为cancelled|skipped|success)。[scripts/ci/ci_run_selfcheck.sh: 20] 考虑 Python 依赖缺失的容错
python3进行 JSON 解析。虽然大多数 CI 环境都包含 Python,但为了极致的健壮性,如果 Runner 镜像意外精简了 Python,脚本会报错退出。考虑到这是防御性脚本,建议在set -u前检查python3是否存在,或者改用 Bash 原生字符串处理(较复杂)或jq(如果环境保证存在)。当前方案在通用 CI 环境下可接受,作为建议提出。✅ 良好实践
ci_run_selfcheck.sh中使用了set -u并对关键环境变量进行了非空检查,防止了空指针异常导致的脚本意外中断。curl使用了-f(fail) 和--max-time 10,有效防止了网络请求挂起或因 HTTP 错误导致的逻辑误判。conclusion=='success'的判断,有效解决了 Rebase/Fast-forward 合并时的竞态条件导致的重复测试问题。✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能良好
🤖 由 AI 代码审查机器人自动生成 | 2026-08-31 03:37:17 | 模型:
🗑️ 预览环境已清理
PR #1562 已关闭或合并,对应的预览环境已被清理。