essence · J · P0 · active

构建发布运行分离

Build/Release/Run Separation
P0基础verified本质 essence方法原则J · 部署GL-ESSENCE · 本质层

§1摘要与结论

TL;DR · 一句话结论

软件交付须严格分离构建、发布、运行三阶段:构建把代码转换为可执行制品,发布把制品与当次配置合并为带唯一标识的不可变版本,运行只启动选定版本,且运行阶段不存在把改动写回构建的通道。

别名:build release run、构建发布运行、三阶段分离、build/release/run | 英文:Build/Release/Run Separation | 类型:方法原则 / concept

§2局部关系图

构建发布运行分离 的 1-2 跳邻域关系图前置依赖(prerequisite):三阶段分离是环境一致性的前提前置依赖(prerequisite):运行阶段无变更入口是基础设施不可变的基础促成(enables):不可变与可追溯制品使部署成为受控变更依据推导(derives_from):部署流水线依据构建发布运行分离依据推导(derives_from):封闭构建依据构建阶段的可复现要求依据推导(derives_from):配置外置服务于开发生产一致性细化(refines):部署流水线是发布工程的落地机制细化(refines):封闭构建是发布工程的核心实践前置依赖(prerequisite):配置外置是流水线逐环境提升同一制品的前提实现(implements):镜像构建一次并不可变复用实现(implements):部署步骤脚本化与自动执行实现(implements):可复现部署支撑发布工程实现(implements):多阶段制品晋级即部署流水线促成(enables):流水线为部署自动化提供载体组合(combination):流水线产出不可变制品组合(combination):自动化与流水线配套落地构建发布运行分离构建发布运行分离(ESS-J-01)开发生产一致性开发生产一致性(ESS-J-02)不可变基础设施不可变基础设施(ESS-J-03)部署流水线部署流水线(MTH-J-01)封闭构建封闭构建(MTH-J-03)不可变基础设施实现不可变基础设施实现(TEC-J-02)部署流水线工具化部署流水线工具化(TEC-J-06)部署即变更管理部署即变更管理(ESS-J-04)发布工程发布工程(MTH-J-02)部署自动化部署自动化(TEC-J-05)配置外置与显式化配置外置与显式化(MTH-J-04)
前置依赖实现依据推导案例印证对比冲突
以本节点为中心,静态内联 1–2 跳邻域:内环 4 个直接邻接、外环 6 个二跳节点,共 11 个节点;连线按边类型着色(六类配色见下)。构建期计算,无运行期脚本。

§3原理 · 为什么

交付过程中真正的不确定性来自三个变量:用的是哪一份代码、配了哪一套配置、跑在哪一个环境。三者若纠缠在一起,任何一处的偶发改动都会污染整条交付链,使测试结论无法代表生产行为,也让事故根因难以定位。把构建、发布、运行严格分离,等于给每个变量划定清晰的边界:代码决定制品内容,配置决定这次部署的行为,环境只负责执行确定输入。分离之后,制品成为可被唯一识别、不可篡改的交付对象,是回滚与审计的稳定锚点;配置成为可独立管理的变化点,使同一制品能够跨环境复用;运行则退化为对已知输入的执行,不再承担编译与配置生成职责。由此,被测试的对象与实际运行的对象可以被证明是同一个,而不是各自拼装出的近似物。可以说,三阶段分离是对交付链的一次关注点分离,它让每个阶段只对一类输入负责,从而把复杂的交付过程拆成可独立验证、可独立改进的环节。这一分离是持续交付、可复现发布与可靠回滚共同的地基,也解释了现代交付实践为何反复强调构建一次、逐环境提升。

§4机制 · 如何运作

运行链路沿三步推进。构建阶段:在部署流程指定的某次提交上拉取依赖、编译代码并与静态资源一起打包,产出一个可执行的制品。发布阶段:把该制品与本次部署的当前配置合并,形成一个同时含有制品与配置、可在执行环境立即启动的发布版本,并为其分配唯一标识。运行阶段:在执行环境中针对选定的发布版本启动一组进程,使其对外提供服务。关键约束是发布版本一经创建即不可变更,它属于只追加的账本,任何改动都产生新的发布版本,而不是原地修改旧版本;同时运行时不应提供代码变更入口,运维人员也不应在生产环境就地修改程序。发布版本与配置的组合一旦确定,后续每个环境启动的都应是同一份组合,而不是各环境重新拼装的结果。这样一来,每一次对外服务都可以被回溯到唯一的制品与配置组合,状态变化有据可查,也为按版本回滚提供了确定的落点,使回滚成为一次可预期的版本选择而非重新构建。

