借助 Build Event Protocol (BEP),第三方程序可以深入了解 Bazel 调用。例如,您可以使用 BEP 为 IDE 插件或显示 build 结果的信息中心收集信息。
该协议是一组协议 缓冲区消息,其上定义了一些 语义。它包含有关 build 和测试 结果、build 进度、build 配置等信息。BEP 旨在以编程方式使用,并使解析 Bazel 的 命令行输出成为过去。
Build Event Protocol 将有关 build 的信息表示为事件。build 事件是一个协议缓冲区消息,由 build 事件标识符、 一组子事件标识符和载荷组成。
build 事件标识符: 根据 build 事件的类型,它可能是 不透明的 字符串 或结构化 信息,可揭示有关 build 事件的更多信息。build 事件标识符在 build 中是唯一的。
子项: build 事件可以通过在其子项 字段中包含其他 build 事件的 build 事件标识符来公布这些事件。 例如,
PatternExpandedbuild 事件会将其展开的目标公布 为子项。该协议保证,除第一个 事件之外的所有事件都由之前的事件公布。载荷: 载荷包含有关 build 事件的结构化信息, 这些信息编码为特定于该事件的协议缓冲区消息。请注意,载荷可能不是预期类型,但如果 build 过早中止,则可能是
Aborted消息。
build 事件图
所有 build 事件都通过其父项和子项 关系形成有向无环图。除了初始 build 事件之外,每个 build 事件都有一个或 多个父事件。请注意,子事件的所有父事件不一定必须 在其之前发布。当 build 完成(成功或失败)后 所有公布的事件都将发布。如果 Bazel 崩溃或失败的 网络传输,某些公布的 build 事件可能永远无法发布。
事件图的结构反映了命令的生命周期。每个 BEP 图都具有以下特征形状:
- 根事件始终是
BuildStarted事件。所有其他事件都是其后代。 - BuildStarted 事件的直接子项包含有关该 命令的元数据。
- 包含该命令生成的数据(例如构建的文件和测试
结果)的事件会显示在
BuildFinished事件之前。 BuildFinished事件后 可能 会显示包含有关 build 的摘要信息(例如指标 或分析数据)的事件。
使用 Build Event Protocol
以二进制格式使用
如需以二进制格式使用 BEP,请执行以下操作:
让 Bazel 通过指定 选项
--build_event_binary_file=/path/to/file将协议缓冲区消息序列化到文件。该文件将包含 序列化的协议缓冲区消息,每条消息都以长度分隔。 每条消息都以其长度作为前缀,并编码为长度可变的整数。 可以使用协议缓冲区库的parseDelimitedFrom(InputStream)方法读取此格式。然后,编写一个程序,从 序列化的协议缓冲区消息中提取相关信息。
以文本或 JSON 格式使用
以下 Bazel 命令行标志将以 人类可读的格式(例如文本和 JSON)输出 BEP:
--build_event_text_file
--build_event_json_file
Build Event Service
The Build Event
Service
Protocol 是一种用于发布 build 事件的通用 gRPC 服务。Build Event
Service 协议独立于 BEP,并将 BEP 事件视为不透明的字节。
Bazel 附带了 Build Event Service 协议的 gRPC 客户端实现,用于
发布 Build Event Protocol 事件。您可以使用 --bes_backend=HOST:PORT 标志指定要将
事件发送到的端点。如果您的后端使用 gRPC,
则必须在地址前加上适当的架构:对于纯文本
gRPC,使用 grpc://;对于启用了 TLS 的 gRPC,使用 grpcs://。
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。