March 18th, 2025

Upcoming Updates for Azure Pipelines Agents Images

Update: The Ubuntu-20.04 retirement date for Microsoft-hosted agents has been moved to April 30. On Managed DevOps Pools, the ubuntu-20.04 image will be available up to June 30.

To ensure our hosted agents in Azure Pipelines are operating in the most secure and up-to-date environments, we continuously update the supported images and phase out older ones. In October 2024, we announced support for Ubuntu-24.04. Soon, we plan to update the ubuntu-latest image to map to Ubuntu-24.04. Additionally, MacOS 15 Sequoia and Windows 2025 images will be generally available later this year. Alongside these new releases, we will deprecate older images like Ubuntu-20.04 and Windows Server 2019. Please refer to the following subsections for detailed updates on individual images.

Ubuntu

Ubuntu-24.04

The Ubuntu-24.04 Pipelines image is available since October last year. We plan to update the ubuntu-latest image to map to Ubuntu-24.04 soon. After this change all the jobs using ubuntu-latest image will run on ubuntu-24.04 instead of ubuntu-22.04. Please note that some tools are no longer available on the Ubuntu-24.04 image.

Task/Tool Description
MSBuild@1 Task doesn’t work as Mono and MSBuild aren’t available for Ubuntu 24. Use native .NET on Ubuntu instead.
NuGetCommand@2 Task has reduced functionality as Mono and NuGet aren’t available for Ubuntu 24, see instructions on Migrating to .NET CLI on Ubuntu.
Terraform Terraform isn’t available on the ubuntu-24.04 image. You can use the Terraform extension and TerraformInstaller@1 task to make Terraform available in your pipeline.
Ubuntu-20.04

We are deprecating support for the Ubuntu 20.04 image in Azure Pipelines because it will reach its end of support soon. Please find the deprecation plan for the same below.

Key Dates:

Deprecation Start Date: March 19, 2025
Brownout period: 19th March 2025 to 28th March 2025
Full Removal Date: April 30th, 2025

What This Means for You:

Starting from March 18, 2025, organization using the Ubuntu 20.04 image will begin to see a banner indicating the upcoming deprecation. To raise awareness about the upcoming deprecation we will temporarily fail the jobs (brownout) that are using Ubuntu 20.04 from March 19th 2025 to April 8th 2025. From April 30, 2025, the Ubuntu 20.04 image will be fully removed from our hosted agents, and any pipelines still using this image will fail to run.

Brownout schedule

19th March 2025: 21:00 – 5:00 UTC
21st March 2025: 5:00 – 13:00 UTC
25th March 2025: 13:00 – 21:00 UTC
26th March 2025: 21:00 – 5:00 UTC
28th March 2025: 5:00 – 13:00 UTC
1st April 2025: 13:00 – 21:00 UTC
8th April 2025: 13:00 – 21:00 UTC

Recommended Actions:

To avoid disruptions, we recommend updating your pipelines to use the Ubuntu 22.04 or 24.04 image as soon as possible. The updated Ubuntu images offer improved performance, security, and support for the latest tools and libraries.

How to find out the impacted pipelines

To find out the impacted pipelines that are using the deprecated images please run the script present here.

You can also identify pipelines that are using a deprecated (e.g. ubuntu-20.04) image, by checking the following location: https://dev.azure.com/{organization}/{project}/_settings/agentqueues

Then, filter on the image name, refer the following snapshot.

Image FilterImageByVersion Blog

How to Update Your Pipelines:

1. Open your pipeline YAML file.
2. Locate the vmImage property.
3. Change the value from ubuntu-20.04 to ubuntu-22.04 (ubuntu-24.04, ubuntu-latest).
4. Save and run your pipeline to ensure it works with the new image.

Example:

pool:  
  vmImage: 'ubuntu-22.04'
pool:  
  vmImage: 'ubuntu-24.04'
pool:  
  vmImage: 'ubuntu-latest'
Alternate methods to use Ubuntu 20.04 in Pipeline Jobs

Customers that are still dependent on Ubuntu 20.04 even when it reaches its end of support state, have the following options to Use Ubuntu 20.04 in a pipeline:

Using a Container job allow you to specify a container image independently of the hosted pipeline image. For example:

jobs:
- job: ubuntu20
  container: ubuntu:20.04
  displayName: Use Ubuntu 20.04 container image
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - script: printenv

With Managed DevOps Pools, you can create an agent pool using the ubuntu-20.04 Azure Pipelines image until June 30. You can also use images from the Azure Marketplace.

Lastly, you can create a Self-hosted agent using any Operating System supported by the Pipelines Agent.

Windows

Windows Server 2025

Windows Server 2025 image is in public preview, and we plan to make the image generally available soon. Look out for further updates on this.

Windows Server 2019

Following the release of Windows Server 2025, we plan to deprecate the Windows Server 2019 images. Stay tuned for updates on the specific dates.

mac-OS

mac-OS Sequoia

mac-OS 15 sequoia image is in public preview as of now and we plan to make it generally available in the coming weeks. Look out for further updates on this.

Apple silicon support for mac-OS image

