ci: CI重复失败检测 - 自动识别高失败率job并飞书告警 #703
Reference in New Issue
Block a user
Delete Branch "ci/repeated-failure-detection"
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?
背景
第四层(持续监控)最后一块拼图:CI重复失败检测。
定期扫描最近N天的CI失败,按job分组统计失败率,识别高失败率的系统性故障,自动飞书告警。
功能
检测逻辑
三级告警
定时运行
文件清单
四层防御架构补全
🚀 预览环境已部署
代码审查结果 - PR #703
⚠️ 问题(2个需要修改)
scripts/ci/ci_repeated_failure_detector.py 第95行:时间比较逻辑不可靠,使用字符串直接比较ISO格式时间。
datetime.now().isoformat()生成的字符串通常包含微秒(如...12:00:00.123456),而Gitea API返回的时间戳通常只有秒精度(如...12:00:00)。直接进行字符串比较(started >= since)会导致精度不匹配,可能错误地过滤掉边界时间点的Run,导致统计数据不准确。scripts/ci/ci_repeated_failure_detector.py 第57-65行:API错误处理过于宽泛,掩盖了认证或服务器错误。
api_get函数在捕获HTTPError或其他异常时仅打印日志并返回None。上游函数fetch_recent_runs判断if not data: break会直接终止循环,脚本最终输出“没有找到runs”。💡 建议(2个可选)
scripts/ci/ci_repeated_failure_detector.py 第153行:存在N+1查询性能风险。
analyze_failures循环中对每个Run调用fetch_run_jobs(run_id)。如果统计周期内(如7天)有大量Run(例如100+),将产生大量串行HTTP请求,可能导致脚本执行时长超过Workflow设置的10分钟超时限制,或触发API速率限制。建议考虑增加并发请求(如使用concurrent.futures)或限制单次扫描的Run数量上限。.gitea/workflows/ci-failure-monitor.yml 第37-40行:建议使用标准Checkout方式。
curl ... | bash动态下载并执行脚本存在安全风险(虽然此处是从同一仓库获取)且依赖网络环境。如果Gitea支持actions/checkout,建议使用标准Action;如果必须使用脚本,建议增加对下载内容的校验(如SHA256校验)。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-07-22 11:16:42 | 模型:
🗑️ 预览环境已清理
PR #703 已关闭或合并,对应的预览环境已被清理。