bazel build and bazel test steps run unchanged. When it’s green, you measure the result against the baseline you took first.
Talk to us to agree the trial’s terms and success criteria.
Who does what
The deployment has to be ready for CI traffic, with its runners registered, before you dark-launch in step 2.
1. Take a baseline
Before changing anything, record how your current CI performs. Measuring results lists what to capture. A week of ordinary traffic is enough.2. Dark-launch a copy of your pipeline
Add a job that runs your existing build and test steps on a Workflows runner group, next to your current jobs. It targets the group with your CI provider’s own selector, adds the setup step, and is marked so a failure can’t block a merge:- GitHub Actions
- Buildkite
- GitLab CI
- CircleCI
main, on pull requests, or both. Pull requests give you the numbers developers actually feel; main gives you a steady stream of comparable builds.
The runner group name and each provider’s selector are covered in runner groups.
3. Exclude tests that only work on your current CI
Some tests depend on something only your current CI can reach: a database, an internal service, a license server. Tag them:BUILD.bazel
poc config group, so only the dark-launched job sees it and your current CI and every developer’s build are unchanged:
.bazelrc
--config=poc to the dark-launched job’s bazel calls, such as bazel test //... --config=poc.
Keep the list short and write it down. Each of these is either a network path to open or a test to fix before you switch over.
4. Turn on the poc group from config.axl
If the dark-launched job runs Aspect CLI tasks, such as aspect test, turn the poc group on in config.axl instead of adding --config=poc to each call. The check limits it to Workflows runners, so the same tasks on your current CI and on developer machines are unchanged:
.aspect/config.axl
config.axl applies to aspect tasks only. A plain bazel call still takes --config=poc on its command line. Remove the group once every tagged test is fixed or can reach what it needs.
5. Add what a non-hermetic build needs on the machine
If the build depends on something installed on the machine rather than fetched by Bazel, such as a system library a C++ target links against, the runners need it too:- Hosted by Aspect: tell Aspect what’s missing; see requesting changes.
- Self-hosted: build a runner image with it; see .

