Tuned for Bazel
Generic cloud VMs, like GitHub Actions’ubuntu-latest, provision a fresh, empty filesystem for every job. Bazel’s output base is gone. Every action must either hit the remote cache or be re-executed from scratch. Even with a warm remote cache, the round-trip cost of fetching outputs adds up, and the Bazel JVM starts cold with no in-process state.
Aspect’s CI runners are designed around Bazel’s specific requirements. They are persistent VMs that accept multiple jobs in sequence rather than terminating after one. The Bazel JVM stays running between jobs, so in-memory state, including the analysis cache, carries over. Each runner mounts a RAID0 array across multiple NVMe drives to maximize filesystem IOPS, which matters for Bazel’s heavily file-intensive output base operations.
When a runner starts up, it can optionally be pre-warmed from an on-disk archive: Bazel’s fetch phase is already done, with repository rule fetches, extracted external dependencies, and a populated output base all restored before the first job runs. This eliminates the cold-start penalty for new machines joining the pool: even a fresh runner’s first job skips the dependency downloads. Cached builds routinely complete in under one minute.

