构建事件 协议 (BEP) 让第三方程序可以深入了解 Bazel 调用。对于 例如,您可以使用 BEP 为 IDE 收集信息 插件或显示构建结果的信息中心。
该协议是一组 protocol buffer 消息,其中定义了一些语义。其中包含有关 build 和测试结果、build 进度、build 配置等方面的信息。BEP 旨在以编程方式使用,让解析 Bazel 的命令行输出成为过去式。
Build Event Protocol 将 build 相关信息表示为事件。build 事件是一种协议缓冲区消息,由 build 事件标识符、一组子事件标识符和载荷组成。
子级:构建事件可能会通过以下方式公布其他构建事件: 子项的 子项中的 build 事件标识符 字段。 例如,
PatternExpanded
构建事件会公布它扩展的目标 儿童。该协议可保证除第一个事件外,所有事件均由前一事件宣布。载荷:载荷包含有关 build 事件的结构化信息,编码为特定于该事件的协议缓冲区消息。请注意, 载荷可能不是预期的类型,但可能是
Aborted
消息 则会发生此错误
构建事件图
所有 build 事件通过其父子关系形成有向无环图。除初始构建事件外,每个构建事件都有 1 个或 更多父事件。请注意,子事件的所有父事件不一定都必须在子事件之前发布。构建完成(成功或失败) 所有公布的活动都会发布。如果 Bazel 崩溃或失败 某些已公布的构建事件可能永远无法发布。
事件图的结构反映了命令的生命周期。每个 BEP 具有以下特征形状:
- 根事件始终是
BuildStarted
事件。所有其他事件都是其后代。 - BuildStarted 事件的直接子项包含与该命令相关的元数据。
- 包含该命令生成的数据(例如构建的文件和测试结果)的事件会显示在
BuildFinished
事件之前。 BuildFinished
活动可以关注 按包含构建摘要信息的事件(例如,指标 或分析数据)。
使用 Build Event Protocol
以二进制格式使用
如需以二进制格式使用 BEP,请执行以下操作:
让 Bazel 将协议缓冲区消息序列化为一个文件,方法是指定 选项
--build_event_binary_file=/path/to/file
。该文件将包含 序列化协议缓冲区消息,每条消息用长度分隔。 每条消息的前面都附加一个长度,该长度编码为可变长度整数。您可以使用 Protocol Buffer 库的parseDelimitedFrom(InputStream)
方法读取此格式。然后,编写一个程序,用于从 序列化协议缓冲区消息。
以文本或 JSON 格式使用
以下 Bazel 命令行标志将以 人类可读的格式,例如文本和 JSON:
--build_event_text_file
--build_event_json_file
Build Event Service
Build Event Service 协议是一种用于发布 build 事件的通用 gRPC 服务。Build 事件
服务协议独立于 BEP,并将 BEP 事件视为不透明字节。
Bazel 附带了 Build Event Service 协议的 gRPC 客户端实现,该实现会发布 Build Event Protocol 事件。您可以指定端点
使用 --bes_backend=HOST:PORT
标志。如果您的后端使用 gRPC,您必须在地址前面添加适当的架构:grpc://
表示明文 gRPC,grpcs://
表示启用了 TLS 的 gRPC。
Build Event Service 标志
Bazel 有多个与构建事件服务协议相关的标志,包括:
--bes_backend
--[no]bes_best_effort
--[no]bes_lifecycle_events
--bes_results_url
--bes_timeout
--project_id
有关上述每个标志的说明,请参阅 命令行参考。
身份验证和安全
Bazel 的 Build Event Service 实现也支持身份验证和 TLS。您可以使用以下标志控制这些设置。请注意,这些标志也适用于 Bazel 的远程执行。这意味着 事件服务和 Remote Execution 端点需要共用 身份验证和传输层安全协议 (TLS) 基础架构。
--[no]google_default_credentials
--google_credentials
--google_auth_scopes
--tls_certificate
--[no]tls_enabled
有关上述每个标志的说明,请参阅 命令行参考。
构建事件服务和远程缓存
BEP 通常包含许多对日志文件(test.log、test.xml、 等)存储在运行 Bazel 的机器上。远程 BES 服务器 通常无法访问这些文件,因为它们位于不同的计算机上。解决此问题的方法之一是将 Bazel 与远程缓存搭配使用。Bazel 会将所有输出文件上传到远程缓存(包括文件 BEP 中引用)之后,BES 服务器就可以提取参考文件 从缓存中移除
如需了解详情,请参阅 GitHub 问题 3689。