§5工程 · 怎么落地

工程上应让同一次构建只产出一个制品,并让该制品逐环境提升,而不是每个环境各自重新构建。为此需要制品仓库保存不可变制品,需要发布账本记录每次发布的唯一标识与输入,使回滚等价于切换到先前的发布版本,而非临时重新构建。构建环境与运行环境应相互隔离:构建机不应持有生产凭据,运行环境不应具备编译能力,从而避免运行时绕过发布直接改动程序。配置通过运行时注入而非写入制品来体现环境差异,制品本身保持环境无关。还应把运行阶段的职责限定为启动与执行,把日志、指标等观测能力做成对运行环境无侵入的外围设施。把这些约束固化进交付流程并自动化执行,才能让三阶段分离成为可核查的纪律,而不是停留在口头约定的原则,也避免团队在压力下悄悄走回手工路径。

§6权衡卡

代价 · 风险

三阶段分离会引入额外的流程与制品管理成本:需要制品仓库、发布账本与配置注入机制,对规模很小或极少部署的系统未必划算,过度工程化反而拖慢交付。

反例 · 误区

最典型的反例是把三阶段混为一谈、以在生产机上直接改代码或热修代替重新构建并发布,导致生产上运行的代码与任何可追溯制品都不一致,回滚与审计同时失效。

另一个反例是运行时仍开放代码变更入口,使系统在不知不觉中偏离受测状态;还有一个反例是把分离理解为把职责推给不同团队,结果交接成本上升而交付并未改善。

原文要点
  • 配置与代码的分离可能带来配置散落、制品与配置版本不同步以及运行时缺失配置等新的失效面,需要额外的校验与治理。
  • 因此分离的程度应与系统的规模、变更频率、合规要求以及团队能力相匹配,在小系统中可以简化,但不应在关键系统中省略。

权衡原文仅按显式标记词归栏引用(收益 / 代价 / 反例),其余句子按原序列为「原文要点」;内容逐字引用未改写。

§7学习路径条

ESS-J-01构建发布运行分离→ESS-J-02开发生产一致性→ESS-J-03不可变基础设施

§8案例带

CAS-X-06 · 2 跳派生:当前节点 → MTH-J-03 → TEC-J-02

插件 DAG RC5→RC7 升级

一次知识库随上游源码版本升级的级联维护:以三层差异分析把 219 个包收敛为 26 个实质变更包,经编译、运行时、组合三类依赖判定更新 DAG 数据后全量重生成页面,并以静态门控加渲染验证收口。

CAS-X-18 · 2 跳派生:当前节点 → MTH-J-01 → TEC-J-06

AI Agent 架构 DAG 复盘

对四个工作日内独立完成三个异构对象 DAG 分析的方法论复盘,总结「采集→建模→生成→门控→交付」可复用管线与关键教训。

§9信源与核验

核验状态True(verified)
置信度high
复核日期2026-10-12
生命周期active
规范信源BK-031、BK-025、VEN-020、LOC-038
书证核验BK-031 ChV(direct),ChVI(partial)
勘误
常见误解:部署就是把源码复制到服务器并重新编译,构建与运行不必分离
核验结论:交付须严格分离构建、发布、运行:构建产出唯一制品,发布把制品与配置合并为不可变版本,运行只执行选定版本且无代码变更入口 [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
运行阶段无变更入口是基础设施不可变的基础

附对照资源 · 12factor 子库

12factor 节点关系对照说明
构建·发布·运行 app-build-run跨体系对照构建/发布/运行三阶段严格分离,对应母库同源本质与部署流水线
控制流与阶段治理 t-control跨体系对照确定性控制流/阶段分离保证可预测交付,对应阶段分离与自动化选择