Build Event Protocol 术语表

每种 BEP 事件类型都有自己的语义,build_event_stream.proto 中对此基本没有记录。以下术语表介绍了每种事件类型。

已中止

与其他事件不同,Aborted 没有对应的 ID 类型,因为 Aborted 事件会替换其他类型的事件。此事件表示 build 提前终止,且其所在的事件 ID 未正常生成。Aborted 包含枚举和简单易懂的说明,用于说明构建未完成的原因。

例如,如果某个构建在用户中断 Bazel 时正在评估目标,BEP 会包含一个如下所示的事件:

{
  "id": {
    "targetCompleted": {
      "label": "//:foo",
      "configuration": {
        "id": "544e39a7f0abdb3efdd29d675a48bc6a"
      }
    }
  },
  "aborted": {
    "reason": "USER_INTERRUPTED"
  }
}

ActionExecuted

提供有关在 build 中执行特定 Action 的详细信息。默认情况下,该事件仅包含在失败的操作的 BEP 中,用于帮助确定构建失败的根本原因。用户可以设置 --build_event_publish_all_actions 标志以包含所有 ActionExecuted 事件。

BuildFinished

命令完成后,会发送单个 BuildFinished 事件,其中包含该命令的退出代码。此事件提供权威的成功/失败信息。

BuildMetadata

包含 --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"
    }
  }
}

BuildStarted

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 可由 TargetConfiguredTargetComplete 事件 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"
    }
  }
}

ConvenienceSymlinksIdentified

实验性 - 如果设置了 --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

NamedSetOfFiles 事件报告的结构与命令评估期间生成的文件的 depset 匹配。传递性包含的依赖项由 NamedSetOfFilesId 标识。

如需详细了解如何解读流的 NamedSetOfFiles 事件,请参阅 BEP 示例页面

OptionsParsed

单个 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

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)公布的事件。

TargetComplete

对于完成执行阶段的每个 (target, configuration, aspect) 组合,BEP 中都会包含一个 TargetComplete 事件。该事件包含目标的成功/失败以及目标所请求的输出组。

{
  "id": {
    "targetCompleted": {
      "label": "//examples/py:bep",
      "configuration": {
        "id": "a5d130b0966b4a9ca2d32725aa5baf40e215bcfc4d5cdcdc60f5cc5b4918903b"
      }
    }
  },
  "completed": {
    "success": true,
    "outputGroup": [
      {
        "name": "default",
        "fileSets": [
          {
            "id": "0"
          }
        ]
      }
    ]
  }
}

TargetConfigured

对于完成分析阶段的每个目标,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"
  }
}

TargetSummary

对于执行的每个 (target, configuration) 对,系统都会在汇总成功结果中包含 TargetSummary 事件,该结果涵盖已配置的目标的执行情况以及应用于该配置目标的所有方面。

TestResult

如果请求了测试,则对于每次测试的每次测试尝试、分片和运行都会发送 TestResult 事件。这样,BEP 使用方就可以精确地识别哪些测试操作未通过测试,并识别每个测试操作的测试输出(如日志、test.xml 文件)。

TestSummary

如果请求了测试,系统会为每个测试 (target, configuration) 发送 TestSummary 事件,其中包含解读测试结果所需的信息。每次测试的尝试次数、分片数和运行次数均包括在内,以便 BEP 使用方在这些维度上区分工件。在生成汇总的 TestStatus 以区分 FLAKY 测试与 FAILED 测试时,系统会考虑每个测试的尝试和运行情况。

UnstructuredCommandLine

CommandLine 不同,此事件以字符串形式携带未解析的命令行标志,正如构建工具在展开所有 .bazelrc 文件并考虑 --config 标志后遇到的一样。

可以依赖 UnstructuredCommandLine 事件来精确再现指定的命令执行。

WorkspaceConfig

单个 WorkspaceConfig 事件包含有关工作区的配置信息,例如执行根。

WorkspaceStatus

单个 WorkspaceStatus 事件包含工作区状态命令的结果。