Part 1 was Jenkins as code with ephemeral workers. Part 2 was macOS. This one moves a chunk of the CI workload off Jenkins entirely - onto GitHub Actions, with EC2 spot as the runner fleet.

Jenkins isn't dead here. It still handles the big builds - macOS, Windows, anything that runs for hours or needs custom orchestration. GitHub Actions runs alongside it for the workloads where it fits better.

This post covers the self-hosted spot runner pattern: how to point GitHub Actions at your own ephemeral EC2 fleet, and what bites once you do.

Why bother

GitHub's managed runners are fine for small teams. A few things push you toward self-hosted: