Skip to content

Windows self-hosted runners

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).

The table below shows the per-minute prices of various runner types using EC2 instances launched by RunsOn, against comparable official managed GitHub runners. Cost includes compute + storage using the default RunsOn stack parameters. Networking costs can vary depending on your usage but all ingress traffic on AWS is free. Most users can significantly reduce egress traffic by using the Magic Cache feature, as well as ECR for storing docker images.

4cpu (m7i-flex.xlarge)
$0.0025
vs GitHub $0.0320
8cpu (c7i-flex.2xlarge)
$0.0048
vs GitHub $0.0640
16cpu (c7i-flex.4xlarge)
$0.0091
vs GitHub $0.1280
32cpu (c7i-flex.8xlarge)
$0.0180
vs GitHub $0.2560
64cpu (c7i-flex.16xlarge)
$0.0330
vs GitHub $0.5120
96cpu (c7i.24xlarge)
$0.0560
vs GitHub $0.7680

$/min, us-east-1 spot prices, for the instance type selected at the time of the calculation. Prices can vary based on time of day, region, and instance type selected. Savings are higher if you include the speed gains (your jobs will consume less minutes) or use previous-generation instance types.

You can opt into a specific image by setting the image label in your workflow.

ImageDescription
windows22-full-x64Windows2022 x64 image mostly compatible with official Windows2022 GitHub runner image
windows25-full-x64Windows2025 x64 image mostly compatible with official Windows2025 GitHub runner image
windows22-base-x64Base Windows2022 x64 image, boots faster but has no preinstalled software
windows25-base-x64Base 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
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

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.

  • 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.
  • Windows images are lacking the Hyper-V framework and related tooling, because virtualization on AWS is only available on bare-metal instances.
  • Some legacy or easily available through actions software has been removed to ensure faster boot times and lower disk usage.