构建事件协议

报告问题 查看源代码 每夜 build · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

借助构建事件协议 (BEP),第三方程序可以深入了解 Bazel 调用。例如,您可以使用 BEP 为 IDE 插件或显示 build 结果的信息中心收集信息。

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

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

  • build 事件标识符:根据 build 事件的类型,它可能是不透明字符串结构化信息,用于详细说明 build 事件。build 事件标识符在 build 内是唯一的。

  • 子项:构建事件可以通过在其子项字段中添加其他构建事件的标识符来宣布其他构建事件。例如,PatternExpanded build 事件会将其展开到的目标作为子目标进行通告。该协议可保证除第一个事件外,所有事件均由前一事件宣布。

  • 载荷:载荷包含有关 build 事件的结构化信息,编码为特定于该事件的协议缓冲区消息。请注意,如果 build 过早终止,载荷可能不是预期类型,而是 Aborted 消息。

构建事件图

所有 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 消息,每条消息都以长度分隔。每条消息的前面都附加一个长度,该长度编码为可变长度整数。您可以使用 Protocol Buffer 库的 parseDelimitedFrom(InputStream) 方法读取此格式。

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

以文本或 JSON 格式使用

以下 Bazel 命令行标志将以文本和 JSON 等人类可读格式输出 BEP:

--build_event_text_file
--build_event_json_file

Build Event Service

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_best_effort
  • --[no]bes_lifecycle_events
  • --bes_results_url
  • --bes_timeout
  • --project_id

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

身份验证和安全

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

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

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

构建事件服务和远程缓存

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

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