Remote execution 规则

2021-01-21  本文已影响0人  sarto

https://docs.bazel.build/versions/3.7.0/remote-execution-rules.html

Remote execution 允许 Bazel 在分离的平台上(例如数据中心)执行动作。你可以用 bazel-buildfarm 来尝试 Remote execution,这个开源项目旨在提供一个分布式的 Remote execution 平台。这个页面适用于那些编写自定义构建和测试 Bazel rules 的 Bazel 用户,他们想了解 Remote execution 的上下文对 Bazel rules 有什么要求。

当引用不同的环 境或者平台时,本文件使用以下术语。

总览

当你配置 Remote execution 时,你必须遵守本文档描述的以下规则以确保 Remote execution 可以正常执行而不会出现错误,这是由于 Remote execution 的特性,即:

本文档描述了为了 remote excution 实现自定义 Bazel build rules 和 Bazel test rules 过程中可能遇到的问题及如何避免,这包含以下几个主题:

通过 Toolchain rules 调用构建工具

Bazel 的 Toolchain rules 是配置提供者,它告诉 Build rules 要使用的构建工具(例如编译器和链接器)如何使用并且如何根据规则创建者定义的参数来配置它们。一个 Toolchain rule 允许 Build rule 和 Test rule 以可预计的,预配置的方式调用构建工具,从而与 Remote execution 兼容。例如,使用一个 Toolchain rule 代替 PATH,JAVA_HOME 或者其他的本地变量调用构建工具,这些变量可能并没有在远程环境中设置或者本机环境和远程环境不一致。

Toolchain rules 当前已经有了 Scala,Rust 和 Go 的 Build rules 和 Test rules。新的 Toolchain rules 例如 bash 也正在开发中。如果你要使用的 Toolchain rule 不存在,考虑创建一个新的 Toolchain rule。

管理隐式依赖

如果一个构建工具能够访问各个构建操作的依赖,这些动作在远程执行时将会失败,因为每个构建动作之间都是分离的。一些构建工具会在构建操作和依赖关系间保留状态,这些依赖关系尚未明确包含在工具调用中,浙江导致远程执行的构建操作失败。

例如,当 Bazel 只是一有状态编译器在本地生成 foo 时,编译器会保留 foo 的构建输出。当 Baze 指示编译器 构建 bar 时(依赖于 foo),在没有明确说明 BUILD 文件中包含的编译调用关系时,只要在同一个编译器下执行两个动作,改动作将会成功执行,这对于本地执行而言是典型的。然而,在 Remote execution 情景下,每个构建动作是在不同的编译器实例中执行的,编译状态和 bar 的 隐式依赖 foo 将会丢失然后构建将会失败。

为了帮助检测和消除这种依赖问题,Bazel 0.14.1 提供了本地 Docker sandbox,Docker sandbox 有着和 Remote execution 相同的依赖限制。 使用 sandbox,通过识别和解决依赖相关的构建错误来为 Remote execution 做准备。

管理平台相关的二进制

通常来说,在 Host platform 上构建的二进制由于潜在的依赖不匹配问题无法安全的在任意 Remote execution 平台上运行。例如,Bazel 随附的 SingleJar 二进制以 Host platform 为目标。然而,对 Remote exection,必须在构建代码的过程中将 SingleJar 编译为适合 Remote execution 平台的目标。参见 target selection logic

不要将构建所需的构建工具的二进制文件???和需要构建的源代码一起提供,除非您确定它们它们会在您的执行环境中安全运行。否则,请采用以下任意一种操作:

管理 configure-style WORKSPACE rules

Bazel 的 WORKSPACE ruels 能够为构建所需的工具和库用于探测 Host platform,对于本地构建,该平台也是 Bazel 的 Execution platform。如果构建明确依赖本地工具和工件,当 Host platform 和 Remote execution 的 Execution platform 不一致时 Remote execution 将会失败。

WORKSPACE rules 执行的以下操作与 Remote execution 不兼容:

为了帮助发现潜在的非密封行为,您可以使用 Workspace rules log

如果外部依赖的执行依赖与 Host platform,我们建议按以下方式在 WORKSPACE 和 build rules 之间拆分这些操作:

为了更简单的生成用于 Remote execution 的预检查工件,你能使用 WORKSPACE rules 来导出生成的文件。你可以在每个新的执行环境中运行这些规则,例如在每个 toolchain container,并检查 Remote execution 构建的结果到你的源仓库的引用。

例如,对于 Tensorflow rules 的 cudapython,WORKSPACE rules 提供了 BUILD files。对 Local execution 来说,使用通过检查 Host platform 提供的文件。对 Remote execution 来说,环境变量上的conditional statement允许规则使用 repo 中提供的文件。BUILD files 描述的 gnerules 在本地和远程都可以执行,然后执行以前通过 repository_ctx.symlink 导入的的必要处理,如下所示here

上一篇下一篇

猜你喜欢

热点阅读