在 WORKSPACE 规则中查找非封闭行为

报告问题 查看源代码 每夜版 · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

在下文中,宿主机是指运行 Bazel 的机器。

使用远程执行时,实际的构建和/或测试步骤不会在主机上进行,而是会发送到远程执行系统。不过,解决工作区规则所涉及的步骤是在主机上进行的。如果您的工作区规则在执行期间访问有关宿主机器的信息,则由于环境不兼容,您的 build 可能会中断。

作为调整 Bazel 规则以进行远程执行的一部分,您需要找到此类工作区规则并修复它们。本页介绍了如何使用工作区日志查找可能存在问题的工作区规则。

查找非封闭式规则

工作区规则允许开发者向外部工作区添加依赖项,但它们足够丰富,可允许在此过程中进行任意处理。所有相关命令都在本地执行,可能会导致不密封。通常,非封闭行为是通过允许与宿主机交互的 repository_ctx 引入的。

从 Bazel 0.18 开始,您可以通过在 Bazel 命令中添加 --experimental_workspace_rules_log_file=[PATH] 标志来获取一些可能不密封的操作的日志。其中,[PATH] 是将创建日志的文件名。

需注意的事项:

  • 日志会捕获事件的执行情况。如果某些步骤被缓存,它们将不会显示在日志中,因此为了获得完整的结果,请不要忘记提前运行 bazel clean --expunge

  • 有时,函数可能会重新执行,在这种情况下,相关事件会在日志中多次显示。

  • 工作区规则目前仅记录 Starlark 事件。

如需了解工作区初始化期间执行的操作,请执行以下操作:

  1. 运行 bazel clean --expunge。此命令将清除您的本地缓存和所有缓存的代码库,确保所有初始化操作都会重新运行。

  2. --experimental_workspace_rules_log_file=/tmp/workspacelog 添加到 Bazel 命令中,然后运行 build。

    这会生成一个二进制 proto 文件,其中列出了 WorkspaceEvent 类型的消息

  3. 下载 Bazel 源代码,然后使用以下命令导航到 Bazel 文件夹。您需要源代码才能使用 workspacelog 解析器解析工作区日志。

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
  4. 在 Bazel 源代码库中,将整个工作区日志转换为文本。

    bazel build src/tools/workspacelog:parser
    bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog > /tmp/workspacelog.txt
  5. 输出可能非常详细,并且包含内置 Bazel 规则的输出。

    如需从输出中排除特定规则,请使用 --exclude_rule 选项。例如:

    bazel build src/tools/workspacelog:parser
    bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog \
        --exclude_rule "//external:local_config_cc" \
        --exclude_rule "//external:dep" > /tmp/workspacelog.txt
  6. 打开 /tmp/workspacelog.txt 并检查是否存在不安全的操作。

该日志包含 WorkspaceEvent 消息,其中概述了对 repository_ctx 执行的某些可能非密封的操作。

以下操作已被突出显示为可能不封闭:

  • execute:在宿主环境中执行任意命令。检查这些变量是否可能会对宿主环境引入任何依赖项。

  • downloaddownload_and_extract:为确保构建的密封性,请确保指定了 sha256

  • filetemplate:这本身不是非密封的,但可能是将对宿主环境的依赖项引入到代码库中的一种机制。确保您了解输入来源,并且输入不依赖于宿主环境。

  • os:本身不是非密封的,但可以轻松获取宿主环境中的依赖项。封闭构建通常不会调用此方法。 在评估您的使用情况是否是密封的,请记住,这是在主机上运行的,而不是在工作器上运行的。对于远程构建,通常不建议从宿主机获取环境的具体信息。

  • symlink:这通常是安全的,但请注意危险信号。指向代码库外部或绝对路径的任何符号链接都会导致远程工作器出现问题。如果根据宿主机器属性创建符号链接,可能也会出现问题。

  • which:检查主机上安装的程序通常会遇到问题,因为工作节点的配置可能不同。