yamlizr 4.4.0
dotnet tool install --global yamlizr --version 4.4.0
dotnet new tool-manifest
dotnet tool install --local yamlizr --version 4.4.0
#tool dotnet:?package=yamlizr&version=4.4.0
nuke :add-package yamlizr --version 4.4.0
yamlizr
The yamlizr .NET global tool converts Azure DevOps Classic Designer Build and
Release Definitions, and any Task Groups they reference, into Azure Pipelines YAML or GitHub Actions
workflows.
Generated YAML is not production ready. Review unsupported constructs, missing approvals/gates and generated files before putting them into use.
Quick Start
Install with a .NET 8, 9 or 10 SDK and matching .NET and ASP.NET Core runtimes
(included in the corresponding SDK). The
NuGet tool exposes the yamlizr command.
dotnet tool install --global yamlizr
$env:CasCap__AzureDevOpsOptions__PAT = Read-Host 'Azure DevOps token' -MaskInput
yamlizr generate `
--organisation https://dev.azure.com/example-org `
--project ExampleProject `
--outputpath "$PWD\out" `
--create-directory
The PowerShell 7 example writes under out/ExampleProject/. Clear the environment token afterward.
The Linux container alternative
needs no local .NET installation; verified image platforms are linux/amd64, linux/arm64 and
linux/arm/v7.
Commands
Program
defines --help, --version and the required generate subcommand.
yamlizr --help
yamlizr generate --help
The generate contract:
| Option | Contract |
|---|---|
-pat, --token |
PAT or pipeline access token; prefer configuration over secret arguments. |
-org, --organisation |
Absolute organization URI. |
-proj, --project |
Existing team project name. |
-out, --outputpath |
Output base directory. Pass explicitly: source uses the application base directory although help says current directory. |
--create-directory |
Creates missing output directory without an interactive prompt. |
--filter |
Case-insensitive name substring, not a wildcard. |
--phasetype |
Release phase type, default AgentBasedDeployment; other enum choices are not a fidelity guarantee. |
--inline |
Expands task groups into the calling job instead of separate template files. |
--githubactions |
Also converts to GitHub Actions; forces task groups inline. |
--parallelism |
Parallel conversion; definition retrieval and output already use parallel loops. |
Behavior and Limits
- Reads Azure DevOps definitions; it does not update them or queue pipelines.
- Appends the project name unless the output directory's final segment already matches it.
Writes
AzureDevOpsBuilds,AzureDevOpsReleases, and non-inlinedAzureDevOpsTaskGroups; GitHub conversion addsGitHubBuildsandGitHubReleases. - Definition filenames contain a sanitized name and ID. Matching files are overwritten; stale files from earlier runs are not removed. Treat generated YAML and logs as potentially sensitive.
- Missing credentials, invalid organization URI, project lookup and connection failures return
1. Collected conversion errors and warnings can still end with0: inspect the final summary. - Unsupported triggers, artifacts, approvals, gates and flattening losses need manual review. See the detailed conversion coverage.
- There is no automatic generated-YAML preview validation in this command and no CLI-level retry or rate limiter. A successful conversion is not proof that a pipeline will deploy correctly.
Configuration
AppHost
layers these sources, later sources winning:
appsettings.jsonnext to the toolappsettings.jsonin the current working directory- .NET User Secrets
- environment variables
The bindable
AzureDevOpsOptions
section is CasCap:AzureDevOpsOptions. Explicit command options win over these sources.
When both are empty, SYSTEM_ACCESSTOKEN, SYSTEM_COLLECTIONURI and SYSTEM_TEAMPROJECT
are fallbacks, not overrides. User Secrets are loaded explicitly in every environment.
Configuration Examples
Minimal working-directory appsettings.json, with the token supplied separately:
{
"CasCap": {
"AzureDevOpsOptions": {
"OrganisationUri": "https://dev.azure.com/example-org",
"Project": "ExampleProject"
}
}
}
An unattended run can instead supply all connection fields via environment:
$env:CasCap__AzureDevOpsOptions__PAT = Read-Host 'Azure DevOps token' -MaskInput
$env:CasCap__AzureDevOpsOptions__OrganisationUri = 'https://dev.azure.com/example-org'
$env:CasCap__AzureDevOpsOptions__Project = 'ExampleProject'
yamlizr generate --outputpath "$PWD\out" --create-directory
Use a valid unexpired token with Project and Team, Build, Release, Task Groups and Variable Groups read permissions, plus the project's required access. See the full permission guidance and pipeline token mapping. Never commit a token; container environment values remain inspectable.
Data Flow
The CLI orchestrates SDK retrieval and library conversion; generated files are local output, not changes to Azure DevOps.
flowchart TD
Config[appsettings, user secrets, environment] --> CLI([yamlizr generate])
CLI --> Cmd[GenerateCommand]
Cmd --> Conn[VssConnection]
Conn --> AzDO[(Azure DevOps)]
Cmd --> Gen[YamlPipelineGenerator]
Gen --> Yaml[(YAML files on disk)]
Gen --> Warn[Run summary of unconverted constructs]
classDef owned fill:#e8f0fe,stroke:#315da8
class CLI,Cmd,Gen owned
The diagram is supplemental; registry renderers may not render Mermaid. See the library README for embedding conversion in a .NET host.
License
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
This package has no dependencies.
| Version | Downloads | Last Updated |
|---|---|---|
| 4.4.0 | 82 | 10/24/2026 |
| 4.3.4 | 162 | 10/4/2026 |
| 4.3.3 | 126 | 9/26/2026 |
| 4.3.2 | 118 | 9/23/2026 |
| 4.3.1 | 118 | 9/21/2026 |
| 4.3.0 | 130 | 9/19/2026 |
| 4.2.4 | 140 | 9/11/2026 |
| 4.2.3 | 146 | 9/7/2026 |
| 4.2.2 | 133 | 9/6/2026 |
| 4.2.1 | 124 | 9/6/2026 |
| 4.2.0 | 143 | 9/6/2026 |
| 4.1.1 | 136 | 9/6/2026 |
| 4.1.0 | 141 | 9/6/2026 |
| 4.0.0 | 132 | 9/4/2026 |
| 3.1.6 | 146 | 9/4/2026 |
| 3.1.5 | 219 | 8/18/2026 |
| 3.1.4 | 129 | 8/18/2026 |
| 3.1.3 | 693 | 3/21/2026 |
| 3.1.2 | 316 | 2/2/2026 |
| 3.1.1 | 232 | 1/28/2026 |