概述
默认情况下,每个快照构建都是一次完整构建——从干净的基础镜像启动,克隆所有代码仓库,并从头运行每个蓝图。这样可以确保环境完全可复现,但如果你只改动了多个蓝图中的一个,构建速度可能会比较慢。 差异构建通过复用上一次成功构建的快照作为起点来优化这一过程。只有蓝图实际发生变化的工作区会重新构建;未发生变化的工作区则会按原样继承自父构建。这样可以显著缩短构建时间,尤其适用于拥有大量代码仓库的组织。启用差异构建
1
前往环境设置
前往 设置 > 环境 > Advanced。
2
开启开关
打开 差异构建 开关。说明为:“通过复用未更改的工作区来加快构建速度。”
3
触发构建
保存蓝图更改或点击 构建快照。如果存在有效的父构建,下一次构建将尝试以差异构建方式运行。
工作方式
当启用差异构建并触发构建时,系统会按以下流程运行:
- 查找父构建
系统会查找最近一次成功的构建 (状态为 success 或 partial) ,该构建需具有面向相同平台和 Machine Configuration 的 快照镜像,并将其作为父构建使用。如果没有符合条件的父构建,系统会自动退回到完整构建。
- 比较蓝图
系统会将每个工作区的配置与父构建进行比较。系统会计算每个工作区输入内容的摘要值——包括蓝图内容、附加文件和 secrets——并检查哪些内容发生了变化。
- 分配工作区操作
根据比较结果,每个工作区都会被分配以下三种操作之一:
对于继承的工作区,
initialize 不会再次运行。请编写 maintenance,
确保它是自包含的,并且能在拉取最新代码后独立运行。
它可以使用父快照中已安装的工具和运行时,
但不得要求必须先立即运行 initialize,也不得依赖
initialize 先前写入 $ENVRC 的环境变量。
- 执行构建
构建将基于父构建的快照镜像启动,而不是从全新的基础环境开始。这意味着:
- 继承的工作区 已预先安装好所需的工具、运行时和依赖。系统会拉取最新代码 (
git pull) ,并运行maintenance命令来更新依赖。 - 重新构建的工作区 会从头开始设置——重新克隆,并完整执行
initialize+maintenance流程。 - 已移除的工作区 的目录会被清理。
initialize (因为这些工具已存在于父镜像中) ,只运行 maintenance。
每次构建开始时,都会重置
$ENVRC,包括差异构建。
此前构建写入 $ENVRC 的环境变量和 PATH 条目
不会被继承。如果 maintenance 需要这些内容,则必须自行
进行配置。何时会改为执行完整构建
即使启用了差异构建,在以下情况下构建仍会以完整构建的方式执行:- 你主动请求完整构建 — 你在 构建快照 下拉菜单中选择了 完整构建
- 最新的完整构建过于陈旧 — 自动构建 (例如保存蓝图所触发的构建) 在以下情况下会以完整构建方式执行:其对应平台尚无任何完整构建,或最新的完整构建早于 Settings > Environment > Advanced 中的 Full build refresh 间隔 (默认每 7 天)
- 不存在可复用的父构建 — 没有平台和 machine configuration 相同、且带有 快照镜像 的
success或partial构建 - 父构建不兼容 — 自父构建以来,平台、machine configuration、基础镜像 或 Clone repositories on all platforms 设置发生了变化,或父构建没有可供比对的 secrets 基线环境
- 组织或企业配置发生变化 — 自父构建以来,组织或企业蓝图、蓝图文件或 secrets 发生了变化
查看构建类型
构建完成后,你可以查看它是以差异构建还是完整构建方式运行的:- 前往 设置 > 环境 > 快照
- 点击历史记录中的某个构建
- Build kind 标记会显示 Differential (蓝色) 或 完整构建 (默认)
- Differential: “仅重新构建已更改的工作区;未更改的工作区将沿用上一次使用相同配置成功构建的结果”
- 完整构建: “所有工作区都会从头开始构建”
优势
手动触发完整构建
即使已启用差异构建,你也可以通过 构建快照 按钮强制执行一次完整构建。使用下拉菜单选择 完整构建,而不是默认的差异构建选项。 我们建议你定期执行完整构建,以清除继承的状态,并验证你的蓝图是否仍然能够从头创建环境。在移除或替换可能在快照中留下过时文件、工具或依赖的设置后,也请执行一次完整构建。完整构建会重新运行所有initialize 和 maintenance 步骤。
常见问题
启用差异构建会影响我的会话吗?
启用差异构建会影响我的会话吗?
不会。无论快照是如何构建的,会话始终都会从最终快照启动。唯一的区别只是构建速度。
如果差异构建生成了有问题的快照怎么办?
如果差异构建生成了有问题的快照怎么办?
在 设置 > 环境 > 快照 中固定一个先前已知正常的构建,然后触发一次完整构建,以获得干净的快照。你也可以完全禁用差异构建,改回使用完整构建。
部分构建可以作为父构建吗?
部分构建可以作为父构建吗?
可以。状态为
partial 的构建 (某些工作区成功,某些失败) 可以作为父构建。系统只会继承父构建中成功的工作区内容。
