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

在下图中,主机是运行 Bazel 的机器。

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

为远程执行调整 Bazel 规则的过程中,您需要找到并修复此类工作区规则。本页面介绍如何使用工作区日志查找可能存在问题的工作区规则。

查找非封闭规则

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

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

需注意的事项:

  • 日志会在执行事件时对其进行捕获。如果缓存了一些步骤,它们将不会出现在日志中,因此,如需获得完整的结果,请务必提前运行 bazel clean --expunge

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

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

如需查找在工作区初始化期间执行的内容,请执行以下操作:

  1. 运行 bazel clean --expunge。此命令将清理本地缓存以及任何缓存的代码库,确保所有初始化都会重新运行。

  2. --experimental_workspace_rules_log_file=/tmp/workspacelog 添加到 Bazel 命令并运行构建。

    这将生成一个二进制 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:为确保封闭 build,请确保指定了 sha256

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

  • os:这本身并不是非封闭的,而是在主机环境上获取依赖项的一种简单方法。封闭 build 通常不会调用此方法。在评估您的用法是否封闭时,请记住,测试是在主机上运行,而不是在工作器上运行。对于远程构建,从主机获取环境详情通常不是一个好主意。

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

  • which:检查主机上安装的程序通常会出现问题,因为工作器可能具有不同的配置。