YAML Pipelines
1 - Structure YAML
1.1 Hiérarchie
1.2 Structure complète
# Nom du pipeline
name: $(Build.DefinitionName)_$(Date:yyyyMMdd)$(Rev:.r)
# Triggers
trigger:
branches:
include:
- main
# Pull Request triggers
pr:
branches:
include:
- main
# Ressources
resources:
repositories:
- repository: templates
type: git
name: MyProject/templates
# Variables
variables:
- name: buildConfiguration
value: Release
# Stages
stages:
- stage: Build
jobs:
- job: BuildJob
pool:
vmImage: 'ubuntu-latest'
steps:
- script: echo Building
2 - Triggers
2.1 CI Triggers
# Trigger sur branches
trigger:
branches:
include:
- main
- releases/*
exclude:
- releases/old/*
paths:
include:
- src/*
exclude:
- docs/*
tags:
include:
- v*
2.2 PR Triggers
pr:
branches:
include:
- main
paths:
exclude:
- README.md
drafts: false
2.3 Scheduled Triggers
schedules:
- cron: '0 0 * * *'
displayName: 'Daily midnight build'
branches:
include:
- main
always: true
3 - Jobs et Steps
3.1 Job simple
jobs:
- job: Build
displayName: 'Build Application'
pool:
vmImage: 'ubuntu-latest'
timeoutInMinutes: 60
variables:
NODE_ENV: production
steps:
- script: npm install
- script: npm run build
3.2 Jobs parallèles
jobs:
- job: Linux
pool:
vmImage: 'ubuntu-latest'
steps:
- script: echo Building on Linux
- job: Windows
pool:
vmImage: 'windows-latest'
steps:
- script: echo Building on Windows
- job: macOS
pool:
vmImage: 'macos-latest'
steps:
- script: echo Building on macOS
3.3 Job dependencies
jobs:
- job: Build
steps:
- script: echo Build
- job: Test
dependsOn: Build
steps:
- script: echo Test
- job: Deploy
dependsOn:
- Build
- Test
condition: succeeded()
steps:
- script: echo Deploy
4 - Conditions
4.1 Conditions de base
steps:
# Toujours exécuter
- script: echo Always runs
condition: always()
# Exécuter si succès
- script: echo On success
condition: succeeded()
# Exécuter si échec
- script: echo On failure
condition: failed()
# Condition sur branche
- script: echo Only on main
condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
# Condition sur variable
- script: echo Production deploy
condition: and(succeeded(), eq(variables['environment'], 'production'))
4.2 Conditions avancées
# Exécuter si tag
condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/')
# Exécuter si PR
condition: eq(variables['Build.Reason'], 'PullRequest')
# Exécuter si scheduled
condition: eq(variables['Build.Reason'], 'Schedule')
# Combinaison
condition: |
and(
succeeded(),
or(
eq(variables['Build.SourceBranch'], 'refs/heads/main'),
startsWith(variables['Build.SourceBranch'], 'refs/tags/v')
)
)
5 - Matrix builds
jobs:
- job: Build
strategy:
matrix:
linux-node16:
imageName: 'ubuntu-latest'
nodeVersion: '16.x'
linux-node18:
imageName: 'ubuntu-latest'
nodeVersion: '18.x'
windows-node18:
imageName: 'windows-latest'
nodeVersion: '18.x'
maxParallel: 3
pool:
vmImage: $(imageName)
steps:
- task: NodeTool@0
inputs:
versionSpec: $(nodeVersion)
- script: npm test
6 - Templates
6.1 Step template
# templates/npm-steps.yml
parameters:
- name: nodeVersion
type: string
default: '18.x'
steps:
- task: NodeTool@0
inputs:
versionSpec: ${{ parameters.nodeVersion }}
- script: npm ci
displayName: 'Install dependencies'
- script: npm run build
displayName: 'Build'
- script: npm test
displayName: 'Test'
# azure-pipelines.yml
steps:
- template: templates/npm-steps.yml
parameters:
nodeVersion: '20.x'
6.2 Job template
# templates/build-job.yml
parameters:
- name: environment
type: string
jobs:
- job: Build_${{ parameters.environment }}
pool:
vmImage: 'ubuntu-latest'
variables:
ENV: ${{ parameters.environment }}
steps:
- script: echo Building for $(ENV)
# azure-pipelines.yml
stages:
- stage: Build
jobs:
- template: templates/build-job.yml
parameters:
environment: 'dev'
- template: templates/build-job.yml
parameters:
environment: 'prod'
6.3 Stage template
# templates/deploy-stage.yml
parameters:
- name: environment
type: string
- name: dependsOn
type: object
default: []
stages:
- stage: Deploy_${{ parameters.environment }}
dependsOn: ${{ parameters.dependsOn }}
jobs:
- deployment: Deploy
environment: ${{ parameters.environment }}
strategy:
runOnce:
deploy:
steps:
- script: echo Deploying to ${{ parameters.environment }}
7 - Expressions et fonctions
7.1 Expressions compile-time
variables:
# Expression évaluée au moment de la compilation
${{ if eq(variables['Build.SourceBranch'], 'refs/heads/main') }}:
environment: 'production'
${{ else }}:
environment: 'development'
7.2 Expressions runtime
steps:
- script: |
echo "Branch: $(Build.SourceBranch)"
echo "Is Main: $[eq(variables['Build.SourceBranch'], 'refs/heads/main')]"
7.3 Fonctions utiles
| Fonction | Description |
|---|---|
eq(a, b) | Égalité |
ne(a, b) | Non égal |
and(a, b) | ET logique |
or(a, b) | OU logique |
not(a) | Négation |
contains(a, b) | Contient |
startsWith(a, b) | Commence par |
format('{0}', a) | Formatage |
coalesce(a, b) | Première valeur non vide |
8 - Outputs et dépendances
8.1 Outputs entre steps
steps:
- script: |
echo "##vso[task.setvariable variable=myVar;isOutput=true]myValue"
name: SetVar
- script: echo $(SetVar.myVar)
8.2 Outputs entre jobs
jobs:
- job: A
steps:
- script: echo "##vso[task.setvariable variable=myVar;isOutput=true]myValue"
name: SetVar
- job: B
dependsOn: A
variables:
varFromA: $[ dependencies.A.outputs['SetVar.myVar'] ]
steps:
- script: echo $(varFromA)
8.3 Outputs entre stages
stages:
- stage: Build
jobs:
- job: BuildJob
steps:
- script: echo "##vso[task.setvariable variable=version;isOutput=true]1.0.0"
name: SetVersion
- stage: Deploy
dependsOn: Build
variables:
appVersion: $[ stageDependencies.Build.BuildJob.outputs['SetVersion.version'] ]
jobs:
- job: DeployJob
steps:
- script: echo Deploying version $(appVersion)
Résumé
Dans ce chapitre, nous avons appris :
- La structure YAML complète
- Les triggers (CI, PR, scheduled)
- Les jobs et leurs dépendances
- Les conditions et expressions
- Les matrix builds
- Les templates réutilisables
- Les outputs entre jobs/stages
Prochaine étape
Dans le prochain chapitre, nous verrons Azure Artifacts.
→ Chapitre suivant : Azure Artifacts