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

报告问题 查看来源 每晚 · 7.2。 · 7.1敬上 · 7.0 · 6.5 条 · 6.4

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

使用远程执行时,实际的构建和/或测试步骤 而是发送到远程执行 系统。不过,解析工作区规则所涉及的步骤 在主机上运行。如果您的工作区规则访问的是 供其在执行期间使用,则您的构建可能会由于以下原因 环境之间的不兼容问题。

在为远程响应调整 Bazel 规则的过程中 执行时,您需要找到这些工作区规则, 并进行修复本页面介绍了如何查找可能存在问题的工作区 创建规则

查找非封闭规则

工作区规则允许开发者向 但它们非常丰富,可以允许任意处理 重要性所有相关命令都在本地执行,可以是 可能是非封闭的潜在来源通常情况下,非封闭行为 引入 repository_ctx,它允许与 与宿主机配合使用

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

需注意的事项:

  • 日志会在事件执行时捕获它们如果某些步骤 它们不会显示在日志中,因此要获取完整结果 请务必事先运行 bazel clean --expunge

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

  • Workspace 规则目前仅记录 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:为确保封闭构建, 已指定 sha256

  • filetemplate:这本身不是非封闭的,但可能是一种机制。 将承载环境的依赖项引入存储库中。 确保您了解输入内容的来源 取决于宿主环境。

  • os:这本身并非非封闭,而是一种获取依赖项的简单方法 运行容器封闭 build 通常不会调用此 API。 在评估您的使用情况是否封闭时,请注意, 在主机上运行,而不是在工作器上运行。获取环境详细信息 通常不适合远程构建。

  • symlink:这通常是安全的,但请留意红色标记。指向 或绝对路径外,都会导致 远程工作者符号链接是否基于宿主机属性创建 那么它很可能也会出问题

  • which:检查主机上安装的程序通常是问题 因为 worker 可能具有不同的配置。