Windows self-hosted runners
Learn how to set up and use Windows self-hosted runners for your GitHub Actions workflows.
Windows self-hosted runners for GitHub Actions are available since v2.4.0.
RunsOn Windows runners are ~10x cheaper than the official GitHub Actions Windows runners (for instance when using the m7i family).
Pricing
Per-minute costs including compute + 40GB gp3 EBS storage. Reduce egress costs further with Magic Cache.
Spot prices, us-east-1. Actual costs vary by region, time of day, and instance type selected.
Default images
You can opt into a specific image by setting the image label in your workflow.
x64
| Image | Description |
|---|---|
| windows22-full-x64 | Windows2022 x64 image mostly compatible with official Windows2022 GitHub runner image |
| windows25-full-x64 | Windows2025 x64 image mostly compatible with official Windows2025 GitHub runner image |
| windows22-base-x64 | Base Windows2022 x64 image, boots faster but has no preinstalled software |
| windows25-base-x64 | Base Windows2025 x64 image, boots faster but has no preinstalled software |
To use them, you need to reference the image you want to use and an instance family that supports Windows:
jobs:
build:
runs-on: runs-on=${{ github.run_id }}/image=windows22-full-x64/family=m7i
Example
name: Windows
on:
workflow_dispatch:
jobs:
default:
runs-on: runs-on=${{ github.run_id }}/image=windows22-full-x64/family=m7i
steps:
- name: Checkout
uses: actions/checkout@v6
- 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 output of the RunsOn agent is stored in the C:\runs-on\output.log file.
Those logs are also shipped to the CloudWatch log group for EC2 instances.
Limitations
- Windows runners are quite slow to boot (~1min currently for base images, ~2-3min for full images). Using warm pools can help reduce this to under 20-30 seconds.
- Hyper-V-dependent workloads require explicitly opting into
nested-virton supported x64 families such asm8i. Existing stacks must be upgraded before nested-virtualization jobs can launch, and arm64 runners are not supported for this feature. - Some legacy or easily available through actions software has been removed to ensure faster boot times and lower disk usage.