Skip to main content

GitHub Actions Compute Resources and Parallelism

Default Runner Specs

GitHub Actions provides GitHub-hosted runners — cloud VMs managed by GitHub — out of the box.

Standard Runners

LabelOSvCPURAMStorageArchitecture
ubuntu-latest / ubuntu-24.04Ubuntu 24.04 LTS416 GB14 GB SSDx86_64
ubuntu-22.04Ubuntu 22.04 LTS416 GB14 GB SSDx86_64
windows-latest / windows-2022Windows Server 2022416 GB14 GB SSDx86_64
macos-latest / macos-15macOS 1537 GB14 GB SSDARM64 (M1)
macos-13macOS 13414 GB14 GB SSDx86_64 (Intel)

ubuntu-latest offers the best cost-performance ratio and is the standard choice for most CI/CD workloads. macOS runners consume minutes at a higher multiplier (see below).

Minute Multipliers

GitHub Actions free and paid tiers consume minutes, but the cost multiplier varies by OS.

OSMultiplier
Linux
Windows
macOS (Intel)10×
macOS (ARM64)

Concurrency Limits by Plan

Concurrent Jobs (GitHub-Hosted Runners)

The number of jobs that can run simultaneously depends on your plan.

PlanLinux/Windows ConcurrencymacOS Concurrency
Free205
Pro405
Team6050
Enterprise500 (default; can be increased)50
Public repositoriesEffectively unlimitedEffectively unlimited

Public repositories benefit from GitHub's generous free tier with virtually no concurrency restrictions.

Self-Hosted Runner Concurrency

When using self-hosted runners, concurrency is limited only by the number of registered runner instances — there are no plan-based caps.


How Parallelism Works

Matrix Strategy

The simplest parallelization mechanism. GitHub generates one job per combination of matrix variables.

jobs:
test:
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
node: [18, 20, 22]
max-parallel: 4 # cap simultaneous jobs (omit to run all combinations in parallel)
fail-fast: false # continue other jobs even if one fails
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
- run: npm test
  • Up to 256 jobs per matrix
  • Use include / exclude to add or remove specific combinations

Parallel Jobs Within a Workflow

Jobs without a needs dependency run in parallel by default.

jobs:
lint:
runs-on: ubuntu-latest
steps: [...]

unit-test:
runs-on: ubuntu-latest
steps: [...]

build:
needs: [lint, unit-test] # waits for both lint and unit-test to finish
runs-on: ubuntu-latest
steps: [...]

Concurrency Groups

Prevent redundant runs on the same branch or PR.

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true # cancel older runs when a new one is triggered

Ways to Scale Up Compute

1. Larger Runners

GitHub provides beefier hosted runners at a higher cost. Requires Team or Enterprise plan.

Linux Larger Runners

vCPURAMStorage
416 GB14 GB
832 GB300 GB
1664 GB300 GB
32128 GB2.9 TB
64256 GB2.9 TB

Windows Larger Runners

Equivalent specs to Linux (4–64 vCPU).

GPU Runners

NVIDIA Tesla T4 GPU runners are available for Enterprise plans.

jobs:
heavy-build:
runs-on: ubuntu-latest-16-cores # 16 vCPU larger runner
steps:
- uses: actions/checkout@v4
- run: make build

Larger runner labels are created and managed under Organization Settings > Actions > Runners.

2. Self-Hosted Runners

Install the GitHub Actions runner agent on your own infrastructure (on-prem servers, cloud VMs, containers).

Advantages

  • Full control over hardware specs (including dedicated physical servers)
  • Direct access to internal network resources (databases, private registries, etc.)
  • Long-running builds do not consume GitHub-billed minutes

Disadvantages

  • You are responsible for infrastructure maintenance and security
  • Not recommended for public repositories (risk of malicious code execution from forks)
jobs:
build:
runs-on: self-hosted # any registered self-hosted runner
# or
runs-on: [self-hosted, linux, x64, high-memory] # filter by labels

Ephemeral Self-Hosted Runners with ACA Jobs

For a cost-efficient pattern that spins up runners only when a job needs them, see ACA Job Self-Hosted Runner.

3. Combining with Docker Build Cloud

If Docker image builds are the bottleneck, Docker Build Cloud offloads builds to Docker's cloud infrastructure, reducing the dependency on runner specs.


Best Practices

Leverage Caching

Caching dependency downloads can cut minutes off every run.

- uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
EcosystemCache PathKey Source
npm~/.npmHash of package-lock.json
NuGet (.NET)~/.nuget/packagesHash of *.csproj
pip (Python)~/.cache/pipHash of requirements.txt
Docker layers/tmp/.buildx-cacheHash of Dockerfile

Parallelize Independent Work

# Bad: everything runs sequentially
lint → unit-test → integration-test → e2e-test → build → deploy

# Good: independent tasks run in parallel
lint ─┐
├→ build → deploy
unit-test ─┘
integration-test (separate parallel job)

Set Timeouts

The default timeout is 6 hours. Set a realistic upper bound to avoid runaway jobs.

jobs:
build:
timeout-minutes: 30

Choosing the Right Runner

ScenarioRecommended Runner
Standard CI (tests, lint, build)ubuntu-latest (cheapest, fast)
Windows app build/testwindows-latest
iOS/macOS app buildmacos-latest
High-memory workloads (ML, large builds)Larger runners (16–64 cores)
Internal network access requiredSelf-hosted runner
Docker build accelerationCombine with Docker Build Cloud

Security

  • Never use self-hosted runners on public repositories (risk of arbitrary code execution from forked PRs)
  • Store secrets in repository, Organization, or Environment Secrets
  • Minimize GITHUB_TOKEN permissions with explicit permissions
permissions:
contents: read
pull-requests: write

Comparison with Azure DevOps Pipelines

GitHub Actions and Azure DevOps Pipelines share similar concepts, but their compute resource design philosophies differ in meaningful ways.

Microsoft-Hosted Agent Specs

ItemGitHub Actions (Standard)Azure DevOps (Standard)
Linuxubuntu-latest: 4 vCPU / 16 GBubuntu-latest: 2 vCPU / 7 GB
Windows4 vCPU / 16 GB2 vCPU / 7 GB
macOS3–4 vCPU / 7–14 GB3 vCPU / 14 GB (extra cost)
Storage14 GB SSD10 GB SSD

GitHub Actions has higher default specs (4 vCPU / 16 GB vs 2 vCPU / 7 GB for Azure DevOps).

Parallelism Model

ItemGitHub ActionsAzure DevOps
Parallel unitJobPipeline Run
How concurrency is managedIncluded in plan (20–500 concurrent jobs)Parallel Jobs purchased separately
Free tier2,000 min/month + 20 concurrent jobsPublic: unlimited; Private: 1 parallel job only
Scaling costPlan upgrade or larger runners$40/month per additional parallel job

Azure DevOps treats parallel job count as an explicit, separately purchased resource. GitHub Actions bundles generous concurrency into each plan tier, making it easier to get started.

Agent/Runner Management

ItemGitHub ActionsAzure DevOps
Hosted resource groupingRunner Groups (Org or Enterprise)Agent Pools (Org or Project)
Self-hosted registrationRepository / Org / EnterpriseAgent Pool
Auto-scalingLarger runners or self-hosted scale-outScale Set Agents (VMSS) with autoscale
Ephemeral instancesACA Jobs or ephemeral runner actionsVMSS agents launch per job

YAML Comparison

# GitHub Actions
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: dotnet build
# Azure DevOps Pipelines
jobs:
- job: Build
pool:
vmImage: ubuntu-latest
steps:
- checkout: self
- script: dotnet build

The structure is nearly identical. The key difference is in the ecosystem: GitHub Actions uses Actions (uses), while Azure DevOps uses Tasks (task).

Which to Choose

PriorityRecommendation
Code is already on GitHubGitHub Actions (seamless integration)
Heavy use of Azure servicesAzure DevOps (rich service connections and environment management)
Maximize free concurrencyGitHub Actions (20 concurrent jobs on free tier)
Enterprise governanceAzure DevOps (granular project/team/approval-gate management)
Higher default hosted runner specsGitHub Actions (4 vCPU / 16 GB by default)

Summary

GitHub Actions Compute Resources — Quick Reference

Default spec: ubuntu-latest = 4 vCPU / 16 GB RAM
Concurrency: Free=20, Pro=40, Team=60, Enterprise=500 concurrent jobs
Parallelism: Matrix strategy / parallel jobs / concurrency groups
Scaling up: Larger runners (4–64 vCPU) / self-hosted runners
Cost efficiency: Cache dependencies / set timeouts / choose the right OS

GitHub Actions excels at "high specs out of the box with minimal setup." Azure DevOps excels at "granular project governance and approval workflows." The two are also frequently used together — hosting code on GitHub while deploying via Azure Pipelines is a common hybrid architecture.