Build Cache - 概述
此功能仅在 Incredibuild 的 Enterprise and Business Plans 中可用,且当前的可用性有限。欲了解更多详情,请联系您的客户代表。
Build Cache 可重用先前构建部分,从而节省时间和资源。当您运行构建时,我们将输出存储在文件缓存中。当运行将来构建时,我们需要检查缓存以免重新生成构建部分未进行更改。
这可能会产生重大影响,因为您可以重用存储在 Build Cache 的先前构建数据,从而在不影响带宽的情况下大幅缩短构建时间。
为实现这一点,Build Cache 有特定的 System Requirements 和 Supported Tools。
优势和用例
-
在任何方面提高开发人员的工作效率
每次切换分支时,停止从头开始运行构建,即使已在其他地方构建完成。Build Cache 会自动存储以前的构建数据,并大大减少本地构建时间。 -
在不影响速度的情况下居家构建
由于上行带宽有限,居家办公会影响构建速度。Build Cache 允许您更多地依赖下游带宽,在开始新构建时为您提供更快的速度和更好的性能。 -
在 CI 构建之间使用缓存数据
使用 Build Cache 与另一个 CI 服务器共享由 CI 服务器生成的构建工件,从而节省时间和资源。为您的 CI 带来增量构建体验。 -
重用 CI 结果以加快开发构建
Build Cache 允许开发人员重用在后续的 CI 构建和工作流上生成的输出,即使在处理先前的版本时,而不必合并从版本控制重新启动构建时所做的每一项更改。
许可证模式
Build Cache 使用称为 Cache Cores 的特殊许可证。每当使用 Build Cache为您节省一个小时的 Helper 内核生产时间时,就会消耗一个缓存内核。Cache Cores 可重复使用,每小时刷新一次。
如果 Cache Cores 耗尽,数据仍会写入缓存,但在刷新 Cache Cores 之前无法读取。您可以在 Agent List 顶部查看有关许可证使用情况的信息。
如果除了本地许可证外,您还使用 Incredibuild Cloud,请参阅 Using Build cache with Incredibuild Cloud 以了解这些许可证如何交互。
Build Cache 的工作原理
Build Cache 可以检查每个任务(编译或其他),并决定是否可以使用现有的缓存内容,或者任务是否需要运行。假设如果任务输入(源文件、标题文件、预编译标头文件等)没有更改,则产生的工件(目标文件、PDB 等)也不会有显著更改。假设大多数任务和整个构建都具有确定性。构建中的任何不确定部分都需要在每次构建时重新运行,并且不会通过 Build Cache 进行改进。
确定性构建是使用相同构建环境和构建指令构建相同源代码的过程,该过程会在两个构建中产生相同的二进制文件,即使它们是在不同的机器、构建目录和不同的名称上进行。如果保证可以生成相同的二进制文件,即使从不同文件夹编译,这种构建有时也称为可复制或密封的构建。
创建和管理缓存
基于代码依赖关系,构建通常以树状结构进行处理。第 1 层的文件被用来创建第 2 层的文件,第 2 层被用来创建第 3 层的文件,以此类推,直到产生最终输出。
随着构建的处理,Incredibuild 会保存流程的细节,以供将来使用。由其他文件产生的每一个部分都作为一对输入文件和输出文件保存在缓存中。如果您在更改一些文件后运行构建,Build Cache 可以使用相同部分来阻止部分进程的运行。
Build Cache 通过多种方式进行优化,例如删除重复文件和自动清理。
更改源代码
当更改源文件时,必须重新运行编译。Build Cache 可以标识源文件内容是否与缓存中的任何内容不匹配,并将其声明为“缓存未命中”此时,该任务必须作为构建的一部分重新运行,新结果将存储在 Build Cache 中以备将来使用。
如果源文件包含的标头文件发生更改,或者标头文件包含的标题发生更改,依此类推,也会发生同样的情况。Build Cache 可以确切地知道每个任务中读取了哪些文件,并且可以验证是否发生更改。代码更改越多,Build Cache 找到的缓存命中就越少。
Build Cache 了解项目文件夹结构。然而,所有 Initiator 上的项目根文件夹不需要相同:一个 Initiator 可以将项目放在 C:\Project,另一个可以使用 D:\Project。它们可以有效地使用共享缓存。
Build Cache 组件
使用 Build Cache 的 Incredibuild 启动代理服务被称为Build Cache 客户端。存储和提供 Build Cache 的 Incredibuild Agent 称为Build Cache 端点。每个 Incredibuild Agent 都安装了 Build Cache 服务。当一个或多个客户端将一个 Agent 作为端点使用时,这个 Agent 就成为端点。
默认情况下,任何启用了 Build Cache 的启动代理服务都会充当自己的端点。通过更改 Agent 的 Build Cache 客户端设置,您可以使用一个远程端点,在多个客户端之间共享。
部署类型
Build Cache 可以不同的方式部署,具体取决于客户端连接到端点的方式。单个客户端可作为自身的端点(本地),多个客户端可连接到单个端点(远程),并且也可以进行更复杂或动态的部署。
您可以同时启用本地缓存和远程缓存。如果同时启用这两个选项,Incredibuild 会在运行构建时对每个任务使用以下逻辑:
-
检查本地缓存。如果有缓存命中,就会使用。如果出现缓存未命中,则检查远程缓存。
-
如果有远程缓存命中,则使用该数据并更新本地缓存。
-
如果远程缓存未命中,则运行任务并更新本地缓存。
Build Cache 与 Helper Cache 有什么不同
当 Helper 被赋予一项任务时,他们需要处理的输入文件(例如源文件和标头文件)被存储在 Helper Cache 中。如果发送的是完全相同的文件,Helper 仍然会再次处理,但文件不需要重新传输。
在 Build Cache 中,Initiator 可以识别已经处理过的任务,并且会完全跳过这些任务。输出文件(例如目标文件)不需要重新传输,任务也不需要重新运行。
Supported Tools
-
Build Systems:Incredibuild 支持所有构建系统。
-
Compilers:
-
cl.exe (Visual Studio 2012 或更高版本)
-
对 2012-2015 年版的支持有限,需要在构建过程中添加一个标志
-
-
clang-cl.exe (beta)
-
prospero-clang.exe (PlayStation PS5 SDK)
-
orbis-clang.exe (Playstation PS4 SDK)
-
clang ++ (Nintendo Switch SDK)
-
(目标代码)连接器:link.exe(Visual Studio 2012 或更高版本)。默认情况下,禁用 Build Cache 中的 Link.exe 支持。如果您的项目有许多很少更改的 DLL 或可执行文件,请启用该功能。对 2012-2015 年版的支持需要在构建过程中添加一个标志
-
完全支持 /Z7。当使用 Build Cache 时,/Zi 会自动转换为 /Z7