Skip to main content
Version: 5.2.x

Aspect Workflows

Introducing Aspect Workflows: the ultimate Bazel-powered CI/CD solution that seamlessly integrates with your existing CI provider.

Dramatically slash your compute costs and experience a 10x performance boost with our highly efficient CI workers. Designed to quickly ramp up and capitalize on Bazel's inherent incremental capabilities, these workers scale down when idle, optimizing resource usage.

Aspect Workflows can cut your CI times and associated compute expenses by an astounding 80% or more.

Our comprehensive solution offers:

  • 10x performance boost through Bazel's capabilities
  • Pre-warmed, auto-scaling, persistent CI runners tailored for Bazel workloads
  • Bazel configuration parameters optimized for CI environments
  • A robust, horizontally scaled remote cache
  • Remote execution backed by auto-scaling remote executors
  • Integrated monitoring and metrics for complete visibility
  • Selective delivery of only release artifacts affected by each change set
  • Seamless integration with Buildkite, CircleCI, and GitHub Actions (with GitLab CI/CD support coming soon)
  • A hassle-free, maintainable CI/CD system to keep your builds fast and green

Discover the full potential of Aspect Workflows – visit to learn more, book a demo, or start your one-month free trial today!

High-level design

Workflows has the following components:

  • A terraform module called workflows that can be used from your existing infrastructure-as-code setup.
  • A Node.js application called rosetta which abstracts the details of spawning the bazel CLI.

Rather than vanilla Bazel, Workflows always runs the Aspect CLI since it has some additional commands that we rely on, such as aspect outputs.


You can see Workflows in action on our open-source repositories.

Here is the configuration file in aspect-build/bazel-lib:

CC: /bin/false
- .
- e2e/bzlmod
- e2e/copy_to_directory

This configuration is shockingly short, because Workflows has all the right defaults to run Bazel.

Build generation

We use a few CI systems, but prefer Buildkite. Here are the builds for the bazel-lib project:

We use the CI system's dynamic pipelines feature, so the actual configuration for CI is generated when a request arrives.


You can check in the generated CI configuration in your repo if you want to edit it by hand.

Buildkite allows you to inspect the generated config in the User Interface by expanding the "Setup Aspect CI" step and looking in the Timeline tab. The "Uploaded Pipeline Steps" shows ~100 lines of YAML configuration was produced for our build:

Buildkite generated pipeline

Behind the scenes, Workflows has deployed an elastic pool of build agents using an EC2 Auto-Scaling Group. When a new machine boots, it is "warmed up" so that even the first build it performs is incremental. As a result, you can see that our builds are under two minutes, even though this repository has low traffic and so build agents generally expire and builds launch on fresh instances.


Developers can crawl through the whole Bazel log, but it may be hundreds of lines of spam. Or, they could click away from the CI results page to some dedicated "Bazel results UI" which shows much more information than they wanted, and requires yet another interface.

Our approach leverages the Aspect CLI, which has a Buildkite plugin. This lets us show build failures in an intuitive way on the page a developer is already looking at.

For example, here's a recent failure from a PR to that bazel-lib project:

Buildkite failure annotation

We see that the test failures are reported, with their JUnit XML files parsed. We link to the log file for each test failure, and provide a "how to reproduce" code snippet.