Runbook 版本化
在 git 随代码版本化 runbook 使其随系统演化和可审查。
为什么
Confluence 中 runbook 无版本 — 某人更新时旧版消失,若更新错(命令笔误、删步)无人见改了什么或回滚。git 中 runbook 有版本:每改是带作者、消息和审查者可查 diff 的提交。系统变时 runbook 在同 PR 变,故代码审查抓 runbook 腐("你改了服务名但没更新 runbook")。事件中 runbook 坏时可 git blame 见改了什么何时,需要时回滚。这与我们版本化代码 同因:无版本 runbook 不可审查、不可回滚、静默腐 — 版本化 runbook 可审计、可审查、耦合于它描述的系统。
何时使用
runbook 写时。上线前移 git(如服务仓 runbooks/)。
如何做
1. runbook 存 git,服务仓或专用 runbook 仓 - runbooks/checkout-slo-burn.md 在 checkout 服务仓 - 或中央 runbook 仓若服务多 2. 要求 runbook 更新与系统变同 PR - "服务改名?同 PR 更新 runbooks/*.md。" - 代码审查:若变更坏 runbook,runbook 更新须在 PR - 这把 runbook 新鲜耦合于系统变 3. 用前置元存元数据 --- owner: @team-payments alert: CheckoutSLOBurnRateFast last_reviewed: 2026-01-15 --- - 机可读;审计脚本读此 4. 代码审查审 runbook 变更 - runbook 变更是代码变更;审查者查命令仍工作 - "你把步 2 从 --take-over 改 --promote — 在 staging 测了吗?" 5. 用 git blame 做事件取证 - "runbook 说 --take-over 但命令是 --promote — 何时变的?" - git blame runbook/db-failover.md → "Alice,2025-12-01,'update for new CLI version'" - 若变更致事件 → 回滚并修
示例
# 服务仓结构:
checkout-service/
src/
runbooks/
checkout-slo-burn.md # 随服务版本化
checkout-db-failover.md
deploy/
...
# 改服务名的 PR(要求 runbook 更新):
git diff:
src/config.yaml: service_name: checkout → checkout-api
runbooks/checkout-slo-burn.md:
- kubectl get pods -n checkout
+ kubectl get pods -n checkout-api
# 代码审查:"runbook 同 PR 更新 ✅ — 命令匹配新名"
# 事件取证(runbook 说错命令):
$ git blame runbooks/db-failover.md
a1b2c3d (Alice 2025-12-01) kubectl postgres failover --take-over primary
# → Alice 3 月前改此;CLI 标志现是 --promote
# → 回滚此行,修为 --promote,runbook 审计加测试
# 审计脚本读前置元:
$ yq '.last_reviewed' runbooks/checkout-slo-burn.md
2026-01-15 # <90 天,新鲜 ✅常见问题
- ⚠runbook 在 Confluence — 无版本、不可审查、静默腐;坏时无法见改了什么或回滚。
- ⚠runbook 在异于代码的仓 — 系统变和 runbook 更新在不同 PR,故代码审查抓不到耦合。
- ⚠无前置元 — 审计脚本找不到 owner 或 last_reviewed,故新鲜跟踪手动且不发生。
- ⚠runbook 变更不代 码审查 — 命令笔误静默发布并在最坏时坏 runbook。
最佳实践
- ✓runbook 存 git 服务仓(或中央 runbook 仓)带前置元(owner、alert、last_reviewed)。
- ✓要求 runbook 更新与系统变同 PR;代码审查拒绝坏 runbook 而不更新的变更。
- ✓像代码变更审 runbook 变更 — 命令笔误是 bug;要求审查者确认命令仍工作。
- ✓用 git blame 做事件取证;runbook 坏时见改了什么何时,若变更致事件则回滚。