Windows Server 2025 is now available
Breaking changes
Windows Server 2025 is now available for GitHub Actions and Azure DevOps users. You can use the windows-2025 image label in your YAML to select this image.
GitHub Actions
jobs:
jobName:
runs-on: windows-2025
Azure DevOps
pool:
vmImage: windows-2025
The image is marked as "beta" for now. It means some software can be unstable on the new platform. Also, there could be queueing issues as the capacity will be balanced only throughout the next weeks. Please report any problems with the new image to this repository.
Platforms affected
- [x] Azure DevOps
- [X] GitHub Actions
Runner images affected
- [ ] Ubuntu 20.04
- [ ] Ubuntu 22.04
- [ ] Ubuntu 24.04
- [ ] macOS 11
- [ ] macOS 12
- [ ] macOS 13
- [ ] macOS 13 Arm64
- [ ] macOS 14
- [ ] macOS 14 Arm64
- [ ] Windows Server 2019
- [ ] Windows Server 2022
- [x] Windows Server 2025
Software difference between Windows Server 2022 and Windows Server 2025
| Tool name | Windows Server 2022 | Windows Server 2025 | Notes |
|---|---|---|---|
| Go |
|
|
If your use-case requires using any of these versions, consider using tasks to install Go on-flight:
|
| Node.js |
|
|
If your use-case requires using any of these versions, consider using tasks to install Node.js on-flight:
|
| Ruby |
|
|
|
| Python |
|
|
On GitHub Actions, actions/setup-python can install any version on-flight so this change doesn't impact users |
| PyPy |
|
|
Deprecated all the versions besides the most recent ones |
| LLVM | 18.* | 19.* | Updated to the recent version |
| strawberryperl | 5.32.1 | 5.40.0 | Updated to the recent version |
| maven | 3.8.* | 3.9.* | Updated to the recent version |
| InnoSetup | latest available | - | Removed from the Windows Server 2025 image due to maintenance reasons. |
| Mercurial | 5.0.0 | - | Removed from the Windows Server 2025 image due to maintenance reasons. |
| mingw | 12.2.0 | 14.2.0 | Includes updates to
|
| NSIS | 3.10 | - | Removed from the Windows Server 2025 image due to maintenance reasons. |
| openssl | 1.1.1 | 3.4.0 | Updated to the recent version |
| Azure Service Fabric runtime | 9.1.1436.9590 | 10.1.2493.9590 | Updated to the recent version |
| Azure Service Fabric SDK | 6.1.1436 | 7.0.2712 | Updated to the recent version |
| svn (tortoisesvn) | latest available | - | Removed from the Windows Server 2025 image due to maintenance reasons. |
| Alibaba Cloud CLI | latest available | - | Removed from the Windows Server 2025 image due to maintenance reasons. |
| bindgen | latest available | - | Removed from the Windows Server 2025 image due to maintenance reasons. |
| cargo-audit | latest available | - | Removed from the Windows Server 2025 image due to maintenance reasons. |
| cargo-outdated | latest available | - | Removed from the Windows Server 2025 image due to maintenance reasons. |
| cbindgen | latest available | - | Removed from the Windows Server 2025 image due to maintenance reasons. |
| Java |
|
|
Default Java switched to 17.* for Windows Server 2025 image. |
| PostgreSQL | 14.12 | 17.* | Updated to the recent version |
| MongoDB | 5.0.* | 7.0.* | Updated to the recent version |
| Visual Studio components | * | Excluded
|
Removed from the Windows Server 2025 image due to maintenance reasons. |
| .NET Core SDK |
|
|
Please consider using tasks to install any version on-flight:
|
| PowerShell modules | * | Excluded
|
Removed from the Windows Server 2025 image due to maintenance reasons. |
| Android Command Line Tools | 8.0 | 16.0 | Updated to the recent version |
| Android SDK Build-tools |
|
|
Updated to the recent version |
| Android cmake |
|
|
Updated to the recent version |
| Cached Docker images |
|
- | Removed from the Windows Server 2025 image due to maintenance reasons. |
Miscellaneous:
- Standalone WDK installation was deprecated. Starting with Visual Studio 17.12, the recommended way to install the WDK is via nuget
- Only the latest version of Haskell will be installed on the image
- Temporary user installer and its profile were removed from the image
- mongo.exe shell has been removed from MongoDB since version 6
- The following directories were compressed:
- C:\Windows\assembly
- C:\Windows\WinSxS
- C:\Program Files\dotnet
- C:\Program Files (x86)\Android
Is Windows SDK 10.0.22621 included in the Windows Server 2025 image? This issue says it is not but the README says it does.
WSLv2 on GitHub Actions is now supported. https://github.com/vedantmgoyal9/setup-wsl2/issues/3
Is there any possibility WSLv2 can be enabled by default, instead of WSLv1?
Will you consider adding WMIC Feature on Demand to the windows-2025 runner?
For Microsoft Windows Servers, wmic has been deprecated since 2016 and it is not installed by default on Windows Server 2025 (see Features we're no longer developing).
Unfortunately there are some npm packages which rely on this deprecated facility and which have so far not followed migration advice from Microsoft.
The following issues have been raised for the respective npm modules:
- https://github.com/simonepri/pidtree/issues/26
- https://github.com/indexzero/ps-tree/issues/69
Although it is theoretically possible to execute the following, it is a massively sized package that would be installed, so it is not really a practical workaround:
DISM /Online /Add-Capability /CapabilityName:WMIC~~~~
Is there any possibility of having the ARM64 version in a separate image? (just like macos-15 / macos-15-arm64)
I believe there should be only one default Python, not two, right?
3.9.* (default) 3.10.* (cached) 3.11.* (cached) 3.12.* (default) 3.13.* (cached)
Is Windows SDK 10.0.22621 included in the Windows Server 2025 image?
I believe there should be only one default Python, not two, right?
@dongle-the-gadget, @janbrasna, thanks for highlighting the typos, updated software difference
Is there any possibility WSLv2 can be enabled by default, instead of WSLv1?
@vedantmgoyal9, image rollout with WSLv2 starts this week and will take a few days to complete.
Will you consider adding WMIC Feature on Demand to the windows-2025 runner?
@MikeMcC399, we have no plans on adding this particular deprecated feature to the image. The workaround you mentioned works in runtime via run: step (~8mins) or you could stick to the windows-2022, while package owners update the code.
Is there any possibility of having the ARM64 version in a separate image?
@ifarbod, there are no current plans on introducing Windows Server ARM64 images.
Any possibility of enabling WSLv2 on Windows 2022 runners as well?
@shamil-mubarakshin
Will you consider adding WMIC Feature on Demand to the windows-2025 runner?
@MikeMcC399, we have no plans on adding this particular deprecated feature to the image. The workaround you mentioned works in runtime via run: step (~8mins) or you could stick to the windows-2022, while package owners update the code.
Many thanks for your response. 🙂 I think this is the right decision not to support this deprecated feature, however I needed to ask you guys before going back to the owners of the packages which need updating.
One of the best things about Windows Server 2025 is that it has Winget by default.
May I piggyback a question on this issue regarding Runner Availability, I recall that i was tolled that you usually provide the latest and second to latest version, which as not 2025 is out makes me worried that 2019 may be discontinued soonisch. Which would be bad, VS 2022 can no Longer compile drivers for Windows 7 and well 5% of Sandboxie's user bases still uses windows 7 and i would not want to be forced to discontinue this.
So what are the plans for the 2019 runner and can we maybe keep it for many more years?
So what are the plans for the 2019 runner and can we maybe keep it for many more years?
Sandboxie on Windows 7 user here. Please keep 2019 runner running.
@DavidXanatos @paradoxicallist
Using an out of support and deprecated OS version with some sort of security focused product like sandboxie doesn't provide the security/isolation you're looking for. (i'm not talking about incompatible hardware, user choice etc., i'm just stating some general facts)
Security goes from lower layer to higher ones, not the other way around. You can never be secure on the higher layer if your underlaying layer isn't secure. Windows 7 is far from secure even with all extended updates when compared to latest Windows 11 build. You can read more about what i'm talking about in here, Clean Source Principle: https://learn.microsoft.com/en-us/security/privileged-access-workstations/privileged-access-success-criteria#clean-source-principle
Another thing is the fact that resources (humans, storage, time etc.) are limited. So the more GitHub staff spend on old obsolete stuff, the less resource they can spend on modern and newer things.
@HotCakeX
Well people will not stop using windows 7 I think the past few years without updates made that clear enough. And with Sandboxie its at least somewhat less secure, if an application can only do a hand full of allowed hand picked syscalls its inherently more secure than if it can do all of them without restrictions.
Besides Sandboxie is not only for security, its also for compartmentalization, why junk your OS full of crappy software that will leave garbage behind, if you can instead install it in a sandbox and dispose of it in its entirety once you no longer want to use it.
PS: Just leave the old obsolete stuff in as is no updates no nothing, no work, and HDD space costs virtually nothing. Better then being Violent and forcing People to upgrade against their will. IMHO
When can we expect windows-2025 in Azure DevOps?
I just created https://github.com/microsoft/msquic/pull/4898 to try to move to using windows-2025 for our BVTs, but it's failing to build kernel mode drivers. Looking at your docs, I believe this is because of these missing components:
- Windows Driver Kit 10.1.26100.2161
- Windows Driver Kit Visual Studio Extension 10.0.26100.12
What's the status on these? This is blocking us from moving our builds (I will try to just move test execution for now).
When can we expect
windows-2025in Azure DevOps?
For us, it became available yesterday.
When can we expect windows-2025 in Azure DevOps?
@sharpjs, windows-2025 became available for Azure DevOps Pipelines, announcement has been updated accordingly
So what are the plans for the 2019 runner and can we maybe keep it for many more years?
@DavidXanatos, per support policy we keep 2 latest Windows Server images as GA. windows-2025 will hit GA in the upcoming months, which will be shortly followed by windows-2019 deprecation announcement. windows-2019 will be fully offboarded in the second half of 2025.
Using self-hosted runners could be an alternative
I just created https://github.com/microsoft/msquic/pull/4898 to try to move to using windows-2025 for our BVTs, but it's failing to build kernel mode drivers. Looking at your docs, I believe this is because of these missing components
@nibanks, could you open a separate issue, providing all the usual details and repro steps for us to check?
I noticed wsl2 was installed in the windows-2025 agent in Azure DevOps pipelines and was hoping I could use it to run the Azure service bus emulator in my integration tests. I tried installing and setting up podman, but I'm getting an error when it tries to create the wsl distro. Do the agents not support nested virtualization?
For context, here's the error I'm getting:
WSL2 is not supported with your current machine configuration.
Please enable the "Virtual Machine Platform" optional component and ensure virtualization is enabled in the BIOS.
Enable "Virtual Machine Platform" by running: wsl.exe --install --no-distribution
For information please visit https://aka.ms/enablevirtualization
Error code: Wsl/InstallDistro/Service/RegisterDistro/CreateVm/HCS/HCS_E_HYPERV_NOT_INSTALLED
When will Windows 2025 and Ubuntu 24.04 be available in Azure Managed DevOps Pools?
To pickup the question from above: Is there any estimate, when windows-2025 will be available in Azure Managed DevOps Pools? Or is this not even planned?
When will Windows 2025 and Ubuntu 24.04 be available in Azure Managed DevOps Pools?
Ubuntu 24.04 is now available in MDP as of yesterday.
Do we have a timeline of when this will replace windows-latest?
- https://github.com/actions/runner-images/issues/12129 is related to the question about when
windows-2025will be promoted towindows-latest
When will it be available on Managed DevOps Pools? Will it also support Gen2 VMs like the new v6 series ?
Also in Managed DevOps pool it doesn't show the image sizes, yet they define the disk size which is then used for pricing in Managed DevopsPool - is there a way to see the size of the image? Mmh i guess I can answer this myself: this is the same image as used on Managed Self-hosted agent which have 14GB SSD, so since they are the same image they will also have 14GB SSD.
So in terms of pricing and performance, would you all here agree that this applies:
Standard HDD S4 32GB £1.18 (has no 16GB size) 500IOPS, 60MB/s SSD Price E3 16GB £1.05/month 500IOPS, 100MB/s Premium SSD P3 16GB £1.79 120IOPS, 25MB/s
So really in managed DevOps Pool for Performance I should select Standard SSD as a disk if I use the provided runner images, right?
Normally the requirement for Win 2022 Server is at least 32GB, so normally I would choose at least 64GB disk image, so if Microsoft cut things down really to a bare minimum than this would be great but would be nice to know where to see it so I can get my costs for a Managed DevOps Pool clear.
Would you consider adding RabbitMq Message broker to the runner ? Mainly for integration tests for micro-services with MongoDb and Rabbitmq.
Can we have a minimal version of the Windows Server 2025 where only what is by default in the Windows Server 2025 ISO file exists and none of the 3rd party stuff is there?
I don't want to expose my build process to 3rd party programs installed on the runner. I always install my requirements and dependencies through Winget.
A default Windows Server 2025 runner would be really useful, pretty much just like how you get a pure Windows Server 2025 VM on Azure. Offering such runner costs less than what is available now since it has less maintenance.
Now that WSL2 is the default Linux subsystem, will it finally be possible to run Linux containers using Docker, or to switch to Linux containers in Docker? This has been a frustrating limitation of the current Windows Server 2022-based image, which has forced DevOps engineers to build hacky integration test pipelines just to run integration tests relying on Linux-based containers like MySQL.
Can the winget version been updated? Current version is v1.6.10121 which is a bit old
Can the
wingetversion been updated? Current version is v1.6.10121 which is a bit old
I have this step in my workflow that takes care of it
- name: Updating Winget
shell: pwsh
run: |
Write-Host -Object "The version of the pre-installed Winget on the Runner:"
Write-Host -Object (winget --version)
# Retrieve the latest Winget release information
$WingetReleases = Invoke-RestMethod -Uri 'https://api.github.com/repos/microsoft/winget-cli/releases'
$LatestRelease = $WingetReleases | Select-Object -First 1
# Direct links to the latest Winget release assets
[string]$WingetURL = $LatestRelease.assets.browser_download_url | Where-Object -FilterScript { $_.EndsWith('.msixbundle') } | Select-Object -First 1
[string]$WingetLicense = $LatestRelease.assets.browser_download_url | Where-Object -FilterScript { $_.EndsWith('License1.xml') } | Select-Object -First 1
[string]$LatestWingetReleaseDependenciesZipURL = $LatestRelease.assets.browser_download_url | Where-Object -FilterScript { $_.EndsWith('DesktopAppInstaller_Dependencies.zip') } | Select-Object -First 1
[hashtable]$Downloads = @{
# 'Winget.msixbundle' = 'https://aka.ms/getwinget' This is updated slower than the GitHub release
'DesktopAppInstaller_Dependencies.zip' = $LatestWingetReleaseDependenciesZipURL
'Winget.msixbundle' = $WingetURL
'License1.xml' = $WingetLicense
}
$Downloads.GetEnumerator() | ForEach-Object -Parallel {
Invoke-RestMethod -Uri $_.Value -OutFile $_.Key
}
Expand-Archive -Path 'DesktopAppInstaller_Dependencies.zip' -DestinationPath .\ -Force
# Get the paths to all of the dependencies
[string[]]$DependencyPaths = (Get-ChildItem -Path .\x64 -Filter '*.appx' -File -Force).FullName
# Required to update the Winget
Stop-Process -Name WindowsTerminal -Force -ErrorAction Ignore
Add-AppxProvisionedPackage -Online -PackagePath 'Winget.msixbundle' -DependencyPackagePath $DependencyPaths -LicensePath 'License1.xml'
Add-AppPackage -Path 'Winget.msixbundle' -DependencyPath "$($DependencyPaths[0])", "$($DependencyPaths[1])" -ForceTargetApplicationShutdown -ForceUpdateFromAnyVersion