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