v3.4 changelog quickstart →

Windows runners

Windows Server runners on EC2, from Flex labels or Fleet runner definitions.

Windows self-hosted runners are available since v2.4.0, and are ~6x cheaper than the official GitHub Actions Windows runners on spot, and about 3x cheaper on-demand (for example on the m8i family). See pricing for current rates.

Flex

Select a Windows image and x64 EC2 family in the job label:

.github/workflows/ci.yml
jobs:
build:
runs-on: runs-on=${{ github.run_id }}/image=windows25-full-x64/family=m8i
Fleet

Publish a Windows runner fleet in Terraform and target the fleet label:

main.tf
runners = {
windows = {
family = ["m8i.large"]
image = "windows25-full-x64"
}
}
fleets = {
windows = {
runner = "windows"
}
}
.github/workflows/ci.yml
jobs:
build:
runs-on: runs-on/fleet=windows/env=production

Default images#

ImageArchitectureDescription
windows22-full-x64x64Windows Server 2022, mostly compatible with the official Windows 2022 GitHub runner image.
windows25-full-x64x64Windows Server 2025, mostly compatible with the official Windows 2025 GitHub runner image.
windows22-base-x64x64Base Windows 2022 image — boots faster, no preinstalled software.
windows25-base-x64x64Base Windows 2025 image — boots faster, no preinstalled software.

Example#

.github/workflows/ci.yml
name: Windows
on:
workflow_dispatch:
jobs:
default:
runs-on: runs-on=${{ github.run_id }}/image=windows22-full-x64/family=m8i
steps:
- uses: runs-on/action@v2
- name: Checkout
uses: actions/checkout@v7
- name: Check current dir and env variables
run: |
dir .
echo $env:USERNAME
echo $env:RUNS_ON_RUNNER_NAME
- name: Logs
run: |
Get-Content -Path "C:\runs-on\output.log"
- name: Users
run: |
Get-LocalUser | Format-Table -AutoSize Name,Enabled,PasswordLastSet

Inspecting agent logs#

On Windows runners, the RunsOn agent output is stored in C:\runs-on\output.log. Those logs are also shipped to the CloudWatch log group for EC2 instances.

Limitations#

  • Windows runners are slow to boot (~1min for base images, ~2-3min for full images). Warm pools can reduce this to 20-30 seconds.
  • Hyper-V-dependent workloads require explicitly opting into nested-virt on supported x64 families such as m8i.
  • Some legacy or easily-installable software has been removed to ensure faster boot times and lower disk usage.