每种 BEP 事件类型都有自己的语义,build_event_stream.proto 中对此有极简记录。以下术语表介绍了每种事件类型。
已中止
与其他事件不同,Aborted
没有对应的 ID 类型,因为 Aborted
事件会取代其他类型的事件。此事件表明 build 提早终止,其所属的事件 ID 未正常生成。Aborted
包含一个枚举和方便用户使用的说明,用于说明构建未完成的原因。
例如,如果某个 build 在用户中断 Bazel 时评估目标,则 BEP 会包含如下所示的事件:
{
"id": {
"targetCompleted": {
"label": "//:foo",
"configuration": {
"id": "544e39a7f0abdb3efdd29d675a48bc6a"
}
}
},
"aborted": {
"reason": "USER_INTERRUPTED"
}
}
已执行操作
提供有关如何在 build 中执行特定 Action 的详细信息。默认情况下,BEP 中仅针对失败的操作包含此事件,以支持识别构建失败的根本原因。用户可以将 --build_event_publish_all_actions
标志设置为包含所有 ActionExecuted
事件。
构建完成
命令完成后,系统会发送单个 BuildFinished
事件,其中包含该命令的退出代码。此事件提供权威的成功/失败信息。
构建元数据
包含 --build_metadata
标志的已解析内容。此事件的存在是为了支持通过连接外部数据(如标识符)将 Bazel 与其他工具集成。
BuildMetrics
每个命令末尾都会发送一个 BuildMetrics
事件,其中包含用于量化构建工具在命令期间的行为的计数器/量具。这些指标表示实际完成的工作,不统计重复使用的缓存工作。
请注意,如果在执行命令期间没有 Java 垃圾回收,系统可能不会填充 memory_metrics
。用户可以设置 --memory_profile=/dev/null
选项,强制垃圾回收器在命令结束时运行以填充 memory_metrics
。
{
"id": {
"buildMetrics": {}
},
"buildMetrics": {
"actionSummary": {
"actionsExecuted": "1"
},
"memoryMetrics": {},
"targetMetrics": {
"targetsLoaded": "9",
"targetsConfigured": "19"
},
"packageMetrics": {
"packagesLoaded": "5"
},
"timingMetrics": {
"cpuTimeInMs": "1590",
"wallTimeInMs": "359"
}
}
}
已启动构建
BEP 流中的第一个事件,BuildStarted
包含描述命令的元数据,然后再进行任何有意义的工作。
BuildToolLogs
在命令结束时发送单个 BuildToolLogs
事件,包括构建工具生成的文件 URI,可能有助于理解或调试构建工具行为。部分信息可能以内嵌方式包含。
{
"id": {
"buildToolLogs": {}
},
"lastMessage": true,
"buildToolLogs": {
"log": [
{
"name": "elapsed time",
"contents": "MC4xMjEwMDA="
},
{
"name": "process stats",
"contents": "MSBwcm9jZXNzOiAxIGludGVybmFsLg=="
},
{
"name": "command.profile.gz",
"uri": "file:///tmp/.cache/bazel/_bazel_foo/cde87985ad0bfef34eacae575224b8d1/command.profile.gz"
}
]
}
}
CommandLine
BEP 包含多个 CommandLine
事件,其中包含所有命令行参数(包括选项和未解释参数)的表示法。每个 CommandLine
事件的 StructuredCommandLineId
中都有一个标签,用于指示它传达的表示法;BEP 中会显示三个此类事件:
"original"
:由 Bazel 从 Bazel 客户端接收的重新构建命令行,没有来自 .rc 文件的文件。"canonical"
:扩展了 .rc 文件并应用了调用政策的有效命令行。"tool"
:从--experimental_tool_command_line
选项填充。这对于通过 BEP 封装 Bazel 的工具的命令行很有用。这可以是直接使用 base64 编码的CommandLine
二进制协议缓冲区消息,也可以是解析但未解释的字符串(因为该工具的选项可能与 Bazel 的选项不同)。
配置
系统会针对 build 的顶级目标中使用的每个 configuration
发送一个 Configuration
事件。至少总是存在一个配置事件。id
会被 TargetConfigured
和 TargetComplete
事件 ID 重复使用,在多配置 build 中,需要消除这些事件所引发的歧义。
{
"id": {
"configuration": {
"id": "a5d130b0966b4a9ca2d32725aa5baf40e215bcfc4d5cdcdc60f5cc5b4918903b"
}
},
"configuration": {
"mnemonic": "k8-fastbuild",
"platformName": "k8",
"cpu": "k8",
"makeVariable": {
"COMPILATION_MODE": "fastbuild",
"TARGET_CPU": "k8",
"GENDIR": "bazel-out/k8-fastbuild/bin",
"BINDIR": "bazel-out/k8-fastbuild/bin"
}
}
}
便捷符号链接识别
实验性 - 如果您设置了 --experimental_convenience_symlinks_bep_event
选项,build
命令会生成单个 ConvenienceSymlinksIdentified
事件,指示应如何管理工作区中的符号链接。这样一来,您就可以构建远程调用 Bazel 的工具,然后安排本地工作区,就像 Bazel 在本地运行一样。
{
"id": {
"convenienceSymlinksIdentified":{}
},
"convenienceSymlinksIdentified": {
"convenienceSymlinks": [
{
"path": "bazel-bin",
"action": "CREATE",
"target": "execroot/google3/bazel-out/k8-fastbuild/bin"
},
{
"path": "bazel-genfiles",
"action": "CREATE",
"target": "execroot/google3/bazel-out/k8-fastbuild/genfiles"
},
{
"path": "bazel-out",
"action": "CREATE",
"target": "execroot/google3/bazel-out"
}
]
}
}
提取
表示提取操作是在命令执行过程中发生的。与其他事件不同,如果重复使用缓存的提取结果,则不会在 BEP 流中看到此事件。
已命名的文件集
NamedSetOfFiles
事件报告的结构与命令评估期间生成的 depset
文件相匹配。传递的依赖项由 NamedSetOfFilesId
标识。
如需详细了解如何解读流的 NamedSetOfFiles
事件,请参阅 BEP 示例页面。
OptionsParse 解析
单个 OptionsParsed
事件列出了应用于该命令的所有选项,并将启动选项与命令选项分开。此外,它还包含 InvocationPolicy(如果有)。
{
"id": {
"optionsParsed": {}
},
"optionsParsed": {
"startupOptions": [
"--max_idle_secs=10800",
"--noshutdown_on_low_sys_mem",
"--connect_timeout_secs=30",
"--output_user_root=/tmp/.cache/bazel/_bazel_foo",
"--output_base=/tmp/.cache/bazel/_bazel_foo/a61fd0fbee3f9d6c1e30d54b68655d35",
"--deep_execroot",
"--expand_configs_in_place",
"--idle_server_tasks",
"--write_command_log",
"--nowatchfs",
"--nofatal_event_bus_exceptions",
"--nowindows_enable_symlinks",
"--noclient_debug",
],
"cmdLine": [
"--enable_platform_specific_config",
"--build_event_json_file=/tmp/bep.json"
],
"explicitCmdLine": [
"--build_event_json_file=/tmp/bep.json"
],
"invocationPolicy": {}
}
}
展开图案
PatternExpanded
事件指示与命令行中提供的模式匹配的所有目标集。对于成功的命令,PatternExpandedId
中包含所有模式,PatternExpanded
事件的子级中的所有目标都存在。如果模式扩展到任何 test_suite
,则 test_suite
包含的一组测试目标。对于每个无法解析的模式,BEP 会包含一个额外的 Aborted
事件,其中的 PatternExpandedId
用于标识该模式。
{
"id": {
"pattern": {
"pattern":["//base:all"]
}
},
"children": [
{"targetConfigured":{"label":"//base:foo"}},
{"targetConfigured":{"label":"//base:foobar"}}
],
"expanded": {
"testSuiteExpansions": {
"suiteLabel": "//base:suite",
"testLabels": "//base:foo_test"
}
}
}
进度
进度事件包含 Bazel 在命令执行期间生成的标准输出和标准错误。系统会根据需要自动生成这些事件,以声明逻辑“父”事件(尤其是 NamedSetOfFiles)未公布的事件。
目标完成
对于完成执行阶段的每个 (target, configuration, aspect)
组合,BEP 中都会有一个 TargetComplete
事件。该事件包含目标的成功/失败情况以及目标请求的输出组。
{
"id": {
"targetCompleted": {
"label": "//examples/py:bep",
"configuration": {
"id": "a5d130b0966b4a9ca2d32725aa5baf40e215bcfc4d5cdcdc60f5cc5b4918903b"
}
}
},
"completed": {
"success": true,
"outputGroup": [
{
"name": "default",
"fileSets": [
{
"id": "0"
}
]
}
]
}
}
已配置
对于每个完成分析阶段的目标,BEP 中都会包含一个 TargetConfigured
事件。这是目标的“规则种类”属性的权威来源。应用于目标的配置会显示在通告的子项中。
例如,使用 --experimental_multi_cpu
选项进行构建时,可能会针对具有两个配置的单个目标生成以下 TargetConfigured
事件:
{
"id": {
"targetConfigured": {
"label": "//starlark_configurations/multi_arch_binary:foo"
}
},
"children": [
{
"targetCompleted": {
"label": "//starlark_configurations/multi_arch_binary:foo",
"configuration": {
"id": "c62b30c8ab7b9fc51a05848af9276529842a11a7655c71327ade26d7c894c818"
}
}
},
{
"targetCompleted": {
"label": "//starlark_configurations/multi_arch_binary:foo",
"configuration": {
"id": "eae0379b65abce68d54e0924c0ebcbf3d3df26c6e84ef7b2be51e8dc5b513c99"
}
}
}
],
"configured": {
"targetKind": "foo_binary rule"
}
}
目标摘要
对于执行的每个 (target, configuration)
对,TargetSummary
事件都会包含一个汇总成功结果,该结果包含已配置的目标的执行结果,以及应用于该已配置目标的所有方面。
TestResult
如果请求进行测试,系统会针对每个测试尝试、分片和每个测试运行发送一个 TestResult
事件。这样,BEP 使用方就可以准确地识别哪些测试操作未通过其测试,并为每个测试操作识别测试输出(例如日志、test.xml 文件)。
测试摘要
如果请求进行测试,系统会为每个测试 (target,
configuration)
发送一个 TestSummary
事件,其中包含解读测试结果所需的信息。其中包含每次测试的尝试次数、分片和运行次数,以便让 BEP 使用方能够区分这些维度的工件。在生成汇总 TestStatus
以区分 FLAKY
测试与 FAILED
测试时,会考虑每个测试的尝试次数和运行次数。
非结构化命令行
与 CommandLine 不同,此事件在展开所有 .bazelrc
文件并考虑 --config
标志后,会以字符串形式包含未解析的命令行标志(与构建工具遇到的情况相同)。
UnstructuredCommandLine
事件可以依赖于精确重现给定命令执行。
Workspace 配置
单个 WorkspaceConfig
事件包含关于工作区的配置信息,例如执行根。
工作区状态
单个 WorkspaceStatus
事件包含工作区状态命令的结果。