从脚本调用 Bazel

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

您可以从脚本调用 Bazel 以执行构建、运行测试或查询 依赖关系图Bazel 的设计初衷就是支持编写有效的脚本 本部分列出了需要注意的一些细节,可让您的脚本 稳健。

选择输出基准

--output_base 选项控制 Bazel 进程应在何处写入 以及供内部使用的各种工作文件 Bazel,其中一个是锁,用于防止 根据多个 Bazel 进程的输出

为脚本选择正确的输出基本目录取决于 因素。如果您需要将构建输出放在特定位置 规定需要使用的输出库。如果您将作业设为“只读”调用 Bazel(例如 bazel query),锁定因素会更为重要。在 特别是,如果您需要同时运行脚本的多个实例, 您需要为每个样本提供不同的(或随机)输出基准。

如果您使用默认的输出基数值, 所有交互式 Bazel 命令使用的锁。如果用户发起 长时间运行的命令(如构建命令),则您的脚本必须等待这些命令 然后才能继续

有关服务器模式的注意事项

默认情况下,Bazel 使用长时间运行的服务器进程作为 优化。在脚本中运行 Bazel 时,别忘了调用 shutdown 或者,您也可以指定 --max_idle_secs=5, 空闲服务器会立即自动关闭。

我将获得什么退出代码?

Bazel 会尝试区分 考虑阻止 Bazel 正常运行的外部错误。 Bazel 执行可能会导致以下退出代码:

所有命令通用的退出代码

  • 0 - 成功
  • 2 - 命令行问题、错误或非法的标志或命令组合,或者 错误的环境变量。必须修改命令行。
  • 8 - 构建中断,但我们终止了实例,并按顺序关停。
  • 9 - 已持有服务器锁定,并且传递了 --noblock_for_lock
  • 32 - 此机器上不存在外部环境故障。

  • 33 - Bazel 内存不足并崩溃。您需要修改命令行。

  • 34 - 留给 Google 内部使用。

  • 35 - 留给 Google 内部使用。

  • 36 - 本地环境问题,疑似是永久性的。

  • 37 - 未处理的异常 / 内部 Bazel 错误。

  • 38 - 留给 Google 内部使用。

  • 39 - 从远程缓存中逐出 Bazel 所需的 Blob。

  • 41-44 - 留给 Google 内部使用。

  • 45 - 将结果发布到构建事件服务时出错。

  • 47 - 留给 Google 内部使用。

返回命令 bazel buildbazel test 的代码

  • 1 - 构建失败。
  • 3 - 构建正常,但部分测试失败或超时。
  • 4 - 构建成功,但未找到测试,尽管测试 请求。

对于 bazel run

  • 1 - 构建失败。
  • 如果构建成功,但执行的子进程返回非零退出 它也将是命令的退出代码。

对于 bazel query

  • 3 - 部分成功,但查询在 输入 BUILD 文件集,因此操作结果不是 100% 可靠性。这可能是由于命令行中的 --keep_going 选项造成的。
  • 7 - 命令失败。

未来的 Bazel 版本可能会添加其他退出代码,以取代常规失败 具有特定含义的其他非零值退出代码 1。 不过,所有非零退出值始终都会构成错误。

读取 .bazelrc 文件

默认情况下,Bazel 会从以下目录读取 .bazelrc 文件: 工作区目录或用户的主目录。无论 为您的脚本选择最合适的值必须确保脚本 封闭式(例如在进行发布构建时),因此您应该停止读取 .bazelrc 文件。--bazelrc=/dev/null如果您想执行 使用用户的偏好设置的 build 时,默认行为会更好。

命令日志

Bazel 输出也可以在命令日志文件中找到,您可以使用 以下命令:

bazel info command_log

命令日志文件包含 运行最新 Bazel 命令请注意,运行 bazel info 会覆盖 此文件的内容,因为这样它就会成为最新的 Bazel 命令。 但是,除非您将命令日志文件 --output_base--output_user_root 选项的设置。

解析输出

Bazel 输出易于解析,可用于多种用途。 对脚本有帮助的 --noshow_progress 会抑制进度 还有 --show_result n,后者用于控制 而不是“构建最新版本”输出消息;这些消息可能会被解析为 了解成功构建的目标以及输出的位置 文件。如果您依赖于 这些消息

通过分析排查性能问题

请参阅性能剖析部分。