Syntaxe des workflows
Table des matières
- Structure d'un workflow
- Clés principales
- Expressions et contextes
- Conditions
- Variables d'environnement
- Exercices pratiques
1 - Structure d'un workflow
Anatomie complète
# .github/workflows/example.yml
# Nom du workflow (affiché dans l'UI)
name: CI Pipeline
# Événements déclencheurs
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
# Variables d'environnement globales
env:
NODE_VERSION: '18'
# Définition des jobs
jobs:
build:
name: Build Application
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build
run: npm run build
Indentation YAML
# CORRECT - 2 espaces
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Step 1
run: echo "Hello"
# INCORRECT - tabs ou indentation incohérente
jobs:
build: # Tab au lieu d'espaces
runs-on: ubuntu-latest
Important
YAML est sensible à l'indentation. Utilisez 2 espaces, jamais de tabs.
🔝 Retour à la table des matières
2 - Clés principales
name
# Nom du workflow
name: My Awesome CI
# Nom du job
jobs:
test:
name: Run Tests
steps:
# Nom du step
- name: Install dependencies
run: npm install
on (triggers)
# Syntaxe simple
on: push
# Syntaxe liste
on: [push, pull_request]
# Syntaxe détaillée
on:
push:
branches:
- main
- 'release/**'
paths:
- 'src/**'
- '!src/**/*.md'
tags:
- 'v*'
pull_request:
types: [opened, synchronize, reopened]
schedule:
- cron: '0 0 * * *' # Tous les jours à minuit
workflow_dispatch: # Exécution manuelle
inputs:
environment:
description: 'Deployment environment'
required: true
default: 'staging'
jobs
jobs:
# Job 1
build:
runs-on: ubuntu-latest
steps:
- run: npm run build
# Job 2 - dépend du job 1
test:
needs: build
runs-on: ubuntu-latest
steps:
- run: npm test
# Job 3 - dépend des jobs 1 et 2
deploy:
needs: [build, test]
runs-on: ubuntu-latest
steps:
- run: ./deploy.sh
runs-on
jobs:
linux:
runs-on: ubuntu-latest # ou ubuntu-22.04
windows:
runs-on: windows-latest # ou windows-2022
macos:
runs-on: macos-latest # ou macos-13
self-hosted:
runs-on: self-hosted # Votre propre runner
labeled:
runs-on: [self-hosted, linux, x64] # Labels multiples
steps
steps:
# Utiliser une action
- uses: actions/checkout@v4
# Avec paramètres
- uses: actions/setup-node@v4
with:
node-version: '18'
# Commande shell
- run: npm install
# Commande multi-lignes
- run: |
npm install
npm run build
npm test
# Avec nom et ID
- name: Run tests
id: test-step
run: npm test
# Avec shell spécifique
- name: PowerShell script
shell: pwsh
run: Write-Host "Hello from PowerShell"
🔝 Retour à la table des matières
3 - Expressions et contextes
Syntaxe des expressions
# Expression simple
${{ expression }}
# Dans run (interpolation)
- run: echo "Branch is ${{ github.ref }}"
# Dans une condition
- if: ${{ github.event_name == 'push' }}
Contextes disponibles
| Contexte | Description |
|---|---|
github | Informations sur le workflow |
env | Variables d'environnement |
vars | Variables repository/org |
secrets | Secrets |
job | Informations sur le job courant |
steps | Outputs des steps précédents |
runner | Informations sur le runner |
inputs | Inputs du workflow |
matrix | Valeurs de la matrice |
Contexte github
- run: |
echo "Event: ${{ github.event_name }}"
echo "Ref: ${{ github.ref }}"
echo "SHA: ${{ github.sha }}"
echo "Actor: ${{ github.actor }}"
echo "Repository: ${{ github.repository }}"
echo "Run ID: ${{ github.run_id }}"
echo "Run Number: ${{ github.run_number }}"
Outputs entre steps
steps:
- name: Set output
id: step1
run: echo "version=1.0.0" >> $GITHUB_OUTPUT
- name: Use output
run: echo "Version is ${{ steps.step1.outputs.version }}"
Fonctions
# Fonctions courantes
${{ contains(github.event.head_commit.message, '[skip ci]') }}
${{ startsWith(github.ref, 'refs/tags/') }}
${{ endsWith(github.repository, '-test') }}
${{ format('Hello {0}!', github.actor) }}
${{ join(matrix.os, ', ') }}
${{ toJSON(github) }}
${{ fromJSON(needs.job1.outputs.matrix) }}
🔝 Retour à la table des matières
4 - Conditions
Syntaxe if
jobs:
deploy:
# Condition sur le job
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- run: echo "Deploying..."
notify:
runs-on: ubuntu-latest
steps:
# Condition sur le step
- name: Notify on failure
if: failure()
run: echo "Something failed!"
Fonctions de statut
| Fonction | Description |
|---|---|
success() | Job/step précédent réussi |
failure() | Job/step précédent échoué |
cancelled() | Workflow annulé |
always() | Toujours exécuter |
steps:
- name: Build
run: npm run build
- name: Cleanup on failure
if: failure()
run: ./cleanup.sh
- name: Always notify
if: always()
run: ./notify.sh
Conditions avancées
# ET logique
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
# OU logique
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
# Négation
if: "!contains(github.event.head_commit.message, '[skip ci]')"
# Opérateur ternaire (via expression)
env:
DEPLOY_ENV: ${{ github.ref == 'refs/heads/main' && 'production' || 'staging' }}
🔝 Retour à la table des matières
5 - Variables d'environnement
Niveaux de définition
# Niveau workflow
env:
CI: true
NODE_VERSION: '18'
jobs:
build:
# Niveau job
env:
BUILD_TYPE: release
runs-on: ubuntu-latest
steps:
# Niveau step
- name: Build
env:
DEBUG: '1'
run: |
echo "CI=$CI"
echo "NODE_VERSION=$NODE_VERSION"
echo "BUILD_TYPE=$BUILD_TYPE"
echo "DEBUG=$DEBUG"
Variables dynamiques
steps:
- name: Set env dynamically
run: echo "BUILD_DATE=$(date +%Y%m%d)" >> $GITHUB_ENV
- name: Use env
run: echo "Build date is $BUILD_DATE"
Variables prédéfinies
| Variable | Description |
|---|---|
GITHUB_REPOSITORY | owner/repo |
GITHUB_SHA | Commit SHA |
GITHUB_REF | Ref complète |
GITHUB_WORKSPACE | Répertoire de travail |
GITHUB_TOKEN | Token d'authentification |
RUNNER_OS | Linux, Windows, macOS |
- run: |
echo "Repo: $GITHUB_REPOSITORY"
echo "SHA: $GITHUB_SHA"
echo "Workspace: $GITHUB_WORKSPACE"
🔝 Retour à la table des matières
6 - Exercices pratiques
Exercice 1 : Workflow conditionnel
Créez un workflow qui déploie seulement sur la branche main :
Solution
name: Deploy
on:
push:
branches: [main, develop]
jobs:
deploy:
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- run: echo "Deploying to production..."
Exercice 2 : Outputs entre steps
Créez un workflow qui passe une version entre deux steps :
Solution
name: Version
on: push
jobs:
version:
runs-on: ubuntu-latest
steps:
- name: Generate version
id: version
run: echo "version=$(date +%Y.%m.%d)" >> $GITHUB_OUTPUT
- name: Use version
run: echo "Version is ${{ steps.version.outputs.version }}"
Quiz
Q1. Comment définir une variable d'environnement dynamique ?
Réponse
echo "VAR_NAME=value" >> $GITHUB_ENV
Q2. Quelle condition exécute un step même si le job échoue ?
Réponse
if: always()
🔝 Retour à la table des matières
Points clés à retenir
- YAML avec 2 espaces d'indentation
${{ expression }}pour les expressions- Contextes :
github,env,steps,secrets - Conditions avec
if:et fonctionssuccess(),failure(),always() - Variables d'env à 3 niveaux : workflow, job, step
$GITHUB_ENVpour les variables dynamiques$GITHUB_OUTPUTpour les outputs de steps
🔝 Retour à la table des matières
← Chapitre précédent | Chapitre suivant : Événements et triggers →