GloriousFlywheel provides a cross-forge runner pool that serves both GitLab CI and GitHub Actions from the same Kubernetes cluster. Six runner types are deployed across two scaling models.
| Runner | Forge | Scaling | Base Image | Privileged | Use Case |
|---|---|---|---|---|---|
{prefix}-docker |
GitLab CI | HPA | Alpine | No | General CI jobs |
{prefix}-dind |
GitLab CI | HPA | Alpine + Docker | Yes | Container builds |
{prefix}-nix |
GitLab CI | HPA | NixOS | No | Reproducible builds |
gh-docker |
GitHub Actions | ARC | Alpine | No | General CI jobs |
gh-dind |
GitHub Actions | ARC | Alpine + Docker | Yes | Container builds |
gh-nix |
GitHub Actions | ARC | NixOS | No | Reproducible builds |
GitLab runners use Kubernetes HorizontalPodAutoscalers (HPA) with configurable min/max replicas and CPU-based scaling. Runners are always warm with at least one replica.
GitHub Actions runners use ARC (Actions Runner Controller) scale sets
with scale-to-zero. Runner pods are created on demand when a workflow job
matches the runs-on label and terminated after the job completes.
graph TD
subgraph cluster["Kubernetes Cluster"]
subgraph ns_gl["gitlab-runners namespace"]
GL_NIX["{prefix}-nix"]
GL_DOCKER["{prefix}-docker"]
GL_DIND["{prefix}-dind"]
end
subgraph ns_arc_sys["arc-systems namespace"]
CTRL["ARC Controller"]
end
subgraph ns_arc["arc-runners namespace"]
GH_NIX["gh-nix"]
GH_DOCKER["gh-docker"]
GH_DIND["gh-dind"]
end
subgraph ns_cache["nix-cache namespace"]
ATTIC["Attic API"]
BAZEL["Bazel Cache"]
end
end
GL_NIX -->|"cluster DNS"| ATTIC
GH_NIX -->|"cluster DNS"| ATTIC
GL_NIX --> BAZEL
GH_NIX --> BAZEL
CTRL -->|"manages"| GH_NIX
CTRL -->|"manages"| GH_DOCKER
CTRL -->|"manages"| GH_DIND
tofu/modules/gitlab-runner/ and tofu/modules/arc-runner/.ATTIC_SERVER and
ATTIC_CACHE environment variables for transparent binary cache access.