Aller au contenu principal

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

FonctionDescription
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


← Retour à la table des matières