质量保证 SOP¶
结论:用风险分级、自动验证、可控发布和运行复盘保证变更质量。
0. 文档控制¶
| 项目 | 内容 |
|---|---|
| 文档负责人 | 维护者 |
| 评审人 | 维护者 |
| 状态 | review |
| 版本 | 0.3 |
| 更新日期 | 2026-10-28 |
| 适用对象 | 2 到 15 人的 GitHub 研发团队 |
1. 目的与范围¶
本 SOP 适用于 2 到 15 人、使用 GitHub 的个人仓库或组织仓库。团队规模是经验值。
流程覆盖需求、设计、开发、代码审查、持续集成(CI)、合并、发布、运行反馈和复盘。
流程目标有三项:
- 阻止已知高风险问题进入默认分支。
- 限制发布失败对用户的影响范围。
- 让缺陷、回滚和告警进入改进循环。
本 SOP 是 研发工作流 的质量补充。本文不替代原工作流。
本 SOP 不承担 ISO 27001、SOC 2 等外部合规取证。外部取证要求单独定义。
2. 质量定义¶
一次变更同时满足以下五项,才算达到质量要求。
- 变更满足可验证的验收标准。
- 变更覆盖必要的测试。
- 变更没有未处理的高风险问题。
- 发布路径可观测、可回滚。
- 每项风险都有明确负责人。
测试数量、覆盖率和通过率只是信号。单一数字不能单独代表质量。
3. 角色¶
| 角色 | 谁担任 | 核心职责 |
|---|---|---|
| 负责人 | issue 的 assignee | 定义验收标准、测试方案和发布方案,维护质量证据。 |
| 审查人 | 非作者成员 | 审查代码、测试、风险和发布影响。 |
| 维护人 | 1 到 2 名团队指定成员 | 管理规则集、扫描、指标、例外和质量复核。 |
| 值班人 | 团队指定成员 | 响应告警、恢复服务、记录事件和后续动作。 |
单人仓库由负责人执行维护人检查。检查结果仍要记录。
4. 风险分级¶
负责人创建 issue 时填写风险等级。风险等级由用户影响和恢复难度共同决定。
Priority P0 到 P3 表示交付优先级。Risk R0 到 R3 表示质量风险。两个字段独立填写。
只要变更涉及权限、认证、支付、用户数据、生产凭据或发布链路,风险等级最低为 R0。
| 等级 | 判定标准 | 默认质量门禁 |
|---|---|---|
R0 |
可能造成数据泄露、数据丢失、权限绕过、支付错误、核心服务不可用或无法回滚。 | 2 名非作者批准;关键路径测试;安全扫描;Canary(小流量发布);服务等级目标(SLO);监控;回滚演练;值班人确认。 |
R1 |
可能影响主要用户路径,或影响多个服务。 | 1 名非作者批准;必要测试;安全扫描;分批发布;回滚方案;告警负责人。 |
R2 |
影响次要路径或少量用户,且有绕行方案。 | 1 名非作者批准;必要测试;安全扫描;标准发布。 |
R3 |
仅涉及文档、注释、文案或不影响运行与数据的样式调整。 | 自动检查;维护人可选审查。 |
团队不足 2 名审查人时,R0 变更还要增加发布后验证。维护人记录例外、批准人和失效日期。
风险等级填写在 Project 字段 Risk 中。风险等级变化时,负责人在 issue 正文记录变化原因。
5. 主流程¶
下图展示质量活动的顺序和反馈关系。
flowchart LR
A["风险分级"] --> B["验收标准与测试方案"]
B --> C["小批量开发与自测"]
C --> D["代码审查与自动检查"]
D --> E["Merge queue"]
E --> F["Canary 与运行监控"]
F --> G["复盘、指标与规则更新"]
G --> A
5.1 步骤¶
本文统一使用 GitHub 功能名 Merge queue。
每个变更通过 Pull Request(PR)交付。PR 必须包含目的、测试和风险。
| 步骤 | 负责人 | 动作 | 完成证据 |
|---|---|---|---|
| Q1 分级 | 负责人 | 在 issue 写用户影响、风险等级和恢复方式。 | issue 的 Impact、Risk、Rollback 字段齐全。 |
| Q2 设标准 | 负责人 | 写可验证的验收标准和测试范围。 | issue 的验收标准可以逐条判断通过或失败。 |
| Q3 开发 | 负责人 | 把变更拆成可独立审查的 PR。 | PR 只包含一个完整目的。 |
| Q4 自测 | 负责人 | 运行必要测试、静态检查和本地复现。 | PR 记录命令、结果和失败修复。 |
| Q5 审查 | 审查人 | 审查行为、测试、风险、可维护性和发布影响。 | 至少 1 名非作者批准;R0 至少 2 名。 |
| Q6 验证 | 维护人 | 把必要检查设为必需状态检查。 | 必需状态检查全部通过,对话全部解决。 |
| Q7 合并 | 负责人 | 通过 Merge queue 合入目标分支。 | 目标分支保持绿色,合并记录可追踪。 |
| Q8 发布 | 负责人 | 按风险等级执行 Canary、审批或全量发布。 | 发布记录含版本、负责人、观察窗口和结果。 |
| Q9 运行 | 值班人 | 观察错误、延迟、饱和度和业务指标。 | 告警、日志和 SLO 数据可查询。 |
| Q10 改进 | 维护人 | 处理 flaky test(不稳定测试)、事件和重复告警。 | 有负责人、截止日期和验证结果。 |
5.2 小批量规则¶
一个 PR 只解决一个完整问题。独立重构与功能变更分开提交。
无法快速审查的 PR,负责人先拆分。拆分不改变验收标准。
6. 完成标准(Definition of Done)¶
负责人提交 PR 前,逐项检查以下条件。
- 验收标准可验证。
- 变更覆盖新增或修改的行为。
- 必需 CI 检查通过。
- 代码审查由非作者完成。
- 审查对话全部解决。
- CodeQL、密钥扫描和依赖扫描没有未处理的高风险问题。
- 数据库、配置和权限变更包含回滚方案。
-
R0、R1变更包含监控项和告警负责人。 - 测试、发布和风险证据链接到 issue。
- PR 不包含无关改动。
覆盖率门禁可选。启用时,默认要求变更行的覆盖率不得低于目标分支。团队按语言和项目调整阈值。
7. 代码审查规则¶
审查人先判断变更是否应该存在,再判断代码是否正确。
审查顺序如下。
- 对照验收标准检查行为。
- 检查失败路径、边界条件和权限。
- 检查测试是否覆盖真实风险。
- 检查数据迁移、兼容性和回滚。
- 检查日志、指标和告警。
- 检查命名、结构和可维护性。
审查意见分为三类:必须修改、建议修改、问题讨论。必须修改项关闭前不得批准。
人工智能(AI)初审可以处理重复问题和明显缺陷。人工审查负责架构、产品权衡、权限、隐私和发布风险。Merge 责任仍由开发者承担。
8. GitHub 原生控制¶
8.1 一次性配置¶
- 在 Project 增加
Risk字段。 - 在 PR 模板增加目的、测试、风险、回滚和证据。
- 在 Ruleset 启用 PR、审查、必需状态检查和对话解决。
- 在生产 Environment 启用审批规则。
- 为
R0、R1服务启用 CodeQL、密钥扫描和 Dependabot。 - 记录规则集绕过名单。
8.2 控制清单¶
| 控制目标 | GitHub 功能 | 最低要求 |
|---|---|---|
| 保护默认分支 | Rulesets | 禁止强推和删除;要求 PR。 |
| 阻止红色变更 | 必需状态检查(required status checks) | 测试、扫描和构建必须通过。 |
| 保证并发安全 | Merge queue(合并队列) | 高并发分支启用合并队列。 |
| 自动测试 | GitHub Actions | PR 触发必要测试和检查。 |
| 发现代码风险 | CodeQL(静态分析) | R0、R1 服务启用扫描。 |
| 发现泄漏凭据 | Secret scanning | 全仓库启用。 |
| 发现依赖漏洞 | Dependabot alerts | 全仓库启用。 |
| 控制生产发布 | Environments | 生产环境设置审批规则。 |
| 记录质量证据 | Issues、PR、Projects | 风险、测试、审批和发布记录可追踪。 |
规则集绕过权限只授予指定管理员。维护人每季度复核一次绕过名单。
部分控制受 GitHub 套餐限制。功能不可用时,维护人记录替代控制和剩余风险。替代控制不能伪装成自动门禁。
9. 发布规则¶
9.1 R0 发布¶
- 在发布前确认回滚版本和负责人。
- 写清 Canary 的观察窗口和停止阈值。
- 向小比例生产流量发布 Canary。
- 观察错误、延迟、饱和度和业务指标。
- Canary 达标后分批扩大流量。
- 出现严重告警、SLO 超限或核心指标偏移时停止扩量。
- 出现用户影响时先回滚或关闭功能,再定位根因。
- 在 issue 写发布结果和后续动作。
Canary 观察窗口默认 30 分钟。低流量或高延迟服务延长到样本量足够为止。
9.2 R1 发布¶
- 在低风险时段发布。
- 观察发布窗口内的错误和延迟。
- 出现用户影响时暂停或回滚。
- 在发布记录中写结果。
9.3 R2、R3 发布¶
按标准流程发布。发布失败时记录原因和修复链接。
10. 测试可靠性¶
flaky test 指同一代码同时出现通过和失败结果的不稳定测试。
红灯必须可信。团队不能依赖反复重跑获得绿色结果。
维护人按以下顺序处理 flaky test:
- 记录测试名、提交、分支、构建和失败现象。
- 对同一代码重跑,判断结果是否稳定。
- 按影响面排序。优先处理高频、跨分支和阻塞部署的问题。
- 自动重跑只能暂时隔离失败,不能代替修复。
- 为高频 flaky test 建 issue、指定负责人和截止日期。
- 修复后保留验证记录。
默认指标为 Flaky Build Rate,即因 flaky test 失败的构建占比。前 4 周采集基线,不先设强制目标。
11. 质量指标¶
维护人每周记录以下指标。
| 指标 | 含义 | 用途 |
|---|---|---|
| Lead Time for Changes | 从 PR 就绪到生产运行所需时间。 | 发现等待和流程瓶颈。 |
| Deployment Frequency | 单位时间完成的生产发布次数。 | 观察发布批量大小。 |
| Change Failure Rate | 发布后需要回滚或热修的变更占比。 | 判断发布质量。 |
| Time to Restore | 从事件发生到服务恢复的时间。 | 判断恢复能力。 |
| Flaky Build Rate | 因 flaky test 失败的构建占比。 | 判断 CI 可信度。 |
| Open High-Risk Findings | 未关闭的高风险代码、密钥和依赖问题数量。 | 判断风险存量。 |
| Alert Noise | 无有效动作的告警占比。 | 判断监控质量。 |
前 4 周只采集基线。第 5 周开始设目标,每次只改一个指标。
指标不得用于个人排名。指标用于发现系统问题。
12. 例外与热修¶
下列情况可以走例外流程:
- 生产事故需要立即恢复服务。
- 外部依赖故障阻塞关键发布。
- 规则集或扫描工具自身故障。
例外执行规则:
- 开一个 incident issue。
- 记录绕过原因、影响范围、批准人和失效时间。
- 只绕过与事故直接相连的质量门禁。
- 恢复服务后补做检查。
- 在 2 个工作日内补完验证或回滚。
- 把根因和长期修复写进 incident issue。
静默绕过是流程缺陷。每次绕过都要进入月度质量复核。
13. 事件与复盘¶
事件复盘只讨论系统和流程,不追究个人责任。
复盘至少回答五项:
- 用户受到什么影响。
- 事件何时开始、何时被发现、何时恢复。
- 哪个控制缺失、失效或未被使用。
- 哪个动作缩短了影响时间。
- 哪个负责人会在何时验证改进。
复盘动作必须进入 issue,并设置截止日期。没有验证动作的复盘不算完成。
14. 每周质量复核¶
维护人每周执行以下检查。
- 查看未关闭的
R0、R1风险和逾期动作。 - 查看
Change Failure Rate、Time to Restore和Flaky Build Rate。 - 查看规则集绕过记录。
- 查看超过期限的例外。
- 抽查 1 到 3 个近期 PR 的质量证据。
- 为异常指标指定负责人和下周动作。
- 把复核结论写进固定 issue 或项目记录。
每周复核控制在 30 分钟内。超过 30 分钟时,减少指标或自动采集。
15. 上线顺序¶
团队首次采用本 SOP 时,按以下顺序执行。
- 给 1 个仓库启用 PR、代码审查和必需检查。
- 给第一个仓库增加 CodeQL、密钥扫描和 Dependabot。
- 给高并发目标分支启用 Merge queue。
- 给生产环境增加审批和回滚记录。
- 选择 1 个
R0或R1服务启用 Canary 和 SLO。 - 连续 4 周采集质量指标。
- 根据基线设置第一个质量目标。
- 扩展到更多仓库。
先在第一个仓库完成验证,再扩展到组织。不要一次启用全部门禁。
16. 记录与证据¶
| 记录 | 最小内容 | 保存位置 |
|---|---|---|
| Issue | 风险、影响、验收标准、回滚方案。 | GitHub Issue 与 Project。 |
| PR | 变更目的、测试、审查、检查结果。 | GitHub Pull Request。 |
| 发布记录 | 版本、提交、时间、审批人、观察结果。 | Release、Environment 或 issue。 |
| 事件记录 | 时间线、影响、恢复、根因、后续动作。 | Incident issue。 |
| 周度复核 | 指标、异常、负责人、截止日期。 | 固定 issue 或 Project 记录。 |
| 例外记录 | 原因、批准人、绕过项、失效时间。 | Issue 或专门的例外登记。 |
正文保留结论。评论保留讨论过程。关键结论必须写回 issue 或 PR 正文。
17. 常见误读¶
-
误读:测试越多,质量越高。
正确做法是让测试对风险有代表性,并保持红灯可信。 -
误读:覆盖率达标就可以合并。
正确做法是同时检查行为、风险、扫描和发布条件。 -
误读:所有问题同等优先。
正确做法是按影响面、频率和恢复难度排序。 -
误读:速度与质量冲突。
正确做法是减少等待、缩小批量、自动收集证据。 -
误读:AI 可以承担发布责任。
正确做法是使用 AI 初审,由开发者承担 Merge 责任。
18. 评审与生效¶
用户负责内容验收。维护人负责流程检查。
- 用户审阅风险分级、质量门禁、发布规则和指标。
- 用户记录批准或退回意见。
- 退回时保持
review,按意见修改。 - 批准后将
status改为active。 - 批准后将
version改为1.0。 - 填写生效日期并更新
updated。
19. 调研依据¶
本 SOP 依据 GitHub 公开工程实践整理。阈值和角色配置是团队默认值,不宣称为 GitHub 内部规则。
- GitHub Engineering Fundamentals(2024-02-08)
- GitHub Merge Queue(2024-03-06)
- Reducing flaky builds by 18x(2020-12-16)
- Making GitHub CI workflow 3x faster(2020-10-29)
- Deployment reliability at GitHub(2021-02-03)
- Building On-Call Culture at GitHub(2021-01-06)
- SERVICEOWNERS at GitHub(2023-12-19)
- Code review in the age of AI(2025-07-14)
- GitHub Code Quality(访问:2026-10-28)
- GitHub Rulesets(访问:2026-10-28)
20. 版本记录¶
| 版本 | 日期 | 变更 |
|---|---|---|
| 0.3 | 2026-10-28 | 删除无使用的 hide_title 字段。 |
| 0.2 | 2026-10-28 | 按文档编写规则补齐头信息、结构、来源和评审状态。 |
| 0.1 | 2026-10-28 | 建立初稿。 |