Files
user-system/docs/code-review/CODE_REVIEW_PROCESS.md
long-agent 09beb173cc feat: complete production readiness improvements
- Fix DIP violations in service layer (device, stats, auth middleware)
- Add ReplaceUserRoles interface method for transaction safety
- Implement Magic Bytes validation for avatar uploads
- Standardize OAuth error handling with ErrOAuthProviderNotSupported
- Use crypto/rand for JWT secret generation instead of weak fixed key
- Apply code formatting with gofumpt and goimports
- Fix staticcheck issues (S1024, S1008, ST1005)
- Add comprehensive quality and functional test reports
- Achieve 36.3% test coverage (up from 16.3%)
- All E2E, integration, and business logic tests passing
2026-04-12 16:15:32 +08:00

355 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 代码审查流程规范 v2.0
**文档版本**: v2.0
**更新日期**: 2026-04-12
**适用范围**: User Management System (UMS) 项目
**配套标准**: `CODE_REVIEW_STANDARD_V4.md`
**配套 Checklist**: `REVIEW_EXECUTION_CHECKLIST.md`
---
## 一、核心原则
### 1.1 零信任文档原则
> **任何"已完成"的声明,必须附带可重现的命令和输出,否则视为未完成。**
历史教训:
- v2.0 时期因依赖文档自述,评分虚高至 9.7/10
- 2026-04-11 发现前端构建实际失败,但文档标注 "PASS"
- v4.0 要求:工具证据先于文档断言
### 1.2 教学优先原则
审查的目的是让代码更好、让开发者成长,不是门卫把关:
- 每个问题说明"为什么是问题",而非只说"改掉"
- 赞扬好的实践,具体表扬有教学价值
### 1.3 优先级纪律
| 级别 | 处理规则 | 不遵守的后果 |
|------|----------|-------------|
| 🔴 P0 | 禁止合并4h 内修复 | 永久 Block |
| 🟠 P1 | 禁止合并,当天修复 | 永久 Block |
| 🟡 P2 | 附计划后可合并,本周修复 | 跟踪 Issue |
| 🔵 P3 | 可合并,本 Sprint 修复 | 技术债台账 |
| 💭 P4 | 可忽略 | - |
---
## 二、角色与职责
| 角色 | 职责 | SLA |
|------|------|-----|
| **作者** | 自审 → 提 PR → 修复问题 → 更新文档 | 当日响应 |
| **审查者** | 执行 Checklist → 标注问题 → 给出建议 → Approve | P0:1h / P1:4h / P2:8h |
| **Tech Lead** | SLA 超时升级,争议仲裁,流程优化 | 1个工作日 |
### 2.1 作者自审清单(提 PR 前必须执行)
```powershell
# 最小自审2分钟
cd d:\usersystem
go build ./cmd/server # 必须通过
go vet ./... # 必须通过
go test ./... -short -count=1 # 必须通过
cd frontend\admin
npm.cmd run lint # 必须通过
npm.cmd run build # 必须通过 ← 重点,历史有谎报
```
### 2.2 作者 PR 描述模板
```markdown
## 变更目的
[1-2句说明解决什么问题为什么这样解决]
## 影响范围
- [ ] 后端Go
- [ ] 前端React/TypeScript
- [ ] 数据库schema变更
- [ ] 部署配置
- [ ] 文档
## 验证命令与结果
```bash
$ go build ./cmd/server
# 输出: [粘贴实际输出]
$ go test ./... -short
# 输出: ok ... [粘贴实际输出]
$ npm.cmd run build
# 输出: [粘贴实际输出]
```
## 是否需要 E2E 测试?
- [ ] 是 → 已执行 `npm.cmd run e2e:full:win`(粘贴结果)
- [ ] 否 → 理由:[说明为何不需要]
## 剩余已知问题P2及以下
- [问题1] #issue-link
```
---
## 三、审查执行流程SOP
```
┌─────────────────────────────────────────────────────────────────┐
│ 作者自审 + 提 PR │
│ □ go build / go vet / go test -short 全通过 │
│ □ npm lint / npm build 全通过(无 TS 错误!) │
│ □ PR 描述包含验证命令输出 │
└─────────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 阶段 1自动化门禁CI约5分钟
│ □ go build + go vet + go test -race │
│ □ 覆盖率 ≥ 60% │
│ □ govulncheck无已知CVE
│ □ npm lint + npm build + npm test │
│ □ npm audithigh漏洞=0
│ │
│ ⚠️ 任一失败 → PR 自动 Block作者修复后重新触发 │
└─────────────────────────┬───────────────────────────────────────┘
CI 全通过)
┌─────────────────────────────────────────────────────────────────┐
│ 阶段 2审查者人工审查10-20分钟
│ │
│ 按优先级审查顺序: │
│ 1. 安全维度P0 优先)—— 新 API 权限文件上传SQL 注入? │
│ 2. API 契约 —— 响应格式统一HTTP状态码正确
│ 3. 前后端集成 —— 路径/字段名/类型一致? │
│ 4. 业务逻辑 —— 功能正确?边界处理? │
│ 5. 测试质量 —— 测试是真实的?非虚假断言? │
│ 6. 运维影响 —— 配置变更Runbook 需要更新? │
│ │
│ 使用 REVIEW_EXECUTION_CHECKLIST.md 逐项执行 │
└─────────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 阶段 3问题标注 │
│ 使用标准格式(见第四节) │
│ P0/P1 → 逐项说明问题+原因+建议修复 │
│ P2/P3 → 可集中列表 │
│ 亮点 → 至少指出 1 个好的做法 │
└─────────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 阶段 4作者修复 │
│ P0/P1 → 修复后回复每条评论,附命令输出证明 │
│ P2 → 修复或创建 Issue 跟踪,评论 Issue 链接 │
│ P3 → 修复或在 PR 评论说明原因 │
└─────────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 阶段 5E2E 检查(条件触发) │
│ 触发条件(满足任一): │
│ - 认证相关变更 │
│ - 路由守卫变更 │
│ - 导航组件变更 │
│ - Token 管理变更 │
│ 命令cd frontend/admin && npm.cmd run e2e:full:win │
└─────────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 阶段 6Approve + 合并 │
│ □ 所有 🔴🟠 问题已修复(有验证命令证明) │
│ □ P2 有 Issue 跟踪计划 │
│ □ 覆盖率未下降 > 5% │
│ □ 文档已同步API 变更 → Swagger配置变更 → .env.example
│ □ Approve │
└─────────────────────────────────────────────────────────────────┘
```
---
## 四、审查评论格式规范
### 问题标注格式
```markdown
🔴 **[P0 - 安全] 文件上传缺少 Magic Bytes 校验**
📍 位置:`internal/api/handler/avatar_handler.go:95`
**问题描述**
当前仅校验文件扩展名,攻击者可将 PHP Shell 命名为 `.jpg` 绕过检查。
**风险**
恶意文件可能被服务端执行,导致 RCE远程代码执行
**建议修复**
```go
src, _ := file.Open()
buf := make([]byte, 512)
n, _ := src.Read(buf)
contentType := http.DetectContentType(buf[:n])
allowedMIME := map[string]bool{
"image/jpeg": true, "image/png": true,
}
if !allowedMIME[contentType] {
c.JSON(400, gin.H{"message": "invalid file content"})
return
}
src.Seek(0, io.SeekStart)
```
---
🟡 **[P2 - 可维护性] context.Background() 在请求链路中截断追踪**
📍 位置:`internal/api/middleware/auth.go:131`
**问题描述**:缓存查询使用 `context.Background()` 而非请求 context导致 Trace ID 无法传播。
**建议**:将函数签名改为接收 `ctx context.Context`,传递调用者的 context。
---
**做得好Argon2id 密码哈希配置优秀**
`internal/auth/password.go` 中 64MB 内存、5次迭代的 Argon2id 配置超越行业基准,
有效防御 GPU 暴力破解。
```
### Approve 评论格式
```markdown
## 审查结论
✅ **批准合并**
**综合评分**X.X/10
**亮点**
- Argon2id 配置超越行业基准
- 游标分页 P99=53ms性能优秀
**遗留 P2已有 Issue 跟踪)**
- #123 OpenAPI 注释完善
- #124 pagination 包测试
**合并后 24h 内请确认**
- 生产监控无异常告警
- 关键业务指标(登录成功率)正常
LGTM 🚀
```
---
## 五、审查时效 SLA
| PR 优先级 | 首次审查 | 修复后复核 | 最大总周期 |
|-----------|----------|------------|-----------|
| P0 安全紧急 | **30 分钟** | 15 分钟 | 2 小时 |
| P1 重要修复 | **1 小时** | 30 分钟 | 4 小时 |
| P2 常规功能 | **4 小时** | 2 小时 | 24 小时 |
| P3 重构/文档 | **8 小时** | 4 小时 | 48 小时 |
### 超时处理
```
超 SLA 50% → 作者 @审查者 催促
超 SLA 100% → 作者 @Tech Lead 升级
超 3 个工作日无响应 → Tech Lead 仲裁
```
---
## 六、特殊场景处理
### 6.1 大型 PR>500 行)
```
优先请求作者拆分,按以下维度拆:
- 后端/前端 分开
- 功能/测试 分开
- 重构/新功能 分开
如必须整体审查:
1. 分批审查(核心安全逻辑优先)
2. 明确标记哪些部分已审查
3. 剩余部分安排跟进审查
```
### 6.2 生产紧急修复Hotfix
```
流程:
1. Tech Lead 批准先合并P0 安全问题)
2. 24 小时内完成完整审查
3. 发现问题立即 Hotfix v2
4. 72 小时内完成事后复盘
条件:
- 只允许 P0 安全/稳定性问题
- 必须在 Hotfix 分支hotfix/XXX
- 合并后必须同步更新所有文档
```
### 6.3 安全相关变更(额外严格)
```
触发条件(满足任一):
- 认证/授权逻辑
- 密码/Token 处理
- 文件上传
- 外部服务调用OAuth/SMS/Email
- 数据库 schema含敏感字段
额外要求:
- Tech Lead 必须参与审查
- 发布前必须运行完整安全扫描gosec + govulncheck
- 需要额外的攻击场景测试
```
---
## 七、争议解决
| 争议类型 | 解决方式 |
|----------|----------|
| 问题级别分歧 | 参照标准模糊取高Tech Lead 终裁 |
| 是否必须修复 | 审查者决定,作者提仲裁请求 |
| 技术方案选择 | 量化数据支持(性能/复杂度Tech Lead 仲裁 |
| 代码风格偏好 | 参考项目规范,无标准则接受 |
---
## 八、审查记录归档
| 内容 | 位置 | 保存期限 |
|------|------|----------|
| 全面审查报告 | `docs/code-review/COMPREHENSIVE_REVIEW_YYYY-MM-DD.md` | 永久 |
| 专项审查报告 | `docs/code-review/[主题]_REVIEW_YYYY-MM-DD.md` | 永久 |
| 问题跟踪 | Gitea Issues | 永久 |
| 工具扫描结果 | `docs/evidence/` | 90天 |
---
## 九、持续改进
### 9.1 回顾周期
| 周期 | 内容 | 负责人 |
|------|------|--------|
| 每次 Sprint 结束 | 审查效率/质量小结 | Tech Lead |
| 每月 | 流程优化讨论(缺陷逃逸率、审查一致性)| Team |
| 每季度 | 标准文档更新CODE_REVIEW_STANDARD_VX.md| 代码审查专家 |
### 9.2 关键质量指标(目标)
| 指标 | 当前 | 目标 |
|------|------|------|
| 缺陷逃逸率 | 未量化 | < 2个/Sprint |
| P0/P1 修复时效 | 未量化 | 100% 在 SLA 内 |
| 审查覆盖率 | 100% | 保持 |
| 虚假完成率 | 历史有案例 | 0 |
---
*文档版本: v2.0*
*更新时间: 2026-04-12*
*主要变更: 新增零信任文档原则 + SOP 流程图 + E2E 触发条件 + 各维度专项检查要求*