ci: CI失败诊断增强,自动分类失败原因+给出修复建议 #695
Reference in New Issue
Block a user
Delete Branch "ci/failure-diagnosis-enhanced"
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?
背景
四层防御方案第3.1+3.2项:CI失败自动分类 + 失败原因定位 + 修复建议。
目前CI失败通知只有"哪个job失败了",排查还需要点进去翻日志。
改动
新增
scripts/ci/ci_failure_diagnosis.py自动分析失败原因,支持9大分类:
每个分类都配了3-5条具体修复建议。
升级
scripts/ci_notify_failure.py失败通知卡片增加:
收益
🚀 预览环境已部署
CI全绿,自动审批通过。
CI全绿,自动审批通过。
代码审查结果 - PR #695
⚠️ 问题(4个需要修改)
scripts/ci/ci_failure_diagnosis.py 第265行:存在内存溢出(OOM)风险
f.read()一次性读取整个日志文件到内存,随后使用split("\n")将其转换为列表。CI日志文件通常很大(几十MB到几百MB),这种做法极易导致脚本内存溢出崩溃,尤其是在资源受限的CI Runner上。scripts/ci/ci_failure_diagnosis.py 第221行:网络请求超时时间设置过短
urllib.request.urlopen(..., timeout=15)设置了15秒的超时。从Gitea API获取大型CI日志通常需要更长时间,15秒极易导致请求超时,从而无法获取到诊断所需的日志内容。.gitea/workflows/ci-pipeline.yml 第226行:pip 安装方式存在严重的性能隐患,可能导致超时
--no-binary :all:参数安装black和isort。这意味着强制从源码编译这些包及其依赖(如 Rust 扩展),这非常耗时(通常需要几分钟),且极易因网络或编译环境问题失败。该 Job 设置的timeout-minutes: 8非常紧张,极大概率导致超时。--no-binary :all:,直接使用预编译的二进制包安装。如果必须使用特定版本,请确保二进制包可用。.gitea/workflows/ci-pipeline.yml 第258行:硬编码数据库凭证存在安全风险
DATABASE_URL中硬编码了用户名和密码postgres:postgres。虽然这是用于CI环境的内部数据库,但将凭证明文写入代码库(尤其是YAML配置文件)是不良的安全实践,容易泄露。${{ secrets.DB_PASSWORD }}注入。💡 建议(2个可选)
.gitea/workflows/ci-pipeline.yml 第258行:Linux Runner 网络兼容性风险
host.docker.internal访问宿主机数据库。该域名仅在 Docker Desktop (Mac/Windows) 上默认支持,在 Linux Docker 环境中通常需要额外配置(如--add-host)或使用172.17.0.1。如果 CI Runner 是 Linux,可能导致数据库连接失败。scripts/ci/ci_failure_diagnosis.py 第221行:异常处理过于宽泛
fetch_failed_job_log函数中捕获了通用的Exception。虽然这里做了容错,但建议区分urllib.error.HTTPError、urllib.error.URLError和socket.timeout,以便在调试时能更精准地判断是网络问题、权限问题还是超时问题。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能问题
🤖 由 AI 代码审查机器人自动生成 | 2026-07-22 10:37:28 | 模型:
🗑️ 预览环境已清理
PR #695 已关闭或合并,对应的预览环境已被清理。