Aller au contenu principal

Syntaxe des workflows


Table des matières

  1. Structure d'un workflow
  2. Clés principales
  3. Expressions et contextes
  4. Conditions
  5. Variables d'environnement
  6. 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

ContexteDescription
githubInformations sur le workflow
envVariables d'environnement
varsVariables repository/org
secretsSecrets
jobInformations sur le job courant
stepsOutputs des steps précédents
runnerInformations sur le runner
inputsInputs du workflow
matrixValeurs 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

FonctionDescription
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

VariableDescription
GITHUB_REPOSITORYowner/repo
GITHUB_SHACommit SHA
GITHUB_REFRef complète
GITHUB_WORKSPACERépertoire de travail
GITHUB_TOKENToken d'authentification
RUNNER_OSLinux, 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 fonctions success(), failure(), always()
  • Variables d'env à 3 niveaux : workflow, job, step
  • $GITHUB_ENV pour les variables dynamiques
  • $GITHUB_OUTPUT pour les outputs de steps

🔝 Retour à la table des matières


← Chapitre précédent | Chapitre suivant : Événements et triggers →