Key advantages
BuildBuddy remote runners have the following unique advantages:Fast Network Connection
Colocation with BuildBuddy servers ensures sub-millisecond round trip times between Bazel and BuildBuddy’s cache & RBE servers.
Persistent Execution
Running workloads in persistent execution environments using microVM snapshotting (on Linux) and persistent runners (on macOS) allows reusing Bazel’s in-memory analysis cache and local disk cache.
Products built on remote runners
There are two ways to use remote runners:BuildBuddy Workflows
Our continuous integration (CI) solution that runs Bazel builds and tests in response to git events (pull requests or pushes).
Remote Bazel
A CLI tool that works exactly like the Bazel command, but runs Bazel on a remote workspace and streams the output back to the local machine.
See our blog post
for more details on the motivation behind remote runners as well as some
real-world results.
Differences between Workflows and Remote Bazel
In many ways, Remote Bazel and Workflows are the same product and share much of the same backend code. Both are mechanisms to run code on remote runners. The primary difference is the entrypoint.- Workflows
- Remote Bazel
Workflows are configured with a config YAML that is checked in to GitHub.
Remote runs can be automatically triggered by GitHub events, like push and
pull events. Workflows are commonly used as a Continuous Integration (CI) solution.Workflows are a good fit if you:
Have a static list of commands to run
Want your commands checked in to your codebase for review
Are exclusively using BuildBuddy to run CI and do not have another CI provider that can initiate commands
Benefits of remote runners
Colocation with BuildBuddy servers
Network latency is often the biggest bottleneck in many Bazel Remote Build Execution and Remote Caching setups. This is because Bazel’s remote APIs require several chained RPCs due to dependencies between actions. To address this bottleneck, BuildBuddy remote runners are executed in the same datacenters where BuildBuddy RBE and Cache nodes are deployed. This results in sub-millisecond round trip times to BuildBuddy’s servers, minimizing the overhead incurred by Bazel’s remote APIs.Hosted, warm, Bazel instances
Running Bazel on most CI solutions is typically expensive and slow. There are several sources of overhead:Bazel download overhead
Bazel download overhead
When using Bazelisk, Bazel itself is re-downloaded and extracted on each CI run.
Cold JVM start
Cold JVM start
The Bazel server starts from a cold JVM, meaning that it will be running unoptimized code until the JIT compiler kicks in.
Empty analysis cache
Empty analysis cache
Bazel’s analysis cache starts empty, which often means the entire workspace has to be re-scanned on each CI run.
Repository re-fetching
Repository re-fetching
Any remote repositories referenced by the Bazel workspace all have to be re-fetched on each run.
Empty disk cache
Empty disk cache
Bazel’s on-disk cache starts completely empty, causing action re-execution or excess remote cache usage.
A well-chosen workspace can increase the build speed by an
order of magnitude by reusing the various cached results from the
previous execution. […] We have observed that builds that execute the same targets as a previous
build are effectively no-ops using this technique
Runner recycling
To match workloads to warm runners, BuildBuddy uses VM snapshotting powered by Firecracker on Linux, and a simpler runner-recycling based approach on macOS.- Firecracker VMs (Linux)
- Runner Recycling (macOS)
On Linux, remote runs are executed inside Firecracker VMs, which
have a low startup time (hundreds of milliseconds). VM snapshots include
the full disk and memory contents of the machine, meaning that the Bazel
server is effectively kept warm between runs.Remote runners use a sophisticated snapshotting mechanism that minimizes the
work that Bazel has to do on each CI run.First, VM snapshots can be stored both locally on the machine that ran the
remote run, as well as remotely in BuildBuddy’s cache. This way, if the
original machine that ran the remote run is fully occupied with other
workloads, subsequent runs can be executed on another machine,
but still be able to resume from a warm VM snapshot. BuildBuddy stores VM
snapshots in granular chunks that are downloaded lazily, so that unneeded
disk and memory chunks are not re-downloaded.Second, snapshots are stored using a branching model that closely mirrors
the branching structure of the git repository itself, allowing remote runs
to be matched optimally to VM snapshots.
For more technical details on our VM implementation, see our BazelCon
talk Reusing Bazel’s Analysis Cache by Cloning Micro-VMs.