Skip to main content

GitHub Actions Runner Module (ARM64)

The gh-runner-mig-arm64 module provisions ARM64-based GitHub Actions self-hosted runners on GCP using Managed Instance Groups (MIGs).

Overview

FeatureValue
ArchitectureARM64 (T2A / C4A Axion)
Base ImageUbuntu 22.04 LTS
Container RuntimeDocker-in-Docker
AuthenticationGitHub App or PAT
ScalingAuto-scaling or fixed size
EphemeralSingle job execution

Key Benefits

  • 18-31% faster than x86 equivalents
  • 18% cheaper per vCPU-hour
  • Native ARM64 support for multi-arch builds
  • Enterprise-grade security (Shielded VMs, optional Confidential VMs)

Supported Regions

ARM64 instances are available in these regions:

RegionAvailable
us-central1
us-east1
us-west1
europe-west1
europe-west4
asia-southeast1
northamerica-northeast1
warning

The project's primary region (northamerica-northeast1) does NOT support ARM64. Runners are deployed to us-central1.

Usage

Basic Example

module "github_runners" {
source = "../modules/gh-runner-mig-arm64"

project_id = var.project_id
region = "us-central1"
network = google_compute_network.runners.self_link
subnet = google_compute_subnetwork.runners.self_link
github_app_id = "1998375"
github_app_private_key = var.github_private_key
org_name = "badal-io"
runner_group = "badal-arm64-${var.env_type}"
labels = ["arm64", "ubuntu", "docker", "gcp", var.env_type]
}

High-Performance Example

module "github_runners_perf" {
source = "../modules/gh-runner-mig-arm64"

project_id = var.project_id
region = "us-central1"
machine_type_cores = 8
enable_nvme = true
enable_autoscaling = true
min_replicas = 1
max_replicas = 10
target_cpu_utilization = 0.7

# ... other config
}

Input Variables

Required

VariableTypeDescription
project_idstringGCP Project ID
networkstringVPC network self_link
subnetstringSubnet self_link

GitHub Authentication

VariableTypeDescription
github_app_idstringGitHub App ID
github_app_private_keystringGitHub App private key (PEM)
github_tokenstringAlternative: Personal Access Token
org_namestringGitHub organization name

Machine Configuration

VariableTypeDefaultDescription
machine_type_coresnumber2vCPUs (1, 2, 4, 8, 16, 32, 48)
regionstringus-central1GCP region
preemptibleboolfalseUse preemptible instances
enable_nvmeboolfalseEnable NVMe disk interface

Scaling

VariableTypeDefaultDescription
target_sizenumber1Fixed instance count
enable_autoscalingboolfalseEnable CPU-based autoscaling
min_replicasnumber1Minimum instances
max_replicasnumber10Maximum instances
target_cpu_utilizationnumber0.6Target CPU for scaling

Security

VariableTypeDefaultDescription
enable_shielded_vmbooltrueEnable Shielded VM features
enable_confidential_vmboolfalseEnable Confidential Computing
enable_secure_bootbooltrueEnable Secure Boot
enable_vtpmbooltrueEnable vTPM
enable_integrity_monitoringbooltrueEnable Integrity Monitoring

Outputs

OutputDescription
instance_templateInstance template self_link
instance_group_managerMIG self_link
service_account_emailRunner service account
autoscalerAutoscaler self_link (if enabled)
health_checkHealth check self_link

Architecture

Zone Distribution

The module distributes instances across zones for high availability:

zones = ["us-central1-a", "us-central1-b", "us-central1-f"]
note

us-central1-c is excluded as it doesn't support ARM64 instances.

Ephemeral Mode

Runners are configured in ephemeral mode:

  1. Runner starts and registers with GitHub
  2. Picks up a single job
  3. Executes the job
  4. Unregisters and terminates
  5. MIG replaces with fresh instance

This ensures:

  • Clean environment for each job
  • No state leakage between jobs
  • Automatic security patching via image updates