diff --git a/docs/ci/ci-failure-diagnosis-20260713.md b/docs/ci/ci-failure-diagnosis-20260713.md new file mode 100644 index 000000000..61723b54b --- /dev/null +++ b/docs/ci/ci-failure-diagnosis-20260713.md @@ -0,0 +1,104 @@ +# CI 大量失败根因排查报告 + +**排查时间:** 2026-07-13 +**排查人:** 构建服务器运维Agent +**范围:** 最近15次 CI run(PR #258~#265 + develop 分支多次 push) + +## 一、整体概况 + +最近 20 次 CI run 中 16 次失败,失败率 **80%**。失败集中在 3 个 Job: + +| Job | 失败率 | 根因类型 | +|-----|--------|----------| +| Validate Code Quality | 100% | black 代码格式检查失败 | +| Unit Tests | 100% | 测试断言未同步国际化改动 | +| Integration Tests | 100% | 密码重置接口变更未同步测试 | +| Frontend Lint | 20% | 各 PR 代码质量问题 | + +**结论:3 个全局性失败点导致所有 PR CI 全红,不是代码本身问题,是基础设施/测试用例滞后。** + +--- + +## 二、详细根因分析 + +### 1. Validate — black 格式检查失败 + +**现象:** +``` +would reformat scripts/check_migration_safety.py +1 file would be reformatted, 369 files would be left unchanged. +Oh no! 💥 💔 💥 +``` + +**根因:** +`scripts/check_migration_safety.py` 文件不符合 black 格式化规范。该文件是最近新增的迁移安全检查脚本,提交前未本地跑 black 格式化。 + +**影响范围:** 所有 PR 及 develop 分支,全量失败。 + +**修复方案:** +```bash +black scripts/check_migration_safety.py +``` + +--- + +### 2. Unit Tests — 1 个用例失败 + +**现象:** +``` +FAILED tests/unit/test_asset_library_delete.py::TestDeleteAssetLibrary::test_delete_library_access_denied + AssertionError: assert 'Access denied' in '无权访问该项目' +``` + +**统计:** 1442 passed, 1 failed + +**根因:** +项目之前做了国际化(i18n)改造,错误信息从英文改成了中文,但对应的单元测试断言仍然检查英文 "Access denied",导致断言失败。 + +**影响范围:** 所有 PR 及 develop 分支,全量失败。 + +**修复方案:** +修改 `tests/unit/test_asset_library_delete.py` 中的断言,将 `'Access denied'` 改为 `'无权访问该项目'`,或改为断言 HTTP 状态码(403)而不是错误消息文本。 + +--- + +### 3. Integration Tests — 1 个用例失败 + +**现象:** +``` +FAILED tests/integration/test_auth.py::TestPasswordReset::test_request_password_reset_success + assert 404 in (200, 202) +``` + +**统计:** 45 passed, 1 failed, 13 deselected, 2 rerun + +**根因:** +密码重置请求接口(`POST /auth/password-reset/request` 或类似路由)返回 404,说明该接口已被移除、路由变更,或对应的功能模块暂时被注释/下线。 + +**影响范围:** 所有 PR 及 develop 分支,全量失败。 + +**修复方案:** +- 如果接口确实下线了:删除或 skip 这个测试用例 +- 如果是路由改了:更新测试中的 API 路径 +- 如果是功能待开发:标记为 `@pytest.mark.skip` 并加上 TODO + +--- + +## 三、修复优先级 + +| 优先级 | 问题 | 修复难度 | 预估时间 | +|--------|------|----------|----------| +| P0 | black 格式检查失败 | ⭐ | 5分钟 | +| P0 | 单元测试国际化断言失败 | ⭐ | 10分钟 | +| P1 | 集成测试密码重置接口404 | ⭐⭐ | 30分钟(需确认接口状态) | + +**建议:** 先修前两个 P0(能让 2/3 的 job 变绿),再处理密码重置那个。 + +--- + +## 四、Runner 执行情况观察 + +- 当前 9 个 Runner 全部在线(构建服务器 4 个 + 新服务器 5 个) +- 失败的 Job 都是在构建服务器的 Runner 上执行的(xiaoxia-ci-runner-2/3 等) +- 新服务器 5 个 Runner 目前全部空闲(标签修复后首次接任务可能需要时间) +- 并发能力充足,瓶颈在代码/测试本身,不在 Runner 资源