Skip to content
返回架构决策

ADR 工具链

生成、lint 和索引 ADR 的工具,让集合超过 20 条时仍保持一致。

为什么

5 条 ADR 可以手工管;50 条时编号漂移、状态过期、没人能找到关于队列的决策。工具自动化无聊的部分——编号、状态校验、交叉引用检查和索引页——让人力花在推理上。装了 adr-tools 的仓库能抓到一条实际已被替代却仍标 'Status: Accepted' 的 ADR,那是误导每个新人的谎言。

何时使用

一旦有 ≥10 条 ADR 或预期快速增长。搭建耗时 1-2 小时。仅当项目永远只有几条决策时可跳过。

如何做

1. 安装 adr-tools(npm i -g adr-tools)或用仓库内脚本
2. 加 CI 步骤,在每个触及 docs/adr/ 的 PR 上跑 'adr lint'
   - 检查:必填字段存在、状态是合法枚举、编号单调
3. 生成索引:'adr list' → docs/adr/README.md(CI 自动重生成)
   - 表格:编号 | 标题 | 状态 | 日期,按编号排序
4. 加 'adr graph' 命令(或小脚本),把替代链接渲染成 Mermaid 图
5. 把索引和图接入内部文档站,一键可达

示例

.github/workflows/adr.yml:
  on: [pull_request]
  jobs:
    adr:
      - run: npx adr-tools lint docs/adr/
      - run: npx adr-tools list --format markdown > docs/adr/README.md

adr graph 输出(Mermaid):
  graph LR
    ADR0007[PostgreSQL] -->|superseded by| ADR0012[ClickHouse 事件]
    ADR0009[RabbitMQ] -->|superseded by| ADR0013[Kafka]

常见问题

  • ⚠自动生成的索引过期,因为 CI 只在触及 docs/adr/ 的 PR 上重生成——每次推 main 都跑,以抓手工编辑。

最佳实践

  • ✓在 package.json 里锁定 adr-tools 版本,避免破坏性发布突然搞挂每个 PR。
  • ✓让 'adr graph' 输出真正的 SVG 提交到仓库——非工程师读不了 Mermaid 源码但能读图。
  • ✓给每条 ADR 加 'last reviewed' 日期,加季度 CI 任务标记 12 个月未评审的 ADR 做新鲜度检查。

相关资源