12 Factor 方法论合并知识图谱 / 分组目录 / 12 Factor App 体系 / 构建·发布·运行

构建·发布·运行

App 体系进阶方法原则GA · 12 Factor App 体系

What · 是什么

严格分离构建、发布、运行三阶段
codebase 经三阶段转变为非开发 deploy:build 阶段把代码仓库转换为可执行 bundle,按部署进程指定的提交版本拉取 vendored 依赖并编译二进制与资源。
release 阶段把 build 与 deploy 当前 config 组合,产出同时包含 build 与 config、可立即在运行环境执行的 release。
run 阶段(runtime)在运行环境中启动一组应用进程,针对选定的 release 运行,是应用真正服务的阶段。
十二要素应用严格分离 build、release、run 三阶段:例如运行时不可能改动代码,因为改动无法传播回 build 阶段。
部署工具通常提供发布管理能力,最显著的是回滚到先前 release,保障发布安全,这保证了发布过程的可追溯与可回滚。
每个 release 应有唯一 ID,如时间戳 2011-04-06-20:32:17 或递增数字 v100,便于定位与回退。
release 是只追加的账本:创建后不可变更,任何变更都必须产生新 release,保证账本可信。
build 由开发者在新代码部署时发起;run 可自动发生(服务器重启、崩溃进程被进程管理器重启),故 run 阶段应保持最少活动部件。
build 阶段可以更复杂,因为错误总是发生在前台驱动部署的开发者面前,可及时处理与修正,使运行期行为与构建产物严格一致,杜绝热改隐患。

Why · 为什么

原理 · Principle

运行时改动无法传播回 build,严格分离保证运行期行为与构建产物一致,杜绝热改隐患,这保证了发布过程的可追溯与可回滚。

release 含 build+config 且不可变,使回滚成为选择先前 release 的简单操作,发布安全。

run 阶段最小化活动部件:运行问题会在无开发者到场的深夜自动重启时爆发,越简单越健壮,使运行期行为与构建产物严格一致,杜绝热改隐患。

How · 怎么做

把代码转换(build)、组合 config(release)、启动进程(run)严格分离为独立阶段,各司其职。
用部署工具的 release 管理能力做回滚,例如 Capistrano 的 rollback 命令。
Capistrano 在 releases 子目录存放各版本,当前 release 是指向当前版本目录的 symlink,rollback 命令可快速回退。
每个 release 打唯一 ID(时间戳或递增数字),保证可精确引用,这保证了发布过程的可追溯与可回滚。
release 只追加、创建后不可变,任何变更新建 release,保持账本完整,使运行期行为与构建产物严格一致,杜绝热改隐患。
build 由开发者驱动可复杂;run 自动发生应保持最少活动部件,降低自动场景风险,是十二要素发布可靠性设计的核心机制。

案例 · Cases

代表性案例
Capistrano:releases 子目录 + 当前版本 symlink + rollback 命令,快速回退到先前版本。
release ID 示例:时间戳 2011-04-06-20:32:17 或递增数字 v100,两种格式均可采用。
服务器重启、崩溃进程被进程管理器重启等 run 阶段自动执行场景,常发生在深夜无开发者在场时,这保证了发布过程的可追溯与可回滚。
发布新代码时开发者驱动 build 阶段,把提交固定到部署进程指定的版本上,使运行期行为与构建产物严格一致,杜绝热改隐患。

反模式 · Anti-patterns

相关边

实践资源 · 源码引用

路径说明
08-source/app-content-en/build-release-run.mdV. Build, release, run 原文:三阶段定义/回滚/release 不可变/run 最小化
08-source/app-content-en/codebase.mdbuild 的输入 codebase 定义
08-source/app-content-en/config.mdrelease 与 config 组合的交叉引用
08-source/app-content-en/processes.mdrun 阶段启动进程的交叉引用