# 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 资源
