Files
skillhub-052-fullstack-dev/references/release-checklist.md
T
2026-07-13 21:35:57 +08:00

7.8 KiB
Raw Blame History

name, description, metadata
name description metadata
release-acceptance-checklist 发布与验收检查清单——后端与全栈应用的 6 道关卡发布检查清单
type
reference

发布与验收检查清单

适用于后端和全栈应用的 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 并不检查所有内容。执行检查清单。
「我们随时可以回滚」 只有当你有计划并测试过回滚才行
「上次这么干没问题」 幸存者偏差。每次都要走检查清单。