构建事件协议

报告问题 查看来源 Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Build Event Protocol (BEP) 允许第三方程序深入了解 Bazel 调用。例如,您可以使用 BEP 来收集 IDE 插件或显示 build 结果的信息中心所需的信息。

该协议是一组 Protocol Buffer 消息,并在其上定义了一些语义。它包含有关 build 和测试结果、build 进度、build 配置等信息。BEP 旨在以程序化方式使用,让解析 Bazel 的命令行输出成为过去。

Build Event Protocol 将有关 build 的信息表示为事件。build 事件是一种协议缓冲区消息,包含 build 事件标识符、一组子事件标识符和载荷。

  • Build Event Identifier:根据 build 事件的类型,它可能是不透明的字符串,也可能是结构化信息,可揭示有关 build 事件的更多信息。build 事件标识符在 build 中是唯一的。

  • 子事件:构建事件可以通过在其 children 字段中包含其他构建事件的构建事件标识符来宣布这些构建事件。 例如,PatternExpanded build 事件会公布其扩展为子目标的那些目标。该协议可保证,除第一个事件之外的所有事件都由之前的事件公布。

  • 载荷:载荷包含有关 build 事件的结构化信息,以特定于该事件的协议缓冲区消息进行编码。请注意,如果 build 提前中止,载荷可能不是预期类型,但可能是 Aborted 消息。

构建事件图

所有 build 事件都通过其父子关系形成有向无环图。除了初始 build 事件之外,每个 build 事件都有一个或多个父事件。请注意,子事件的所有父事件不一定必须在其之前发布。当 build 完成(成功或失败)时,所有已公布的事件都将发布。如果发生 Bazel 崩溃或网络传输失败,某些已公布的 build 事件可能永远无法发布。

事件图的结构反映了命令的生命周期。每个 BEP 图都具有以下特征形状:

  1. 根事件始终是 BuildStarted 事件。所有其他事件都是其后代。
  2. BuildStarted 事件的直接子项包含有关命令的元数据。
  3. 包含命令生成的数据(例如构建的文件和测试结果)的事件会显示在 BuildFinished 事件之前。
  4. BuildFinished 事件可能会后跟包含 build 摘要信息(例如指标或分析数据)的事件。

使用 Build Event Protocol

以二进制格式使用

以二进制格式使用 BEP:

  1. 通过指定 --build_event_binary_file=/path/to/file 选项,让 Bazel 将协议缓冲区消息序列化到文件中。该文件将包含序列化的 Protocol Buffer 消息,每条消息都以长度分隔符分隔。 每条消息都以其长度(编码为可变长度整数)作为前缀。可以使用协议缓冲区库的 parseDelimitedFrom(InputStream) 方法读取此格式。

  2. 然后,编写一个程序,从序列化的协议缓冲区消息中提取相关信息。

以文本或 JSON 格式使用

以下 Bazel 命令行标志将以易于用户理解的格式(例如文本和 JSON)输出 BEP:

--build_event_text_file
--build_event_json_file

构建事件服务

Build Event Service 协议是一种用于发布 build 事件的通用 gRPC 服务。Build Event Service 协议独立于 BEP,并将 BEP 事件视为不透明的字节。Bazel 随附了 Build Event Service 协议的 gRPC 客户端实现,用于发布 Build Event Protocol 事件。可以使用 --bes_backend=HOST:PORT 标志指定要将事件发送到的端点。如果您的后端使用 gRPC,则必须在地址前添加相应的方案:grpc:// 表示纯文本 gRPC,grpcs:// 表示已启用 TLS 的 gRPC。

Build Event Service 标志

Bazel 有多个与 Build Event Service 协议相关的标志,包括:

  • --bes_backend
  • --[no]bes_lifecycle_events
  • --bes_results_url
  • --bes_timeout
  • --bes_instance_name

如需了解这些标志的说明,请参阅命令行参考文档

身份验证和安全性

Bazel 的 Build Event Service 实现还支持身份验证和 TLS。您可以使用以下标志控制这些设置。请注意,这些标志也用于 Bazel 的远程执行。这意味着 Build Event Service 和远程执行端点需要共享相同的身份验证和 TLS 基础架构。

  • --[no]google_default_credentials
  • --google_credentials
  • --google_auth_scopes
  • --tls_certificate
  • --[no]tls_enabled

如需了解这些标志的说明,请参阅命令行参考文档

Build Event Service 和远程缓存

BEP 通常包含对存储在运行 Bazel 的机器上的日志文件(test.log、test.xml 等)的许多引用。远程 BES 服务器通常无法访问这些文件,因为它们位于不同的机器上。解决此问题的一种方法是使用支持远程缓存的 Bazel。 Bazel 会将所有输出文件(包括 BEP 中引用的文件)上传到远程缓存,然后 BES 服务器可以从缓存中提取引用的文件。

如需了解详情,请参阅 GitHub 问题 3689