We understand that there has been significant anticipation for Apple Silicon support in macOS images. We are pleased to inform you that we are currently conducting a private preview. If you want to participate in the private preview, please raise a ticket here. A public preview image is expected to be available later this year.

We understand that some of these changes may require some adjustments to your pipelines, and we are here to help. If you have any questions or need assistance, please reach out to our support team or visit our community forums.
Thank you for your understanding and cooperation as we continue to improve the Azure Pipelines experience.

Category
CI/CDDevOps

Author

Shubham Agarwal
Senior Product Manager
Eric van Wijk
Principal Product Manager

41 comments

  • Per · Edited

    Our builds - windows-latest also started to fail on April 10, 2025.
    Task: AzureCli@2 produces "cannot find the file specified" (seems to be related to bash.exe).

    <code>

    <code>

    Read more
      • Per 2 days ago

        Hi Eric - thanks for the response.

        Your pointer to the Dev Community helped me - someone else was running into this as well: https://developercommunity.visualstudio.com/t/Azure-Devops-Pipeline-task-AzureCLI2-ER/10888471?q=windows-latest&sort=newest
        and more info here / long-standing issue apparently suddenly appearing after upgrading the AzureCLI@2 to latest version: https://github.com/Azure/azure-cli/issues/31189#issuecomment-2804038068

        Fixed it with adding

        <code>

        <code>

        Read more
  • Charles Trent (h4ck3r8ug5)

    Our builds were failing suddenly, and after closer inspection, .Net 9.0 has been removed from Ubuntu-Latest as the default tool installed. Was there a notice for this?

  • Rausch, Peter 7 days ago

    It appears as though libssl is also missing in ubuntu-latest now.. is that correct?

  • Aaron Nogareda 1 week ago · Edited

    sqlcmd is gone using ubuntu-latest, not sure how is was possible to force everyone who use ubuntu-latest by default without a proper list of what is missing in the new one and what is required, this was working fine until today 10/04/0205 using ubuntu-latest with Microsoft-hosted agents, also, the process has changes you can get different agent during your pipeline not keeping inherit the rest of the software so you need to apply it again.

    • Eric van WijkMicrosoft employee 1 week ago

      Hi Aaron,

      sqlcmd is currently not available for Ubuntu 24.04. You can use the same ubuntu-22.04 image ubuntu-latest used to point to by excplicitely specifying the ubuntu-22.04 image label.

      • Aaron Nogareda

        yes, we did that, thank you for quick response.

  • David Flores Escobosa 1 week ago

    Hi all!

    Oh!, It looks like sbt has been removed as well. Why ? It is a very popular tool in the Scala ecosystem.

    Thanks!

  • P Narendra

    Hi,

    We have used Ubuntu-20.04 for one of .netcore project and generated image long back. Still we are using the same image and deployed to AKS nonprod and Production instances. Does affect the running instances?

  • Vinod Kumar

    Hi, We are using php7.4 and i see php7.4 is not available in 22.04 or later. is there a work around for this? this is a very short time frame for us to move over.

      • Eric van WijkMicrosoft employee

        Hi Vinod, for #1 it would be how long the container image is available. This is up to the publisher for the image. For #3 it is November 10, 2026 (the .NET 8 end-of-life date, as that is what the Agent uses to execute).

      • Eric van WijkMicrosoft employee · Edited

        Hi Vinod, for PHP7.4 you can try the php:7.4.33-zts-bullseye container image:

        - job: debian11
          container: php:7.4.33-zts-bullseye
          pool:
            vmImage: 'ubuntu-latest'
          steps:
          - script: printenv
      • Vinod Kumar · Edited

        I see the below options alternatives. i am assuming the below are three individual alternatives and are mutually exclusive and linked to one another. please confirm my understanding.Also, is there a deadline even with using one of these alternatives. I see for #2, it is june 30th. what about other #1 and #3?

        1.Using a Container job allow you to specify a container image independently of the hosted pipeline image.
        2.With Managed DevOps Pools, you can create an agent pool using the ubuntu-20.04 Azure Pipelines image until June 30. You can also use images from the Azure Marketplace.
        3.Lastly, you can...

        Read more
  • Natalia Manrique

    Hi, We currently use the azure-identity or cryptography modules for our Python functions. We’re using Ubuntu 20.04. Can I use Ubuntu 24.04? Is it supported by this version?

  • james · Edited

    Hi.
    we are using self-hosted agent.
    Is this related to Microsoft-hosted agents?

  • '; block.insertAdjacentElement('beforebegin', codeheader); let button = codeheader.querySelector('.copy-button'); button.addEventListener("click", async () => { let blockToCopy = block; await copyCode(blockToCopy, button); }); } }); async function copyCode(blockToCopy, button) { let code = blockToCopy.querySelector("code"); let text = ''; if (code) { text = code.innerText; } else { text = blockToCopy.innerText; } try { await navigator.clipboard.writeText(text); } catch (err) { console.error('Failed to copy:', err); } button.innerText = "Copied"; setTimeout(() => { button.innerHTML = '' + svgCodeIcon + ' Copy'; }, 1400); }