【免费下载链接】architecture-decision-record
Architecture decision record (ADR) examples for software planning, IT leadership, and template documentation
这是一篇以 locales/en-gb/examples/continuous-integration/README.md 为绝对主体的深度解读文章。该文档是一份完整的 Architecture Decision Record(ADR)示例,记录了"决定实施持续集成(Continuous Integration,CI)"这一架构决策的完整论证过程。读完本文,你将掌握 ADR 的经典五段式结构(Context / Decision / Rationale / Consequences / Conclusion)如何被用于 CI 这类工程决策,了解如何把该决策翻译为可执行的自动化流水线,并能直接参照仓库内的模板、规范与写作建议,在团队中落地同样的实践。
一、文档定位:一份"决策即记录"的 CI 示例
在 architecture-decision-record 仓库中,locales/en-gb/examples/目录集中存放决策记录示例,涵盖 CSS 框架、环境变量配置、指标监控告警、Monorepo vs Multirepo、编程语言选型等主题(见 示例目录索引)。本文的主角——持续集成决策记录——是其中专门针对CI 工程实践的一篇,其同名页面 index.md 与之内容一致,保证多语言站点下每个页面都有独立可读的正文。
要读懂这份示例,需要先建立 ADR 的基本概念。仓库文档 what-is-an-architecture-decision-record 给出了权威定义:
- ADR(Architecture Decision Record):记录一项重要架构决策及其背景(context)与后果(consequences)的文档;
- AD(Architecture Decision):针对某个重要需求做出的软件设计选择——本文中的 AD 就是"实施持续集成";
- ADL(Architecture Decision Log):某个项目(或组织)创建并维护的全部 ADR 的集合;
- ASR(Architecturally-Significant Requirement):对系统架构产生可度量影响的需求。
一句话概括这份 CI ADR 的用途:它把"要不要上 CI"这样一次抽象的技术争论,沉淀为一份任何人(包括未来的开发者、审计者、AI 代理)都能快速理解、引用和追溯的结构化文档。
二、逐节精读:这份 CI ADR 的完整五段式结构
原文档虽短,但结构非常完整,是"决策记录该有的样子"的典型样例。下面逐节展开,原文要点全部保留并加以阐释。
2.1 Context(背景)——先讲清楚"为什么痛"
原文(意译):
由于手工测试、手工构建和手工部署,公司在开发流程上遇到了挑战,导致软件在质量和交付上频繁出现延误、错误和不一致。
这是整份 ADR 的"问题陈述",也是后续一切论证的起点。它遵循了仓库写作规范中的要求——好的 Context 要解释组织的处境与业务优先级(详见 suggestions-for-writing-good-adrs)。这里的三类痛点(手工测试、手工构建、手工部署)恰好对应 CI 流水线将要自动化的三个环节,为后面的 Rationale 埋下伏笔。
2.2 Decision(决策)——用一句话明确表态
原文:
实施持续集成,作为解决开发流程中所遇挑战的方案。
决策部分只有一个动作:实施持续集成。这符合好 ADR"Specific(每个 ADR 只针对一个决策)"的特征——它没有把"持续集成 + 持续交付 + 容器化 + 微服务"捆绑成一份文档,而是聚焦单一决策,便于独立评审、独立追踪和独立推翻。
2.3 Rationale(理由)——论证"为什么这个方案能解决问题"
原文:
持续集成将以及时、高效的方式自动构建、测试和部署代码变更到交付环境。它将允许新功能在不干扰软件稳定性的前提下集成进代码库。持续集成将提升软件的质量与交付,减少解决错误所需的时间,并提高利益相关者的满意度。
这段理由完整覆盖了 CI 的核心价值主张,可以拆成四个可验证的断言:
- 自动化三连:自动构建、自动测试、自动部署,直指 Context 中的"手工"痛点;
- 稳定集成:频繁、小步地合并代码,把集成问题提前暴露,避免"大爆炸式合并"冲击主干稳定性;
- 质量与交付:质量提升是自动测试的直接产物,交付提速来自消除人工瓶颈;
- 利益相关者满意度:更短的错误修复周期、更可预期的发布节奏,属于可度量的组织收益。
这四个断言恰好可以作为后续"落地验证"的验收标准:流水线是否真的自动构建/测试/部署?主干是否长期保持绿色?故障恢复时间是否缩短?(这些属于决策执行后的度量指标,原文档未列出具体数值,本文也不虚构。)
2.4 Consequences(后果)——收益与代价并列,不回避成本
原文将后果分为正反两面,这是 ADR 区别于普通会议纪要的关键——它同时记录代价。
正面:
- 提升软件质量与交付水平;
- 通过自动化节省时间与成本;
- 增强开发团队内部的协作与集成。
负面:
- 实施该技术存在初始成本;
- 需要在人员、工具和流程上进行前期投入;
- 实施过程中存在技术困难的风险。
值得注意的是"Negative"部分的成熟度:它没有把 CI 描述成零成本灵丹妙药,而是承认了人员、工具、流程三方面的前期投入和实施风险。这正是 suggestions-for-writing-good-adrs 中"Consequences 要解释决策带来的影响、产出、后续事项"的要求——一份只有好处没有代价的 ADR 是缺乏决策参考价值的。
2.5 Conclusion(结论)——成本收益权衡后拍板
原文:
实施持续集成的收益超过了投资成本与潜在风险,因此该决策已获批准。
结论是对 Rationale 与 Consequences 的收束:采用显式的"收益 > 成本 + 风险"权衡逻辑,并给出决策状态(approved)。这也是 ADR 生命周期管理的起点——按仓库的模板规范,一条决策的状态通常可以是proposed | accepted | rejected | deprecated | superseded(见 MADR 模板),本示例文档实际上处于"accepted"状态,只是用 Conclusion 的措辞表达。
三、落地第一步:把"实施 CI"翻译成可执行的自动化流水线
决策被批准只是开始。原文档的 Decision 承诺了"自动构建、测试、部署",那么落地时就需要把这些承诺变成流水线里的具体步骤。一个最小可行的 CI 流水线通常包含以下阶段,每一阶段都对应原文档 Rationale 中的一个断言:
| 流水线阶段 | 对应 Rationale 断言 | 典型动作 |
|---|---|---|
| 触发 | 及时、高效 | 每次 push / 每个 PR 自动触发,无需人工点击 |
| 构建 | 自动构建 | 安装依赖、编译/打包产物 |
| 测试 | 自动测试 | 单元测试、集成测试、静态检查 |
| 检查 | 稳定集成 | 代码规范、可访问性、构建产物校验 |
| 部署 | 自动部署到交付环境 | 发布到测试/预生产/生产环境 |
关于"每一类检查如何写成脚本挂进流水线",本仓库自身就是一个很有说服力的实证案例——虽然仓库本身不是 CI 平台,但它的工程化程度展示了"可被 CI 调用的验证脚本"应该长什么样。以 网站子项目 的 package.json 为例:
"scripts": { "dev": "node scripts/generate-llms.mjs && node scripts/generate-sitemap.mjs && vite dev", "build": "node scripts/generate-llms.mjs && node scripts/generate-sitemap.mjs && vite build", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "test": "node --test \"tests/*.test.mjs\"", "verify": "node scripts/check-built-site.mjs", "a11y": "node scripts/check-accessibility.mjs", "content": "node scripts/sync-locales.mjs && node scripts/generate-search-index.mjs && node scripts/generate-llms.mjs && node scripts/generate-sitemap.mjs" }这套脚本体系与 CI 流水线的映射关系非常清晰:
- 构建与内容生成:
build命令先执行 generate-llms.mjs 与 generate-sitemap.mjs 再执行vite build,对应 CI 的"构建阶段";content命令则串联 sync-locales.mjs、generate-search-index.mjs 等脚本,对应"数据准备 + 构建"的组合阶段; - 测试:
test使用 Node 内置的node --test运行 tests/route-for-languages.test.mjs,对应 CI 的"测试阶段"; - 产物校验:
verify调用 check-built-site.mjs 检查构建产物,a11y调用 check-accessibility.mjs 做可访问性检查——这两者正是"构建之后、部署之前"的质量门禁; - 类型检查:
check运行svelte-check,可作为流水线中并行执行的静态分析任务。
从中可以提炼出一条可复用的落地经验:把"人肉检查"逐个脚本化、命令化,是让 CI 真正生效的前提。每当你发现团队还在手工执行某个验证步骤,就把它写成一个npm run xxx(或等价命令),然后挂到流水线里,让机器替你执行原文档 Context 中抱怨的那些"手工"环节。
需要说明的适用前提:以上脚本是仓库网站子项目的构建与验证体系,而非该仓库对外提供的 CI 模板;实际接入哪种 CI 平台(GitHub Actions、GitLab CI、Jenkins 等)属于团队自己的工程选型,本仓库并未限定。
四、落地第二步:用 ADR 治理 CI 决策的后续演进
原文档的 Consequences 提到"实施过程中存在技术困难的风险",而好的 ADR 实践会在决策执行后持续跟踪。仓库文档 suggestions-for-writing-good-adrs 明确建议:
- 一个 ADR 常常会触发更多 ADR:当一个 ADR 做出大的总体选择后,往往会衍生出更多更小的决策。对 CI 而言,典型的后续决策包括:选用哪个 CI 平台、构建产物如何缓存、测试环境如何隔离、部署门禁如何设置、失败通知发到哪个渠道——这些都应各自形成新的 ADR,而不是把原 CI ADR 越写越臃肿;
- 执行后复盘(after-action review):团队习惯在决策后约一个月回看 ADR,将文档中的预期与实际结果对照,以便学习和改进;
- 不可变性(Immutable):不要修改已有 ADR 中的历史信息;需要变更时,通过新增内容或创建新 ADR 来"supersede"旧决策。仓库技能文档 architecture-decision-record-skill 给出了标准的替代流程:新建 ADR → 将旧 ADR 状态改为
Superseded by [新 ADR]→ 在新 ADR 中反向链接Supersedes [旧 ADR]。
落地时建议为 CI 决策链建立简单的编号与引用关系,例如:
0001-implement-continuous-integration.md(本文解读的主决策,accepted)0002-choose-ci-platform.md(被 0001 触发,proposed / accepted)0003-set-up-deployment-gate.md(被 0001 触发)
命名遵循仓库的 文件名规范:现在时祈使短语 + 小写连字符 + .md 后缀(如implement-continuous-integration.md、choose-ci-platform.md),可读性好且与 git 提交信息风格一致。而目录组织可参考 how-to-start-using-adrs-with-git 的做法:
$ mkdir adr # 为 ADR 文件创建目录 $ vi adr/0001-implement-continuous-integration.md # 为每个 ADR 创建文本文件 $ git add adr/ && git commit -m "Add CI decision record" # 提交到 git 仓库五、写作要点:如何把"CI 决策"写成一份经得起审计的 ADR
如果你要为自己的团队复制这份 CI ADR,可以参考仓库文档 suggestions-for-writing-good-adrs 提炼出的写作清单:
- Rationale 要讲透"为什么":不仅写"我们采用 CI",还要写清备选方案(如继续手工流程、只做部分自动化、购买托管 CI 服务)各自的利弊、成本收益对比,以及最终取舍理由;
- 一次只决策一件事:CI 是独立决策,不要把"同时引入容器化、微服务、DevOps 平台"捆绑进同一份 ADR;
- 给可变信息打时间戳:工具定价、构建时长、团队规模、计划日程等会随时间变化的内容,应标注记录时间,避免信息过期后误导读者;
- Context 说清组织处境:包括业务优先级、团队技能构成、现有流程痛点(本示例的"手工测试/构建/部署"即是绝佳示范);
- Consequences 双向记录:既要写收益(质量、交付、协作),也要写代价(初始成本、人员工具流程投入、实施风险),并预告由它触发的后续 ADR;
- 显式给出状态:在文档顶部或结论处标注
proposed | accepted | rejected | deprecated | superseded。
关于模板选型,仓库 模板目录 提供了十余种风格,针对 CI 这类决策可参考技能文档的选型表:
| 场景 | 推荐模板 |
|---|---|
| 默认/多数团队/不确定 | Nygard 模板(Title、Status、Context、Decision、Consequences),本示例即属此类 |
| 想要带选项与正反论证的轻量模板 | MADR 模板(含 Considered Options、Pros and Cons) |
| 需要快速高管审批的窄技术选型(如 CI 平台) | Important Technical Decision(ITD)模板 |
| 需要成本分析、SWOT 与干系人意见的选型 | Business case 模板 |
若团队尚未建立任何 ADR 习惯,仓库的 how-to-start-using-adrs 给出了从零启动的五步路线:决策识别(判断该决策的紧迫性与重要性,维护"决策待办清单")→ 决策制定(借助对话映射等决策技术)→ 决策实施与执行(通过架构导向的代码评审落地)→ 决策分享(可选,跨项目复用经验)→ 决策文档化(选择模板与工具)。
结语
这份 持续集成决策记录 的价值不在篇幅,而在结构:它用 Context 定义问题、用 Decision 明确方向、用 Rationale 建立论证、用 Consequences 摆出代价、用 Conclusion 完成权衡——五段俱全,正是"可被未来开发者、审计者与 AI 代理理解、检索和引用"的理想形态。把它当作模板:先在团队里写下属于你们的 CI 决策记录,再把决策翻译成流水线里一个又一个可自动执行的脚本与门禁,最后用"后续 ADR + 定期复盘"让决策持续保鲜。从一份文档到一套自动化实践,这就是架构决策记录最完整的生命周期。
【免费下载链接】architecture-decision-record
Architecture decision record (ADR) examples for software planning, IT leadership, and template documentation
相关推荐
ADR 实战:用架构决策记录(Architecture Decision Record)落地持续集成(Continuous Integration)
ADR 实战:用架构决策记录(Architecture Decision Record)落地持续集成(Continuous Integration) 导读 本文
architecture-decision-record 仓库实战:用 ADR 记录「引入持续集成」决策的完整指南
architecture decision record 仓库实战:用 ADR 记录「引入持续集成」决策的完整指南 本文以 locales/de 001/bei
用 Architecture Decision Record 落地持续集成:以 architecture-decision-record 仓库丹麦语示例为骨架的 ADR 撰写实战指南
用 Architecture Decision Record 落地持续集成:以 architecture decision record 仓库丹麦语示例为骨架的
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考