On October 15, 2026 Microsoft retires 73 built-in task versions in Azure DevOps Services: CopyFiles@1, AzureCLI@0, DotNetCoreCLI@1, NuGetInstaller@0, PowerShell@1 and 68 more (official announcement).
Two dates matter:
- 2026-10-15, retirement. The tasks still run, but each run reports a retirement error that does not fail the pipeline.
- 2027-03-15, removal. Pipelines that still reference them fail with a blocking error.
So you have five months. The hard part is not the fix. It is finding every reference across dozens of repositories and templates, then knowing what each one should become. Of the 73 versions:
- 2 have a drop-in replacement;
- 24 have a replacement that needs input changes;
- 27 need a manual migration to a different task;
- 20 have no replacement at all (Xamarin, App Center, Azure Cloud Services and similar).
Option 1: a quick grep, nothing to install
The list of retired tasks is published as plain YAML, so three lines of shell give you the candidates in a checked-out repository:
url=https://raw.githubusercontent.com/HarnageaGabriel/trasloco/main/catalog/azure-pipelines/tasks.retirement.yaml
curl -fsSL "$url" | sed -n 's/^ *- task: //p' > retired-tasks.txt
grep -rniwF -f retired-tasks.txt --include='*.yml' --include='*.yaml' .
It is a text search: it also matches comments, and it cannot tell you which replacement to use.
Option 2: trasloco modernize --check
trasloco is an open-source (Apache-2.0) CLI I'm building to move CI/CD pipelines between platforms. Its first shipped command reads your pipelines with a real Azure Pipelines YAML parser and reports each retired task with its replacement and what to do:
$ trasloco modernize --check --format text -- .
azure-pipelines.yml:11:11 DotNetCoreCLI@1 -> DotNetCoreCLI@2 [replacement with input changes]
Replace DotNetCoreCLI@1 with DotNetCoreCLI@2 and review the replacement inputs before updating the pipeline.
More: https://harnageagabriel.github.io/trasloco/tasks/dotnetcorecli-1/
templates/azurecli.yml:11:11 AzureCLI@0 -> AzureCLI@3 [manual migration]
Migrate this step manually to AzureCLI@3, reviewing the documented behavior and input differences.
More: https://harnageagabriel.github.io/trasloco/tasks/azurecli-0/
templates/copyfiles.yml:11:11 CopyFiles@1 -> CopyFiles@2 [drop-in replacement]
Replace CopyFiles@1 with CopyFiles@2.
More: https://harnageagabriel.github.io/trasloco/tasks/copyfiles-1/
Found 3 retired task reference(s) in 3 file(s): 1 drop-in, 1 with input changes, 1 manual, 0 no replacement. Retired 2026-10-15, removed 2027-03-15 (pipelines fail after removal).
It exits with status 5 when something actionable remains, so it works as a CI gate. It also writes JSON and SARIF.
Install: grab a binary for Linux, macOS or Windows from the v0.1.0 release. Releases are signed with Sigstore (cosign) and carry SBOMs and build provenance; the install guide shows how to verify them.
GitHub Action (if your Azure Pipelines YAML lives in GitHub repositories), from the Marketplace:
- uses: HarnageaGabriel/trasloco@v0
with:
path: .
fail-on-findings: true
Azure Pipelines: the install guide has a complete Bash step that downloads a pinned release, checks it against the release checksums and runs the check.
One page per retired task
If you just want to know what replaces a given task, there is a page for each of the 73 versions, with the official replacement and the input differences: https://harnageagabriel.github.io/trasloco/
What it does not do (yet)
- It reports; it does not rewrite. A
--writemode that applies the safe rewrites is specified and comes next. - It reads YAML pipelines only, not classic (UI-defined) build and release definitions.
- The dates are those of Azure DevOps Services; Azure DevOps Server follows its own servicing.
Feedback, bug reports and pipelines that break the parser are very welcome: https://github.com/HarnageaGabriel/trasloco/issues
Top comments (0)