7.1 GitHub-Hosted Runners & Larger Runners
Key Takeaways
- Standard GitHub-hosted runners are fully managed, ephemeral virtual machines that provision a clean operating system per job and are destroyed on completion.
- Standard runner sizing differs by repository visibility: public repositories get 4-vCPU/16 GB Linux and Windows runners, while private repositories get 2-vCPU/8 GB runners; both have 14 GB of SSD storage.
- The `-latest` labels move: `ubuntu-latest` now resolves to Ubuntu 24.04 and `windows-latest` now resolves to Windows Server 2025, so pin an explicit image label when a job depends on a specific OS version.
- The pre-installed toolcache (`/opt/hostedtoolcache` on Linux/macOS, `C:\hostedtoolcache` on Windows) lets `actions/setup-*` activate runtimes locally instead of downloading them over the network.
- Larger runners (GitHub Team and GitHub Enterprise Cloud) scale from 2 up to 96 vCPUs, add a Tesla T4 GPU tier, and are the only GitHub-hosted option offering static egress IP ranges and Azure private networking.
GitHub-Hosted Runners & Larger Runners
In GitHub Actions, the runner is the compute engine that executes the jobs defined in your workflow files. GitHub provides two primary deployment models for runner infrastructure: GitHub-hosted runners (fully managed by GitHub) and self-hosted runners (managed by your organization).
For organizations seeking zero infrastructure management overhead, GitHub-hosted runners offer instantly available, fully managed, secure virtual environments. Understanding the hardware specifications, pre-installed toolcache, lifecycle guarantees, and enterprise-grade Larger Runners is essential for optimizing build speed, controlling costs, and passing the GitHub Actions Certification (GH-200) exam.
1. Standard GitHub-Hosted Runner Architecture & Lifecycle
Standard Linux and Windows GitHub-hosted runners are Azure virtual machines managed entirely by GitHub; macOS runners run in GitHub's own macOS cloud. When a workflow job specifies a standard runner label (such as runs-on: ubuntu-latest), GitHub provisions a fresh virtual machine exclusively for that job. GitHub does not publish the underlying Azure VM SKU, so size your jobs from the published CPU/RAM/SSD table below rather than from an assumed instance family.
+-----------------------------------------------------------------------------+
| GITHUB-HOSTED RUNNER EPHEMERAL VM LIFECYCLE |
| |
| [1. Job Queued] ─── Workflow triggers; GitHub schedules job |
| [2. VM Provisioning] ─── Clean Azure VM spawned from golden image |
| [3. Daemon Bootstrap] ─── Runner listener initiates outbound HTTPS poll |
| [4. Job Execution] ─── Steps run with passwordless sudo / Admin privs |
| [5. Disk Wipe & Kill] ─── VM is permanently destroyed; state discarded |
+-----------------------------------------------------------------------------+
Ephemeral Isolation Model
Every standard GitHub-hosted runner operates under a strict ephemeral lifecycle:
- Single-Job Longevity: A virtual machine executes exactly one workflow job. It is never reused for subsequent jobs, even within the same workflow run or repository.
- Zero Cross-Job Contamination: Residual files, modified system binaries, environment variables, downloaded dependencies, and credentials created during job execution are permanently destroyed when the VM is de-provisioned.
- Administrative Access: Jobs execute with administrative privileges (
sudowithout a password on Linux and macOS; full Administrator privileges on Windows), allowing workflows to install system packages, run Docker containers, and modify kernel parameters without privilege escalation barriers. - Execution Limits: A single job can run for up to 6 hours (360 minutes). If a job exceeds this duration, GitHub Actions automatically terminates the execution.
Standard Hardware & OS Specifications
Repository visibility changes the hardware. This is a favourite exam distinction: the same runs-on: ubuntu-latest label gives you a 4-vCPU machine in a public repository and a 2-vCPU machine in a private one.
Standard runners for public repositories (free and unlimited)
| Operating System | runs-on Label | vCPU | Memory (RAM) | SSD Storage | Architecture |
|---|---|---|---|---|---|
| Ubuntu Linux | ubuntu-latest, ubuntu-24.04, ubuntu-22.04 | 4 | 16 GB | 14 GB | x64 |
| Ubuntu Linux (arm64) | ubuntu-24.04-arm, ubuntu-22.04-arm | 4 | 16 GB | 14 GB | arm64 |
| Ubuntu Linux (single-CPU) | ubuntu-slim | 1 | 5 GB | 14 GB | x64 |
| Windows Server | windows-latest, windows-2025, windows-2022 | 4 | 16 GB | 14 GB | x64 |
| Windows (arm64) | windows-11-arm | 4 | 16 GB | 14 GB | arm64 |
| macOS (Intel) | macos-15-intel, macos-26-intel | 4 | 14 GB | 14 GB | Intel |
| macOS (Apple Silicon) | macos-latest, macos-14, macos-15, macos-26 | 3 (M1) | 7 GB | 14 GB | arm64 |
Standard runners for private repositories (consume included minutes, then billed)
| Operating System | runs-on Label | vCPU | Memory (RAM) | SSD Storage | Architecture |
|---|---|---|---|---|---|
| Ubuntu Linux | ubuntu-latest, ubuntu-24.04, ubuntu-22.04 | 2 | 8 GB | 14 GB | x64 |
| Ubuntu Linux (arm64) | ubuntu-24.04-arm, ubuntu-22.04-arm | 2 | 8 GB | 14 GB | arm64 |
| Ubuntu Linux (single-CPU) | ubuntu-slim | 1 | 5 GB | 14 GB | x64 |
| Windows Server | windows-latest, windows-2025, windows-2022 | 2 | 8 GB | 14 GB | x64 |
| macOS (Intel) | macos-15-intel, macos-26-intel | 4 | 14 GB | 14 GB | Intel |
| macOS (Apple Silicon) | macos-latest, macos-14, macos-15, macos-26 | 3 (M1) | 7 GB | 14 GB | arm64 |
[!NOTE]
ubuntu-slimis a container, not a VM. Single-CPU runners execute inside an unprivileged container on a shared VM, so Docker-in-Docker, filesystem mounts, and other privileged operations are unsupported. They also carry a 15-minute job timeout instead of the usual 6 hours, which makes them suitable for issue automation and other lightweight tasks rather than full builds.
Runner Image Changes: Why -latest Is a Moving Target
The January 2026 blueprint calls out runner image migration explicitly, because a -latest label silently changes the operating system underneath your jobs.
| Label | Resolves to today | Migration you must plan for |
|---|---|---|
ubuntu-latest | Ubuntu 24.04 | Ubuntu 20.04 has been retired. Workflows still pinned to ubuntu-20.04 fail; migrate to ubuntu-22.04 or ubuntu-24.04. ubuntu-26.04 is in public preview and will eventually take over -latest. |
windows-latest | Windows Server 2025 | windows-latest migrated from Windows Server 2022 to Windows Server 2025. Jobs that assumed 2022-era tooling, PowerShell versions, or Visual Studio installs can break silently. Pin windows-2022 to defer, or fix the workflow for 2025. |
macos-latest | macOS 15 on Apple Silicon (arm64) | Intel-only builds must pin an explicit Intel label such as macos-15-intel. Community actions may not have arm64 binaries. |
[!WARNING] The exam scenario to recognize: a workflow that has run unchanged for a year suddenly fails after GitHub repoints a
-latestlabel. The fix is not to retry the job - it is to pin an explicit image label (ubuntu-24.04,windows-2022) while you remediate, then move forward deliberately. Preview images (ubuntu-26.04,windows-11-vs2026-arm) are excluded from the service level agreement and should never gate production.
2. Pre-Installed Software & The Toolcache Acceleration Model
GitHub-hosted runners are packaged with hundreds of pre-installed developer tools, compilers, CLI utilities, and SDKs. This includes Docker, git, kubectl, helm, aws-cli, azure-cli, gh, build utilities (make, cmake, gcc), and multiple versions of major programming language runtimes.
How the Local Toolcache Works
Rather than downloading language runtimes over the public internet on every workflow run, GitHub maintains a local directory called the toolcache (/opt/hostedtoolcache on Linux/macOS, C:\hostedtoolcache\windows on Windows).
When you use an official setup action, such as actions/setup-node, actions/setup-python, actions/setup-go, or actions/setup-java, the action executes the following resolution logic:
Workflow Step: uses: actions/setup-node@v4 with: node-version: '20'
│
▼
Does Node.js 20 exist locally in
/opt/hostedtoolcache/node/ ?
╱ ╲
YES NO
╱ ╲
▼ ▼
Symlink binary to PATH Download runtime from
(Execution time: ~1s) GitHub dist mirrors (~15s)
# Example: Leveraging pre-installed toolcache for instant initialization
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v4
# Resolves from local /opt/hostedtoolcache in < 2 seconds
- name: Setup Node.js Runtime
uses: actions/setup-node@v4
with:
node-version: '20.x'
cache: 'npm'
# Resolves from local /opt/hostedtoolcache in < 2 seconds
- name: Setup Python Environment
uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: 'pip'
Toolcache vs. actions/cache
- Toolcache: Read-only, pre-baked runtime directory included directly in the runner's base OS image. Maintained by GitHub; instantly symlinks standard binaries to
$GITHUB_PATH. actions/cache: Dynamic workflow-level caching mechanism that compresses, uploads, and downloads project-specific dependencies (such asnode_modules,~/.m2, or~/.cache/pip) across workflow runs via GitHub's cloud cache storage.
3. GitHub-Hosted Larger Runners for Enterprise & Team
For enterprise workloads requiring intensive compute (such as large C++/Rust compilations, extensive test suites, mobile app builds, or AI/ML model validation), standard 4-vCPU runners can become a build-time bottleneck. Furthermore, enterprise security policies often require deterministic IP allowlisting for corporate firewalls or direct connectivity into private cloud networks.
To solve these challenges, GitHub provides Larger Runners for organizations on GitHub Team and GitHub Enterprise Cloud (GHEC).
+-----------------------------------------------------------------------------+
| LARGER RUNNER SCALING SPECS |
| |
| [Linux only] ─── 2 vCPU │ 8 GB RAM │ 75 GB SSD |
| [Small] ─── 4 vCPU │ 16 GB RAM │ 150 GB SSD |
| [Medium] ─── 8 vCPU │ 32 GB RAM │ 300 GB SSD |
| [Large] ─── 16 vCPU │ 64 GB RAM │ 600 GB SSD |
| [X-Large] ─── 32 vCPU │ 128 GB RAM │ 1,200 GB SSD |
| [2X-Large x64] ─── 64 vCPU │ 256 GB RAM │ 2,040 GB SSD |
| [2X-Large arm64] ─── 64 vCPU │ 208 GB RAM │ 2,040 GB SSD |
| [3X-Large] ─── 96 vCPU │ 384 GB RAM │ 2,040 GB SSD |
| [GPU Accelerated] ─── 4 vCPU │ 28 GB RAM │ 1x Tesla T4 (16 GB VRAM) |
+-----------------------------------------------------------------------------+
Key Features of Larger Runners
- Advanced Compute & Memory: Linux and Windows sizes run from 2 vCPUs / 8 GB RAM up to 96 vCPUs / 384 GB RAM, with SSD capacity up to 2,040 GB. Linux is the only platform offered at the 2-vCPU size.
- GPU Acceleration: A single published GPU size - 4 vCPUs, 28 GB RAM, one NVIDIA Tesla T4 with 16 GB of VRAM, and 176 GB of SSD - with NVIDIA drivers preinstalled for machine-learning and rendering pipelines. Note that GPU capacity comes with modest CPU and memory, not the largest CPU tiers.
- macOS Larger Runners: two published sizes - Large (Intel): 12 vCPUs, 30 GB RAM and XLarge (arm64/M2): 5 vCPUs with 8-core GPU acceleration, 14 GB RAM. macOS larger runners do not support Azure private networking or static IP assignment.
- Autoscaling & Concurrency Limits: Administrators set maximum autoscaling thresholds per runner group to cap billing exposure while scaling from zero on queue demand. Up to 10 larger-runner pools can be configured with static IP address ranges.
4. Static IP Allowlisting & Azure VNet Private Networking
One of the primary historical drivers for managing on-premises self-hosted runners was network perimeter security: corporate firewalls, internal package registries, and staging databases could not open their ingress ports to the massive, dynamic public IP range used by standard GitHub-hosted runners.
Larger Runners eliminate this limitation through two enterprise networking capabilities:
┌─────────────────────────────────────────────────────────────────────────────┐
│ LARGER RUNNER NETWORKING TOPOLOGIES │
│ │
│ 1. STATIC PUBLIC IP POOL: │
│ [Larger Runner] ──(Fixed Public IP: 20.x.x.x)──> [Corporate Firewall] │
│ │
│ 2. AZURE VNET PRIVATE INJECTION: │
│ [Larger Runner] ──(Private VNet Peering/Subnet)─> [Internal DB / VPC] │
└─────────────────────────────────────────────────────────────────────────────┘
1. Static IP Address Pools
When you assign a Larger Runner group a Static IP configuration, GitHub allocates a dedicated, contiguous range of static public IPv4 addresses for that runner group. All outbound internet traffic originating from jobs executed on these runners egresses through these fixed IPs.
- Firewall Integration: Security teams add the assigned static IP range to corporate perimeter firewalls, AWS Security Groups, or database ingress rules.
- No Bastion / VPN Maintenance: Eliminates the operational overhead of running self-hosted forward proxies or VPN gateways solely for CI/CD traffic.
2. Azure Private VNet Integration
For organizations hosting workloads in Microsoft Azure or connected hybrid clouds (via Azure ExpressRoute), Larger Runners can be injected directly into a dedicated Azure Virtual Network (VNet) subnet.
- Zero Public Exposure: The runner interfaces directly with the organization's private subnet. Outbound traffic to internal databases, internal artifact repositories (such as Artifactory or Nexus), and private APIs routes entirely over private IP space without traversing the public internet.
- Network Security Group (NSG) Governance: Network administrators enforce custom NSG rules and route tables directly on the runner subnet.
5. Architectural Comparison: Standard vs. Larger Runners
| Feature / Dimension | Standard GitHub-Hosted Runners | GitHub-Hosted Larger Runners |
|---|---|---|
| Target Plans | Free, Pro, Team, Enterprise | GitHub Team & GitHub Enterprise Cloud |
| Compute Sizing | Fixed by repository visibility (4 vCPU / 16 GB public; 2 vCPU / 8 GB private) | Configurable, 2 to 96 vCPUs and 8 to 384 GB RAM |
| GPU Support | ❌ No GPU options available | ✅ One Tesla T4 GPU size (4 vCPU / 28 GB RAM / 16 GB VRAM) |
| Disk Storage | Fixed 14 GB SSD storage | Configurable, 75 GB to 2,040 GB SSD |
| IP Addressing | Dynamic (large Azure public IP pool, published weekly via the GET /meta API) | ✅ Static dedicated IP ranges (not available on macOS larger runners) |
| Private Networking | ❌ Public internet routing only | ✅ Azure Virtual Network (VNet) private subnet injection |
| Autoscaling Model | Instantaneous auto-provisioning | Managed autoscaling pools with concurrency caps |
| Billing Model | Included plan minutes + standard per-minute overage | Pay-per-minute billed directly based on compute tier multiplier |
An enterprise DevOps team needs to run integration tests that query an internal staging database hosted behind a corporate perimeter firewall. The team wants to use fully managed GitHub-hosted runners without provisioning or managing on-premises virtual machines. Which solution allows the firewall to permit runner traffic securely?
A workflow execution on ubuntu-latest includes a step with uses: actions/setup-node@v4 specifying node-version: '20'. Why does this setup step consistently complete in less than two seconds without incurring noticeable network latency?
A machine learning team wants GitHub-hosted CI runners that can execute CUDA test suites against a physical GPU. Which statement correctly describes what GitHub-hosted infrastructure can provide?