This project deploys self-hosted GitHub runners to be used for multi-architecture builds and offers up to 90% faster builds. The implementation is reflective of a CI/CD solution we built for a mid-size security startup.
Typically, multi-architecture builds leverage an emulation tool like QEMU to enable cross-platforms builds from a single machine. This offers a simpler configuration, but delivers a significant perfomance hit when emulating another architecture.
Our solution uses the native node strategy to give us the performance gains of native architecture builds, but still supporting multi-architecture manifests.
Going through the guide, you will notice how the native-build
action (self-hosted runners) runs roughly 90% faster than the emulated-build
action (github-hosted runners), and roughly 95% faster leveraging Docker Build Cloud
Improving build times has a direct impact on DORA metrics. Primarily on the Lead time for changes
and Time to restore
, but has an impact on all metrics. If this use-case fits your purposes, the drop in build times could have a significant impact on your teams DORA report.
-
Generate GitHub PAT
Follow these docs to generate a PAT that the self-hosted runners will use to register with the target repository/organization.
-
Update the variables.tf
You can update the variables.tf with the config url and pat or create a .tfvars file
variable "github_config" { type = object({ config_url = string pat = string }) default = { config_url = "https://github.com/${organization}/${repo}" pat = "${github_pat}" } }
-
Initialize AZ CLI
run the following commands to initialize your az cli
az cloud set --name AzureCloud
az login
az account set --subscription ${subscription}
- Deploy Cluster
terraform init
terraform plan
terraform apply -auto-approve
- Create a PR to validate pipelines
Update the REGISTRY
value to match your ghcr repository, push your changes, and create a Pull Request.
This will trigger the emulated-build
and native-build
to kickoff.
This is a new feature set that offers blazing fast builds, multi-architecture support, shared build caching right from the Docker Desktop app.
Setup is straightforward, and can be done following this guide: DBC setup guide. Once you've done this, you will be able to target remote builders for local development builds. This is hugely beneficial for heavier/multi-architecture builds, since you can leverage the speed of native-arch builders for local development!
Following this guide, you can integrate these builders into your CI/CD pipelines: CI/CD integration guide. Also, see the docker-build-cloud.yml
for the working example for this project.