在下文中,主机是指运行 Bazel 的机器。
使用远程执行时,实际的构建和/或测试步骤不会 在主机上执行,而是会发送到远程执行 系统。不过,解析工作区规则所涉及的步骤会在 主机上执行。如果您的工作区规则访问有关 主机的信息以供执行期间使用,则您的构建可能会因 环境不兼容而中断。
在为远程 执行调整 Bazel 规则时,您需要找到此类工作区规则 并修复它们。本页介绍了如何使用工作区 日志查找可能存在问题的工作区规则。
查找非密封规则
工作区规则允许开发者向
外部工作区添加依赖项,但它们足够丰富,允许在此过程中进行任意处理。所有相关命令都在本地执行,并且可能是非密封性的
潜在来源。通常,非密封行为是
通过
repository_ctx引入的,该行为允许与主机进行交互。
从 Bazel 0.18 开始,您可以通过将标志 --experimental_workspace_rules_log_file=[PATH] 添加到您的 Bazel 命令中,获取一些可能非密封的
操作的日志。其中,[PATH] 是将用于创建日志的文件名。
需注意的事项:
日志会捕获执行的事件。如果某些步骤已 缓存,则它们不会显示在日志中,因此如需获取完整结果,请不要 忘记提前运行
bazel clean --expunge。有时,函数可能会重新执行,在这种情况下,相关 事件会在日志中多次显示。
工作区规则目前仅记录 Starlark 事件。
如需查找在工作区初始化期间执行的操作,请执行以下操作:
运行
bazel clean --expunge。此命令将清除您的本地缓存和 任何缓存的库,确保所有初始化都将重新运行。将
--experimental_workspace_rules_log_file=/tmp/workspacelog添加到您的 Bazel 命令中,然后运行构建。这会生成一个二进制 proto 文件,其中列出了类型为 WorkspaceEvent的消息
下载 Bazel 源代码,然后使用 以下命令导航到 Bazel 文件夹。您需要源代码才能使用 workspacelog 解析器解析 工作区日志。
git clone https://github.com/bazelbuild/bazel.gitcd bazel在 Bazel 源代码库中,将整个工作区日志转换为文本。
bazel build src/tools/workspacelog:parserbazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog > /tmp/workspacelog.txt输出可能非常详细,并且包含内置 Bazel 规则的输出。
如需从输出中排除特定规则,请使用
--exclude_rule选项。 例如:bazel build src/tools/workspacelog:parserbazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog \ --exclude_rule "//external:local_config_cc" \ --exclude_rule "//external:dep" > /tmp/workspacelog.txt打开
/tmp/workspacelog.txt并检查不安全的操作。
该日志包含
WorkspaceEvent
消息,其中概述了对
repository_ctx执行的某些可能非密封的操作。
已被突出显示为可能非密封的操作如下所示:
execute:在主机环境中执行任意命令。检查这些命令是否可能会引入对主机环境的任何依赖项。download、download_and_extract:如需确保密封构建,请确保 指定 sha256file、template:这本身不是非密封的,但可能是将对主机环境的依赖项引入到库中的一种机制。确保您了解输入的来源,并且输入不 依赖于主机环境。os:这本身不是非密封的,但却是获取对主机环境的依赖项 的一种简单方法。密封构建通常不会调用此方法。 在评估您的使用情况是否密封时,请注意,此方法在主机上运行,而不是在工作器上运行。对于远程构建,从主机获取环境详细信息 通常不是一个好主意。symlink:这通常是安全的,但请注意危险信号。指向库外部或绝对路径的任何符号链接都会导致远程工作器出现问题。如果符号链接是根据主机属性创建的 则可能也会出现问题。which:检查主机上安装的程序通常会存在问题 因为工作器的配置可能不同。