- Build Event Identifier: Depending on the kind of build event, it might be an opaque string or structured information revealing more about the build event. A build event identifier is unique within a build.
-
Children: A build event may announce other build events, by including
their build event identifiers in its children field.
For example, the
PatternExpandedbuild event announces the targets it expands to as children. The protocol guarantees that all events, except for the first event, are announced by a previous event. -
Payload: The payload contains structured information about a build event,
encoded as a protocol buffer message specific to that event. Note that the
payload might not be the expected type, but could be an
Abortedmessage if the build aborted prematurely.
Build event graph
All build events form a directed acyclic graph (DAG) through their parent and child relationships. Every build event except for the initialBuildStarted event is announced
by one or more earlier parent events.
Announcement contract
The protocol requires that every event in the stream (exceptBuildStarted) is announced in the children list of an earlier event:
- Static parents: High-level lifecycle events announce their natural children. For example,
BuildStartedannouncesPatternExpandedandBuildFinished, andPatternExpandedannouncesTargetConfiguredfor each matching target. - Dynamic chaining via Progress: Events discovered dynamically during evaluation that have no natural static parent—such as
NamedSetOfFiles,Configuration,WorkspaceConfig, andFetch—are announced on the fly by interveningProgressevents before they are posted. - Completion invariant: A build is considered complete if and only if all announced children have been posted or accounted for with an
Abortedevent.
Announcement vs. delivery ordering
Being announced inchildren advertises that an event will eventually occur, but it does not imply delivery sequence:
- Bazel posts events concurrently as actions complete across worker threads.
- Some events (such as
TargetComplete,TestResult, andTestSummary) specify order constraints (postedAfterin the Bazel implementation). Bazel holds back delivering these events until their prerequisite events have been posted. - For test executions,
TargetCompleteannounces initial test attempts (TestResult), while each retry attempt is announced by the attempt that immediately preceded it.
Lifecycle stages
The event graph reflects the phases of a Bazel invocation:- Invocation Start: The root
BuildStartedevent is published first. It announces command metadata (OptionsParsed,CommandLine,WorkspaceStatus), target pattern expansion (PatternExpanded), and build completion (BuildFinished). - Analysis & Configuration:
PatternExpandedannouncesTargetConfiguredevents for parsed targets. InterveningProgressevents chain in build configurations (Configuration). - Execution: Each
TargetConfiguredevent announces its correspondingTargetCompleteevent.TargetCompletereferences output file sets (NamedSetOfFiles, which are dynamically announced via interveningProgressevents) and announces target-level summaries (TargetSummary) as well as test events (TestResult,TestSummary) for test targets. - Completion & Tool Logs: The
BuildFinishedevent is published after command evaluation finishes, providing the authoritative exit code. It announces post-build events such asBuildMetrics,BuildToolLogs, and, forbazel runwithout--script_path,ExecRequestConstructed. These may arrive in any order; the final event of the stream haslast_messageset.
Consuming Build Event Protocol
Consume in binary format
To consume the BEP in a binary format:-
Have Bazel serialize the protocol buffer messages to a file by specifying the
option
--build_event_binary_file=/path/to/file. The file will contain serialized protocol buffer messages with each message being length delimited. Each message is prefixed with its length encoded as a variable length integer. This format can be read using the protocol buffer library’sparseDelimitedFrom(InputStream)method. - Then, write a program that extracts the relevant information from the serialized protocol buffer message.
Consume in text or JSON formats
The following Bazel command line flags will output the BEP in human-readable formats, such as text and JSON:Build Event Service
The Build Event Service Protocol is a generic gRPC service for publishing build events. The Build Event Service protocol is independent of the BEP and treats BEP events as opaque bytes. Bazel ships with a gRPC client implementation of the Build Event Service protocol that publishes Build Event Protocol events. One can specify the endpoint to send the events to using the--bes_backend=HOST:PORT flag. If your backend uses gRPC,
you must prefix the address with the appropriate scheme: grpc:// for plaintext
gRPC and grpcs:// for gRPC with TLS enabled.
Build Event Service flags
Bazel has several flags related to the Build Event Service protocol, including:--bes_backend--[no]bes_lifecycle_events--bes_results_url--bes_timeout--bes_instance_name
Authentication and security
Bazel’s Build Event Service implementation also supports authentication and TLS. These settings can be controlled using the below flags. Please note that these flags are also used for Bazel’s Remote Execution. This implies that the Build Event Service and Remote Execution Endpoints need to share the same authentication and TLS infrastructure.--[no]google_default_credentials--google_credentials--google_auth_scopes--tls_certificate--[no]tls_enabled