fix(ci): auto-approve/merge改为短作业+5分钟定时扫描,防止长轮询占垮runner #721
Reference in New Issue
Block a user
Delete Branch "fix/ci-auto-merge-short-job-mode"
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?
问题
auto-approve(40分钟)/auto-merge(30分钟)长轮询占住runner不放,CI拥堵时12个runner被占满,整个流水线接近停摆。
根因
PR Automation的两个job(auto-approve / auto-merge)采用长轮询模式,每个PR占一个runner几十分钟等待CI完成。批量PR时runner资源被快速耗尽。
方案
1. 缩短长轮询时间(治标,立即缓解)
2. 新增定时扫描兜底(治本)
pr-auto-scan.yml:每5分钟定时扫描所有open PRscripts/ci/pr_auto_scan.py:批量扫描脚本3. 效果预估
🚀 预览环境已部署
🗑️ 预览环境已清理
PR #721 已关闭或合并,对应的预览环境已被清理。
代码审查结果 - PR #721
⚠️ 问题(5个需要修改)
scripts/ci/pr_auto_scan.py 第40行:
e.read()流读取逻辑错误except块中,e.read()在if条件中被调用一次,然后在json.loads()中又被调用一次。HTTPError 的流只能读取一次,第二次调用返回空字符串,导致json.loads("")抛出JSONDecodeError,使得错误处理失效。scripts/ci/pr_auto_scan.py 第267行:
merge_pr函数中存在严重的性能瓶颈导致超时time.sleep(30)。Workflow 设置的超时时间为 5 分钟,默认处理 20 个 PR。即使其他操作耗时为 0,仅合并阶段的休眠时间就需要20 * 30s = 600s(10分钟),必然导致 Job 超时被杀死。scripts/ci/pr_auto_scan.py 第32行:禁用了 SSL 证书验证
ctx.verify_mode = ssl.CERT_NONE关闭了 SSL 校验。scripts/ci/pr_auto_scan.py 第38行:未处理空响应体导致解析异常
json.loads(resp.read().decode())假设响应体一定不为空。如果 API 返回 204 No Content(虽然 Gitea 较少见,但符合 HTTP 规范)或某些错误返回空体,此处会崩溃。scripts/ci/pr_auto_scan.py 第40行:异常捕获范围过窄
urllib.error.HTTPError。网络抖动、DNS 解析失败、连接超时等场景会抛出urllib.error.URLError或socket.timeout,这些异常未被捕获。💡 建议(3个可选)
scripts/ci/pr_auto_scan.py 第216行:简化
approve_pr逻辑{"event": "APPROVED"}一步完成审批。两步操作增加了 API 调用次数和失败概率。建议确认 API 文档后简化为一步调用。scripts/ci/pr_auto_scan.py 第189行:优化
get_pr_files性能.gitea/workflows/pr-auto-scan.yml 第21行:Checkout 逻辑过于脆弱
curl下载脚本并通过python3 --help判断是否成功,失败时才回退到 checkout。这种“猜测式”逻辑在curl返回非 200 但有部分内容时可能产生误判。actions/checkout,或者明确检查curl的 HTTP 状态码(--fail或$?)。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-07-22 15:34:38 | 模型: