7.8 KiB
7.8 KiB
name, description, metadata
| name | description | metadata | ||
|---|---|---|---|---|
| release-acceptance-checklist | 发布与验收检查清单——后端与全栈应用的 6 道关卡发布检查清单 |
|
发布与验收检查清单
适用于后端和全栈应用的 6 道关卡发布检查清单。防止出现「在我机器上能跑」和「我们忘了检查 X」之类的故障。
铁律:未通过所有关卡,不得发布。
发布关卡概览
功能完成
↓
关卡 1:功能验收 → 功能是否达到预期?
↓
关卡 2:非功能验收 → 是否快速、可靠、可观测?
↓
关卡 3:安全审查 → 是否安全?
↓
关卡 4:部署就绪 → 能否安全部署并回滚?
↓
关卡 5:发布执行 → 采用金丝雀部署 + 监控上线
↓
关卡 6:发布后验证 → 在生产环境是否真正生效?
关卡 1:功能验收
问题:功能是否满足需求文档的要求?
- 所有来自工单/PRD 的验收条件均有通过测试
- 正常路径端到端可用
- 边界情况已测试(空输入、最大长度、Unicode)
- 错误情况已测试(无效输入、未找到、超时)
- 数据完整性已验证(CRUD 周期产生正确状态)
- 向后兼容性已确认(现有客户端未被破坏)
- API 契约与 OpenAPI 规范一致
- 幂等性已验证(重试不会产生重复数据)
证据模板
| 需求 | 测试 | 状态 | 备注 |
|---|---|---|---|
| 用户可创建订单 | orders.api.test:creates order |
✅ 通过 | |
| 空购物车 → 报错 | orders.api.test:rejects empty |
✅ 通过 | |
| 支付失败已处理 | payments.test:handles decline |
✅ 通过 |
关卡 2:非功能验收
问题:是否快速、可靠、可观测?
性能
- 响应时间在预算范围内(p95 < ___ms)——已实测,非假设
- 无 N+1 查询(通过查询日志检查)
- 新查询使用索引(
EXPLAIN ANALYZE) - 大数据集支持分页
- 缓存生效(命中率 > 80%)
- 连接池在负载下运行正常
可靠性
- 依赖失败时优雅降级(断路器)
- 瞬态故障的重试逻辑正常工作
- 所有外部调用均设置了超时
- 速率限制正确返回 429
- 健康检查端点已验证(
/health、/ready)
可观测性
- 结构化日志包含请求 ID(非
console.log) - 指标已暴露(请求数、延迟、错误率)
- 告警已配置(错误突增、延迟突增)
- 请求追踪端到端可用
- 新功能对应的仪表盘已更新
证据
| 指标 | 目标 | 实际值 | 状态 |
|---|---|---|---|
| p95 响应时间 | < 500ms | ___ms | ✅/❌ |
| p99 响应时间 | < 1000ms | ___ms | ✅/❌ |
| 负载下错误率 | < 0.1% | ___% | ✅/❌ |
| 吞吐量 | > ___ RPS | ___ RPS | ✅/❌ |
关卡 3:安全审查
问题:是否引入了安全漏洞?
输入与输出
- 所有输入在服务端验证(永远不要信任客户端)
- 已防止 SQL 注入(仅使用参数化查询)
- 已防止 XSS(输出编码)
- 文件上传已验证(类型、大小、文件名已净化)
- 敏感端点已限流(登录、重置、API)
认证与数据
- 受保护端点需要有效凭据
- 用户只能访问自己的资源
- 管理后台路由需要管理员角色
- 令牌有过期机制(短生命周期访问令牌 + 刷新令牌)
- 密码已哈希(bcrypt/argon2,非 MD5/SHA)
- 敏感数据未记入日志(密码、令牌、PII)
- 密钥存储在环境变量中(非硬编码)
- 错误消息不泄露内部信息
依赖
- 无已知漏洞(
npm audit/pip audit/govulncheck) - 依赖版本已锁定在 lockfile 中
- 未使用的依赖已移除
关卡 4:部署就绪
问题:能否安全部署,并在必要时回滚?
代码
- 所有测试在 CI 中通过(而非「本地通过了」)
- 代码检查通过,构建成功
- 代码已审查并批准
- 无未解决的 TODO/FIXME/HACK
数据库
- 迁移在预发布环境使用类生产数据已测试
- 回滚迁移可正常工作(已测试!)
- 迁移不会造成破坏(仅新增)
- 已根据生产数据规模预估迁移耗时
- 数据回填方案已记录(如需)
配置
- 新增环境变量已在
.env.example中记录 - 环境变量已在预发布环境设置并验证
- 环境变量已在生产环境设置
- 功能开关已配置(如适用)
回滚计划模板
## 回滚计划:[功能]
### 触发回滚的条件
- 错误率 > 1% 持续 5 分钟
- p99 延迟 > 3000ms 持续 10 分钟
- 关键业务功能被破坏
### 步骤
1. 回退部署:[命令]
2. 回滚迁移(如已执行):[命令]
3. 清除缓存:[命令]
4. 通知团队:#incidents 频道
5. 验证回滚:[验证步骤]
### 预计耗时:[X 分钟]
### 数据恢复:[数据被修改时的恢复方案]
关卡 5:发布执行
部署顺序
1. 📢 在发布频道中公告
2. 🗄️ 数据库——执行迁移
- 运行迁移
- 验证完成
- 检查数据完整性
3. 🚀 部署——发布代码
- 先金丝雀发布(10% 流量)
- 监控 5 分钟
- 如正常 → 50% → 监控 → 100%
- 如不正常 → 立即停止
4. 🔍 冒烟测试
- 健康检查 → 200
- 登录正常
- 核心操作正常
- 无错误突增
5. ✅ 公告「发布完成。持续监控 30 分钟。」
金丝雀决策表
| 指标 | 基准值 | 金丝雀正常 | 停止 | 回滚 |
|---|---|---|---|---|
| 错误率 | 0.05% | < 0.1% | 0.5% | > 1% |
| p95 延迟 | 300ms | < 500ms | 700ms | > 1000ms |
关卡 6:发布后验证
即时(0-30 分钟)
- 所有实例的健康检查均为绿色
- 错误率在正常范围内
- 延迟正常(p95、p99)
- 核心用户流程已手动测试
- 日志正常——无意外错误
- 告警保持静默
短期(1-24 小时)
- 无客户投诉
- 业务指标稳定(转化率、收入、注册数)
- 内存/CPU 稳定(无缓慢增长)
- 队列积压已清除
- 数据库性能稳定
发布后报告模板
## 发布报告:[功能]
- 部署时间:[时间戳] 由 @[工程师]
- 耗时:[分钟]
| 检查项 | 状态 | 备注 |
|--------|------|------|
| 健康检查 | ✅ | 全部正常 |
| 错误率 | ✅ | 0.03%(基准值:0.05%) |
| p95 延迟 | ✅ | 310ms(基准值:300ms) |
| 核心流程 | ✅ | 订单创建已验证 |
发现的问题:无 / [详情]
是否回滚:否 / 是:[原因]
发布就绪评分
每道关卡评分 0-2:(0 = 未检查,1 = 部分检查,2 = 已全面验证并有证据)
| 关卡 | 评分 |
|---|---|
| 1. 功能验收 | /2 |
| 2. 非功能验收 | /2 |
| 3. 安全审查 | /2 |
| 4. 部署就绪 | /2 |
| 5. 发布执行计划 | /2 |
| 6. 发布后验证计划 | /2 |
| 总分 | /12 |
决策:
- 12/12 → 上线 ✅
- 10-11 → 上线,附带已记录的例外事项 + 指定负责人
- < 10 → 不得发布。先修复差距。
常见借口
| ❌ 借口 | ✅ 事实 |
|---|---|
| 「这只是一个小改动」 | 小改动每天都会导致故障 |
| 「我们在本地测过了」 | 本地 ≠ 生产环境 |
| 「出问题了再修」 | 你会在凌晨 3 点修。现在就预防。 |
| 「今天就是截止日期」 | 出错的代码比延期交付成本更高 |
| 「CI 通过了」 | CI 并不检查所有内容。执行检查清单。 |
| 「我们随时可以回滚」 | 只有当你有计划并测试过回滚才行 |
| 「上次这么干没问题」 | 幸存者偏差。每次都要走检查清单。 |