Skip to main content

概述

默认情况下,每个快照构建都是一次完整构建——从干净的基础镜像启动,克隆所有代码仓库,并从头运行每个蓝图。这样可以确保环境完全可复现,但如果你只改动了多个蓝图中的一个,构建速度可能会比较慢。 差异构建通过复用上一次成功构建的快照作为起点来优化这一过程。只有蓝图实际发生变化的工作区会重新构建;未发生变化的工作区则会按原样继承自父构建。这样可以显著缩短构建时间,尤其适用于拥有大量代码仓库的组织。

启用差异构建

1

前往环境设置

前往 设置 > 环境 > Advanced。
2

开启开关

打开 差异构建 开关。说明为:“通过复用未更改的工作区来加快构建速度。”
3

触发构建

保存蓝图更改或点击 构建快照。如果存在有效的父构建,下一次构建将尝试以差异构建方式运行。
启用差异构建并不会强制执行完整构建。如果针对相同平台和 machine configuration 已存在此前成功或部分成功的构建,下一次构建可以将其作为父构建并继承其状态。只有在 何时改为执行完整构建 中列出的情况下,下一次构建才会以完整构建方式运行。若要从干净的基线环境开始,请从 构建快照 下拉菜单中选择 完整构建。

工作方式

当启用差异构建并触发构建时,系统会按以下流程运行:

1. 查找父构建

系统会查找最近一次成功的构建 (状态为 success 或 partial) ,该构建需具有面向相同平台和 Machine Configuration 的 快照镜像,并将其作为父构建使用。如果没有符合条件的父构建,系统会自动退回到完整构建。

2. 比较蓝图

系统会将每个工作区的配置与父构建进行比较。系统会计算每个工作区输入内容的摘要值——包括蓝图内容、附加文件和 secrets——并检查哪些内容发生了变化。

3. 分配工作区操作

根据比较结果,每个工作区都会被分配以下三种操作之一:
对于继承的工作区,initialize 不会再次运行。请编写 maintenance, 确保它是自包含的,并且能在拉取最新代码后独立运行。 它可以使用父快照中已安装的工具和运行时, 但不得要求必须先立即运行 initialize,也不得依赖 initialize 先前写入 $ENVRC 的环境变量。

4. 执行构建

构建将基于父构建的快照镜像启动,而不是从全新的基础环境开始。这意味着:
  • 继承的工作区 已预先安装好所需的工具、运行时和依赖。系统会拉取最新代码 (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 发生了变化
仅作用于单个代码仓库的变更不会影响构建的差异性。新增的代码仓库、某个代码仓库的蓝图或 secrets 变更,以及在父构建中失败的代码仓库,都会在差异构建中重新构建。调整代码仓库顺序不会触发完整构建。 如果一个按差异构建方式请求的构建最终以完整构建方式执行,构建详情页上的 Build kind 提示框会说明原因。

查看构建类型

构建完成后,你可以查看它是以差异构建还是完整构建方式运行的:
  1. 前往 设置 > 环境 > 快照
  2. 点击历史记录中的某个构建
  3. Build kind 标记会显示 Differential (蓝色) 或 完整构建 (默认)
将鼠标悬停在标记上,可查看说明每种类型含义的提示:
  • Differential: “仅重新构建已更改的工作区;未更改的工作区将沿用上一次使用相同配置成功构建的结果”
  • 完整构建: “所有工作区都会从头开始构建”

优势

手动触发完整构建

即使已启用差异构建,你也可以通过 构建快照 按钮强制执行一次完整构建。使用下拉菜单选择 完整构建,而不是默认的差异构建选项。 我们建议你定期执行完整构建,以清除继承的状态,并验证你的蓝图是否仍然能够从头创建环境。在移除或替换可能在快照中留下过时文件、工具或依赖的设置后,也请执行一次完整构建。完整构建会重新运行所有 initialize 和 maintenance 步骤。

常见问题

不会。无论快照是如何构建的,会话始终都会从最终快照启动。唯一的区别只是构建速度。
在 设置 > 环境 > 快照 中固定一个先前已知正常的构建,然后触发一次完整构建,以获得干净的快照。你也可以完全禁用差异构建,改回使用完整构建。
可以。状态为 partial 的构建 (某些工作区成功,某些失败) 可以作为父构建。系统只会继承父构建中成功的工作区内容。