构建发布运行分离
§1摘要与结论
软件交付须严格分离构建、发布、运行三阶段:构建把代码转换为可执行制品,发布把制品与当次配置合并为带唯一标识的不可变版本,运行只启动选定版本,且运行阶段不存在把改动写回构建的通道。
别名:build release run、构建发布运行、三阶段分离、build/release/run | 英文:Build/Release/Run Separation | 类型:方法原则 / concept
§2局部关系图
§3原理 · 为什么
交付过程中真正的不确定性来自三个变量:用的是哪一份代码、配了哪一套配置、跑在哪一个环境。三者若纠缠在一起,任何一处的偶发改动都会污染整条交付链,使测试结论无法代表生产行为,也让事故根因难以定位。把构建、发布、运行严格分离,等于给每个变量划定清晰的边界:代码决定制品内容,配置决定这次部署的行为,环境只负责执行确定输入。分离之后,制品成为可被唯一识别、不可篡改的交付对象,是回滚与审计的稳定锚点;配置成为可独立管理的变化点,使同一制品能够跨环境复用;运行则退化为对已知输入的执行,不再承担编译与配置生成职责。由此,被测试的对象与实际运行的对象可以被证明是同一个,而不是各自拼装出的近似物。可以说,三阶段分离是对交付链的一次关注点分离,它让每个阶段只对一类输入负责,从而把复杂的交付过程拆成可独立验证、可独立改进的环节。这一分离是持续交付、可复现发布与可靠回滚共同的地基,也解释了现代交付实践为何反复强调构建一次、逐环境提升。
§4机制 · 如何运作
运行链路沿三步推进。构建阶段:在部署流程指定的某次提交上拉取依赖、编译代码并与静态资源一起打包,产出一个可执行的制品。发布阶段:把该制品与本次部署的当前配置合并,形成一个同时含有制品与配置、可在执行环境立即启动的发布版本,并为其分配唯一标识。运行阶段:在执行环境中针对选定的发布版本启动一组进程,使其对外提供服务。关键约束是发布版本一经创建即不可变更,它属于只追加的账本,任何改动都产生新的发布版本,而不是原地修改旧版本;同时运行时不应提供代码变更入口,运维人员也不应在生产环境就地修改程序。发布版本与配置的组合一旦确定,后续每个环境启动的都应是同一份组合,而不是各环境重新拼装的结果。这样一来,每一次对外服务都可以被回溯到唯一的制品与配置组合,状态变化有据可查,也为按版本回滚提供了确定的落点,使回滚成为一次可预期的版本选择而非重新构建。
§5工程 · 怎么落地
工程上应让同一次构建只产出一个制品,并让该制品逐环境提升,而不是每个环境各自重新构建。为此需要制品仓库保存不可变制品,需要发布账本记录每次发布的唯一标识与输入,使回滚等价于切换到先前的发布版本,而非临时重新构建。构建环境与运行环境应相互隔离:构建机不应持有生产凭据,运行环境不应具备编译能力,从而避免运行时绕过发布直接改动程序。配置通过运行时注入而非写入制品来体现环境差异,制品本身保持环境无关。还应把运行阶段的职责限定为启动与执行,把日志、指标等观测能力做成对运行环境无侵入的外围设施。把这些约束固化进交付流程并自动化执行,才能让三阶段分离成为可核查的纪律,而不是停留在口头约定的原则,也避免团队在压力下悄悄走回手工路径。
§6权衡卡
三阶段分离会引入额外的流程与制品管理成本:需要制品仓库、发布账本与配置注入机制,对规模很小或极少部署的系统未必划算,过度工程化反而拖慢交付。
最典型的反例是把三阶段混为一谈、以在生产机上直接改代码或热修代替重新构建并发布,导致生产上运行的代码与任何可追溯制品都不一致,回滚与审计同时失效。
另一个反例是运行时仍开放代码变更入口,使系统在不知不觉中偏离受测状态;还有一个反例是把分离理解为把职责推给不同团队,结果交接成本上升而交付并未改善。
- 配置与代码的分离可能带来配置散落、制品与配置版本不同步以及运行时缺失配置等新的失效面,需要额外的校验与治理。
- 因此分离的程度应与系统的规模、变更频率、合规要求以及团队能力相匹配,在小系统中可以简化,但不应在关键系统中省略。
权衡原文仅按显式标记词归栏引用(收益 / 代价 / 反例),其余句子按原序列为「原文要点」;内容逐字引用未改写。
§7学习路径条
§8案例带
插件 DAG RC5→RC7 升级
一次知识库随上游源码版本升级的级联维护:以三层差异分析把 219 个包收敛为 26 个实质变更包,经编译、运行时、组合三类依赖判定更新 DAG 数据后全量重生成页面,并以静态门控加渲染验证收口。
AI Agent 架构 DAG 复盘
对四个工作日内独立完成三个异构对象 DAG 分析的方法论复盘,总结「采集→建模→生成→门控→交付」可复用管线与关键教训。
§9信源与核验
核验结论:交付须严格分离构建、发布、运行:构建产出唯一制品,发布把制品与配置合并为不可变版本,运行只执行选定版本且无代码变更入口 [BK-031]
§10原始关系清单
展开:本节点的全部原始关系边(4 条,含边 ID 与方向)
| 关系 | 方向 | 对端节点 | 说明 |
|---|---|---|---|
| 依据推导 | ← MTH-J-01 | 部署流水线 E-524 | 部署流水线依据构建发布运行分离 |
| 依据推导 | ← MTH-J-03 | 封闭构建 E-525 | 封闭构建依据构建阶段的可复现要求 |
| 前置依赖 | → ESS-J-02 | 开发生产一致性 E-521 | 三阶段分离是环境一致性的前提 |
| 前置依赖 | → ESS-J-03 | 不可变基础设施 E-522 | 运行阶段无变更入口是基础设施不可变的基础 |