From 78303a22042e2aed8f98369f2fd672d15941384c Mon Sep 17 00:00:00 2001 From: Benjamin Ingberg Date: Mon, 24 Mar 2025 00:34:11 +0100 Subject: [PATCH] Add blogpost about bonanza --- .../2025-03-24-bazel-buildbarn-and-bonanza.md | 63 ++++++++++++++++++ .../all_the_things.webp | Bin 0 -> 38920 bytes 2 files changed, 63 insertions(+) create mode 100644 blog/2025-03-24-bazel-buildbarn-and-bonanza/2025-03-24-bazel-buildbarn-and-bonanza.md create mode 100644 blog/2025-03-24-bazel-buildbarn-and-bonanza/all_the_things.webp diff --git a/blog/2025-03-24-bazel-buildbarn-and-bonanza/2025-03-24-bazel-buildbarn-and-bonanza.md b/blog/2025-03-24-bazel-buildbarn-and-bonanza/2025-03-24-bazel-buildbarn-and-bonanza.md new file mode 100644 index 0000000..16e5aea --- /dev/null +++ b/blog/2025-03-24-bazel-buildbarn-and-bonanza/2025-03-24-bazel-buildbarn-and-bonanza.md @@ -0,0 +1,63 @@ +--- +slug: bazel-buildbarn-and-bonanza +title: "Bazel, Buildbarn and Bonanza" +authors: benjamin +tags: [buildbarn, bazel] +--- + +# Bazel, Buildbarn and Bonanza + +In the Buildbarn event at Snowflake this week, Ed Schouten presented the work on +the Bonanza project. Bonanza is a prototype for a drop in replacement Bazel with +improvements to its communication protocols and written as client that performs +all of its actions remotely, deduplicated and cacheable. + +# How is it different from Bazel? + +Bazel is written in an interesting manner. It is designed from the ground up to +represent a stable description of a build that is reproducible from any +developer's machine. Any developer can check out the same source code ask Bazel +to analyze it and get the exact commands which Bazel would run to perform the +build. + +This involves a lot of computation: Resolving bazel modules, downloading +repository rules, executing them, analyzing the `.bzl` and `BUILD.bazel` files, +and finally executing the actions themselves. + +Bazel internally represents these computation steps as pure functions returning +deterministic values from a stable key, internally represented as `SkyFunctions` +returning `SkyValues` from `SkyKeys`. + +A `SkyFunction` should return the same `SkyValue` given the same `SkyKey` which +makes it a good candidate for being computed only once and have the result +cached and fed throught to the next step. But peculiarly only the action +execution itself has been offloaded to remote cache and execution. + + + +![cache all the things](./all_the_things.webp) + +This is what Bonanza attempts to resolve. Instead of having all of that state +computed and represented locally, repeated by each developer and discarded +whenever a flag changes, Bonanza is designed from the ground up to offload all +computations, downloads, and analysis to a remote cacheable system. This +essentially reduces the client side to a very light weight program with the +primary purpose of scanning the source code for modifications and uploading any +local changes. + +# What's the current state? + +The project is still in an early state prototype state. In the presentation Ed +demonstrated how far the prototype has come, and it was very impressive. The +Bonanza client as of today is capable of analyzing the bb-storage codebase. + +There is still a lot remaining before it's a production ready system but it is +very impressive progress. Bonanza is capable of running the full `bzlmod` +resolution, fetching all relevant repository rules from upstream, run those +repository rules, and analyzing the resulting codebase, basically performing +everything a Bazel `cquery` does, all with fully remote and cacheable manner. + +For shops which lean heavily into remote caching and execution the remaining +local load is often the bottleneck for your builds, the ability to offload the +remaining pieces to your build cluster may be the next evolution of your build +system. diff --git a/blog/2025-03-24-bazel-buildbarn-and-bonanza/all_the_things.webp b/blog/2025-03-24-bazel-buildbarn-and-bonanza/all_the_things.webp new file mode 100644 index 0000000000000000000000000000000000000000..5d8a1799dd63e461d45cda393dc7755103216190 GIT binary patch literal 38920 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