Complete azure-pipelines toolkit with generation and validation capabilities
97
97%
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Advisory
Suggest reviewing before use
This document provides a comprehensive reference for Azure Pipelines YAML syntax and structure.
Azure Pipelines follow a hierarchical structure:
Pipeline
└── Stages
└── Jobs
└── Steps# Minimal pipeline with implicit stage
trigger:
- main
pool:
vmImage: 'ubuntu-22.04'
steps:
- script: echo "Hello World"
displayName: 'Run a one-line script'stages:
- stage: Build
displayName: 'Build Stage'
jobs:
- job: BuildJob
displayName: 'Build Job'
pool:
vmImage: 'ubuntu-22.04'
steps:
- script: npm run build
displayName: 'Build Application'
- stage: Deploy
displayName: 'Deploy Stage'
dependsOn: Build
jobs:
- deployment: DeployJob
displayName: 'Deploy to Production'
environment: production
strategy:
runOnce:
deploy:
steps:
- script: echo "Deploying..."
displayName: 'Deploy'Defines CI triggers (when the pipeline should run automatically).
# Simple trigger
trigger:
- main
- develop
# Advanced trigger with path filters
trigger:
branches:
include:
- main
- release/*
exclude:
- feature/*
paths:
include:
- src/**
exclude:
- docs/**
tags:
include:
- v*Defines pull request triggers.
pr:
branches:
include:
- main
paths:
exclude:
- docs/**Defines scheduled triggers (cron syntax).
schedules:
- cron: "0 0 * * *"
displayName: Daily midnight build
branches:
include:
- main
always: trueDefines external resources used by the pipeline.
resources:
repositories:
- repository: templates
type: github
name: org/repo
ref: refs/heads/main
pipelines:
- pipeline: upstream
source: 'Upstream Pipeline'
trigger:
branches:
- main
containers:
- container: linux
image: ubuntu:22.04
packages:
- package: mypackage
type: npm
connection: npmConnection
name: '@scope/package'
version: '1.0.0'Defines the default agent pool for all jobs.
# Microsoft-hosted agent
pool:
vmImage: 'ubuntu-22.04'
# Self-hosted agent pool
pool:
name: 'MyAgentPool'
demands:
- agent.os -equals LinuxDefines pipeline-level variables.
variables:
buildConfiguration: 'Release'
vmImage: 'ubuntu-22.04'
# Variable groups
variables:
- group: 'my-variable-group'
- name: customVar
value: 'customValue'
# Template variables
variables:
- template: variables-template.ymlDefines runtime parameters (user input when pipeline runs).
parameters:
- name: environment
displayName: 'Target Environment'
type: string
default: 'staging'
values:
- dev
- staging
- production
- name: runTests
displayName: 'Run Tests'
type: boolean
default: true
- name: regions
displayName: 'Deployment Regions'
type: object
default:
- westus
- eastusStages represent major divisions in your pipeline (e.g., Build, Test, Deploy).
stages:
- stage: Build
displayName: 'Build Stage'
# Stage condition
condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
# Stage dependencies
dependsOn: [] # No dependencies, can run immediately
# Stage variables
variables:
stageVar: 'value'
jobs:
- job: BuildJob
steps:
- script: npm run buildstage: Unique identifierdisplayName: Human-readable namedependsOn: List of stages to wait forcondition: Condition to run the stagevariables: Stage-specific variablesjobs: Jobs to run in this stageJobs represent a series of steps that run sequentially on the same agent.
jobs:
- job: BuildJob
displayName: 'Build Application'
# Job timeout (default: 60 minutes)
timeoutInMinutes: 30
# Job cancellation timeout
cancelTimeoutInMinutes: 5
# Pool for this job
pool:
vmImage: 'ubuntu-22.04'
# Job dependencies
dependsOn: []
# Job condition
condition: succeeded()
# Continue on error
continueOnError: false
# Job variables
variables:
jobVar: 'value'
# Job strategy (matrix, parallel)
strategy:
matrix:
linux:
imageName: 'ubuntu-22.04'
mac:
imageName: 'macOS-12'
windows:
imageName: 'windows-2022'
steps:
- script: npm run buildDeployment jobs are special jobs for deploying to environments with deployment history and approvals.
jobs:
- deployment: DeployWeb
displayName: 'Deploy Web App'
# Target environment
environment:
name: production
resourceName: web-app
resourceType: Kubernetes
# Deployment strategy
strategy:
runOnce:
preDeploy:
steps:
- script: echo "Pre-deploy"
deploy:
steps:
- script: echo "Deploying"
routeTraffic:
steps:
- script: echo "Routing traffic"
postRouteTraffic:
steps:
- script: echo "Post routing"
on:
failure:
steps:
- script: echo "Deployment failed"
success:
steps:
- script: echo "Deployment succeeded"strategy:
runOnce:
deploy:
steps:
- script: echo "Deploying"strategy:
rolling:
maxParallel: 2
preDeploy:
steps:
- script: echo "Pre-deploy"
deploy:
steps:
- script: echo "Deploy"
postDeploy:
steps:
- script: echo "Post-deploy"strategy:
canary:
increments: [10, 20, 50]
preDeploy:
steps:
- script: echo "Pre-deploy"
deploy:
steps:
- script: echo "Deploy $(strategy.canary.increment)%"
postDeploy:
steps:
- script: echo "Post-deploy"Steps are the individual tasks that run in a job.
steps:
- script: echo "Hello World"
displayName: 'Run Script'
workingDirectory: $(Build.SourcesDirectory)
failOnStderr: false
condition: succeeded()
env:
MY_VAR: valuesteps:
- bash: |
echo "Multi-line bash script"
npm install
npm test
displayName: 'Run Bash Script'steps:
- powershell: |
Write-Host "PowerShell script"
Get-ChildItem
displayName: 'Run PowerShell'steps:
- task: TaskName@version
displayName: 'Task Display Name'
inputs:
inputName: value
condition: succeeded()
continueOnError: false
enabled: true
env:
VARIABLE: value
timeoutInMinutes: 0steps:
- checkout: self
clean: true
fetchDepth: 1
lfs: false
submodules: false
persistCredentials: falsesteps:
- download: current
artifact: artifactName
patterns: '**/*.zip'
- download: upstream
artifact: artifactNamesteps:
- publish: $(Build.ArtifactStagingDirectory)
artifact: drop
displayName: 'Publish Artifact'Conditions control when stages, jobs, or steps run.
condition: succeeded() # Previous succeeded (default)
condition: failed() # Previous failed
condition: succeededOrFailed() # Previous completed
condition: always() # Always run
condition: canceled() # Pipeline was canceled# Variable equality
condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
# Contains check
condition: contains(variables['Build.SourceBranch'], 'release')
# And/Or/Not
condition: and(succeeded(), eq(variables['environment'], 'prod'))
condition: or(eq(variables['Build.Reason'], 'PullRequest'), eq(variables['Build.Reason'], 'Manual'))
condition: not(eq(variables['Skip'], 'true'))
# StartsWith/EndsWith
condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/feature/')
condition: endsWith(variables['artifactName'], '.zip')# Build variables
$(Build.BuildId)
$(Build.BuildNumber)
$(Build.SourceBranch)
$(Build.SourceVersion)
$(Build.Reason)
$(Build.ArtifactStagingDirectory)
$(Build.SourcesDirectory)
# Agent variables
$(Agent.OS)
$(Agent.MachineName)
$(Agent.WorkFolder)
# System variables
$(System.TeamProject)
$(System.StageName)
$(System.JobName)
$(System.HostType)
# Pipeline variables
$(Pipeline.Workspace)# Macro syntax (processed at queue time)
$(variableName)
# Template expression syntax (processed at compile time)
${{ variables.variableName }}
# Runtime expression syntax (processed at runtime)
$[variables.variableName]# In the same stage
dependencies.jobName.outputs['stepName.variableName']
# Across stages
stageDependencies.stageName.jobName.outputs['stepName.variableName']# Include template
- template: path/to/template.yml
parameters:
paramName: value
# Extends template
extends:
template: path/to/template.yml
parameters:
paramName: value# In template file
parameters:
- name: paramName
type: string
default: defaultValue
- name: paramList
type: object
default: []
# Use parameters
steps:
- script: echo ${{ parameters.paramName }}# Iterate over parameters
parameters:
- name: environments
type: object
default:
- dev
- staging
- prod
stages:
- ${{ each env in parameters.environments }}:
- stage: Deploy_${{ env }}
jobs:
- job: DeployTo${{ env }}
steps:
- script: echo "Deploying to ${{ env }}"Run jobs in Docker containers.
resources:
containers:
- container: node
image: node:20-alpine
jobs:
- job: BuildInContainer
container: node
steps:
- script: npm install
- script: npm testRun sidecar containers alongside your job.
resources:
containers:
- container: postgres
image: postgres:15
env:
POSTGRES_PASSWORD: password
ports:
- 5432:5432
jobs:
- job: Test
services:
postgres: postgres
steps:
- script: npm test
env:
DATABASE_URL: postgres://postgres:password@postgres:5432/testRun the same job with different variable combinations.
strategy:
matrix:
linux_node18:
imageName: 'ubuntu-22.04'
nodeVersion: '18'
linux_node20:
imageName: 'ubuntu-22.04'
nodeVersion: '20'
mac_node18:
imageName: 'macOS-12'
nodeVersion: '18'
maxParallel: 3
pool:
vmImage: $(imageName)
steps:
- task: NodeTool@0
inputs:
versionSpec: $(nodeVersion)
- script: npm testEnvironments provide deployment history, approvals, and checks.
jobs:
- deployment: DeployProd
environment:
name: production
resourceName: web-app
strategy:
runOnce:
deploy:
steps:
- script: echo "Deploying"vmImage and task versions