DevOpsFacile
AccueilParcours de formationCertificationsModulesCheat SheetÀ Propos
DevOpsFacile

Une plateforme d'apprentissage complète pour maîtriser les pratiques DevOps modernes, du débutant à l'expert.

contact@devopsfacile.fr

Formation

  • Parcours de formation
  • Modules

Informations

  • À Propos
  • Conditions d'utilisation
  • Confidentialité
  • Mentions légales

© 2026 DevOps Facile. Tous droits réservés.

Fait avec pour la communauté DevOps

ModulesGitHub Actions : multi-jobs, artefacts et workflows réutilisables

Module

Pipelines multi-jobs, artefacts, cache, exécution conditionnelle et workflows réutilisables.

  • 1h30
  • Intermédiaire
  • 6 exercices
Voir les exercices

Formation 100 % Linux

Tous les modules nécessitent un environnement Linux. Si vous êtes sur Windows, installez d'abord WSL (Windows Subsystem for Linux) avant de continuer.

GitHub Actions : multi-jobs, artefacts et workflows réutilisables


🎯 Objectifs

À la fin de ce module, vous serez capable de :

  • ✅ Créer des pipelines multi-jobs avec dépendances
  • ✅ Partager des fichiers entre jobs avec les artefacts
  • ✅ Accélérer les pipelines avec le cache
  • ✅ Contrôler l'exécution avec des conditions (if:)
  • ✅ Créer et utiliser des workflows réutilisables
  • ✅ Déclencher des workflows manuellement avec des inputs

📋 Prérequis

RequisNiveau
GitHub Actions (workflow basique)Complété (module débutant)
Git (branches, PR)Intermédiaire
Docker (bases)Débutant

🔗 Pipelines Multi-Jobs

Un workflow réaliste contient plusieurs jobs qui s'exécutent en parallèle ou séquentiellement.

Jobs en parallèle

Par défaut, les jobs s'exécutent en parallèle :

yaml
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm run lint

  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm test

lint et test démarrent en même temps → pipeline plus rapide.

Jobs séquentiels avec needs

Utilisez needs: pour créer des dépendances entre jobs :

yaml
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm test

  build:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm run build

  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - run: echo "Déploiement..."

Flux d'exécution

test → build → deploy
Mot-cléComportement
needs: testAttend que test réussisse
needs: [lint, test]Attend que les deux réussissent
Pas de needsS'exécute immédiatement (parallèle)

💡 Si un job échoue, tous les jobs qui en dépendent sont annulés automatiquement.


📦 Artefacts

Les artefacts permettent de partager des fichiers entre jobs. Chaque job s'exécute sur un runner différent, donc sans artefacts ils ne partagent rien.

Upload un artefact

yaml
build:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4
    - run: npm ci
    - run: npm run build
    - uses: actions/upload-artifact@v4
      with:
        name: app-build
        path: dist/
        retention-days: 7

Download un artefact

yaml
deploy:
  needs: build
  runs-on: ubuntu-latest
  steps:
    - uses: actions/download-artifact@v4
      with:
        name: app-build
        path: dist/
    - run: ls -la dist/

Cas d'usage courants

UsageUpload dansDownload dans
Build une fois, déployer partoutJob buildJobs deploy-staging, deploy-prod
Rapports de testsJob testConsultable dans l'onglet Actions
Couverture de codeJob testJob coverage-report

💡 retention-days contrôle combien de temps l'artefact est conservé (défaut : 90 jours).


⚡ Cache

Le cache réutilise des fichiers entre exécutions du même workflow pour accélérer les builds.

Cache vs Artefacts

AspectCacheArtefacts
ButAccélérer les jobsPasser des fichiers entre jobs
PersistanceEntre exécutions du workflowDans la même exécution
FiabilitéBest-effort (peut être manquant)Garanti
Usage typiquenode_modules/, ~/.npmdist/, rapports

Mettre en cache les dépendances npm

yaml
- uses: actions/cache@v4
  with:
    path: ~/.npm
    key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-npm-
ParamètreRôle
pathDossier à mettre en cache
keyIdentifiant unique (change quand le lock file change)
restore-keysClés de fallback si la clé exacte n'existe pas

Cache intégré aux actions setup

Les actions setup-* proposent un cache intégré plus simple :

yaml
- uses: actions/setup-node@v4
  with:
    node-version: '20'
    cache: 'npm'

💡 Préférez le cache intégré des actions setup-* quand il est disponible - moins de configuration.


🎯 Exécution Conditionnelle (if:)

Contrôlez quels jobs ou steps s'exécutent selon le contexte.

Condition sur un job

yaml
jobs:
  deploy:
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - run: echo "Déploiement uniquement sur main"

Condition sur un step

yaml
steps:
  - run: npm test
  - name: Upload coverage
    if: success()
    run: echo "Tests réussis, upload de la couverture"
  - name: Notify failure
    if: failure()
    run: echo "Les tests ont échoué !"

Conditions courantes

ExpressionQuand
github.ref == 'refs/heads/main'Push sur main
github.event_name == 'pull_request'Déclenché par une PR
success()Le step précédent a réussi
failure()Un step précédent a échoué
always()Toujours (même si un step a échoué)
contains(github.event.head_commit.message, '[skip ci]')Le message de commit contient [skip ci]

💡 if: always() est utile pour les steps de nettoyage qui doivent s'exécuter quoi qu'il arrive.


🔄 Workflows Réutilisables

Les workflows réutilisables évitent la duplication entre projets. Un workflow appelle un autre workflow.

Créer un workflow réutilisable (appelé)

yaml
# .github/workflows/reusable-test.yml
name: Tests réutilisables

on:
  workflow_call:
    inputs:
      node-version:
        description: 'Version de Node.js'
        required: false
        default: '20'
        type: string
    secrets:
      npm-token:
        required: false

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ inputs.node-version }}
          cache: 'npm'
      - run: npm ci
      - run: npm test

Appeler un workflow réutilisable (appelant)

yaml
# .github/workflows/ci.yml
name: CI

on:
  push:
    branches: [main]

jobs:
  tests:
    uses: ./.github/workflows/reusable-test.yml
    with:
      node-version: '20'
    secrets:
      npm-token: ${{ secrets.NPM_TOKEN }}
Mot-cléRôle
workflow_callDéclare que le workflow est appelable
inputsParamètres passés par l'appelant
secretsSecrets transmis explicitement
uses: ./.github/workflows/...Appelle un workflow du même dépôt

💡 Vous pouvez aussi appeler des workflows d'autres dépôts : uses: org/repo/.github/workflows/test.yml@main.


🖱️ Workflow Dispatch (déclenchement manuel)

Déclenchez un workflow manuellement depuis l'interface GitHub avec des paramètres.

yaml
name: Deploy

on:
  workflow_dispatch:
    inputs:
      environment:
        description: 'Environnement cible'
        required: true
        type: choice
        options:
          - staging
          - production
      version:
        description: 'Version à déployer'
        required: true
        type: string

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - run: echo "Déploiement de ${{ inputs.version }} sur ${{ inputs.environment }}"

Types d'inputs disponibles

TypeRendu dans l'interface
stringChamp texte libre
choiceMenu déroulant
booleanCase à cocher
environmentSélecteur d'environnement GitHub

💡 workflow_dispatch est parfait pour les déploiements manuels ou les tâches ponctuelles.


🚦 Groupes de Concurrence

Évitez les exécutions redondantes quand plusieurs pushs arrivent rapidement.

yaml
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
ParamètreRôle
groupIdentifiant du groupe (même groupe = même file)
cancel-in-progress: trueAnnule l'exécution en cours si une nouvelle arrive

Exemple : vous poussez 3 commits en 2 minutes. Sans concurrence, 3 pipelines s'exécutent. Avec concurrence, seul le dernier s'exécute.

💡 Placez concurrency au niveau du workflow (global) ou au niveau d'un job spécifique.


🔧 Pipeline Complet Intermédiaire

Voici un pipeline combinant toutes les notions de ce module :

yaml
name: CI/CD

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'
      - run: npm ci
      - run: npm run lint

  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'
      - run: npm ci
      - run: npm test

  build:
    needs: [lint, test]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'
      - run: npm ci
      - run: npm run build
      - uses: actions/upload-artifact@v4
        with:
          name: app-build
          path: dist/

  deploy:
    needs: build
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/download-artifact@v4
        with:
          name: app-build
          path: dist/
      - run: echo "Déploiement de dist/ en production..."

Flux d'exécution

lint ─┐
      ├→ build → deploy (seulement sur main)
test ─┘

❌ Erreurs Courantes

ErreurCauseSolution
Artifact not foundNom d'artefact différent entre upload et downloadVérifiez que name est identique
Cache not foundClé de cache qui ne match pasVérifiez le hashFiles()
Job ignoré sans raisonCondition if: trop restrictiveTestez avec if: always() temporairement
Workflow not foundMauvais chemin pour uses:Vérifiez le chemin relatif du workflow
Boucle infinieWorkflow réutilisable qui s'appelle lui-mêmeUtilisez des événements différents

📌 Points Clés

  1. needs: crée des dépendances entre jobs (séquentiel)
  2. Les artefacts partagent des fichiers entre jobs d'une même exécution
  3. Le cache accélère les builds en réutilisant des fichiers entre exécutions
  4. if: contrôle l'exécution des jobs et steps selon le contexte
  5. Les workflows réutilisables (workflow_call) évitent la duplication
  6. concurrency annule les exécutions redondantes

📚 Ressources

  • Utiliser des jobs dans un workflow
  • Artefacts de workflow
  • Cache des dépendances
  • Workflows réutilisables

🚀 Prochaines étapes

Vous maîtrisez les pipelines multi-jobs et les workflows réutilisables. Allez plus loin :

  1. GitHub Actions avancé : secrets, matrices et déploiement - Secrets, matrices, environnements et stratégies de déploiement

Exercices Pratiques

6 exercices pour mettre en pratique

01

01 - Créer un pipeline multi-jobs avec needs

20 minutesIntermédiaire
02

02 - Partager des fichiers avec les artefacts

20 minutesIntermédiaire
03

03 - Accélérer le pipeline avec le cache

20 minutesIntermédiaire
04

04 - Contrôler l'exécution avec les conditions if:

20 minutesIntermédiaire
05

05 - Créer un workflow réutilisable avec workflow_call

25 minutesIntermédiaire
06

07 - Projet Capstone : Pipeline multi-jobs avec artefacts, cache et workflow réutilisable

45 minutesAvancé
Retour aux modules

Sur cette page

  • 🎯 Objectifs
  • 📋 Prérequis
  • 🔗 Pipelines Multi-Jobs
  • Jobs en parallèle
  • Jobs séquentiels avec needs
  • Flux d'exécution
  • 📦 Artefacts
  • Upload un artefact
  • Download un artefact
  • Cas d'usage courants
  • ⚡ Cache
  • Cache vs Artefacts
  • Mettre en cache les dépendances npm
  • Cache intégré aux actions setup
  • 🎯 Exécution Conditionnelle (if:)
  • Condition sur un job
  • Condition sur un step
  • Conditions courantes
  • 🔄 Workflows Réutilisables
  • Créer un workflow réutilisable (appelé)
  • Appeler un workflow réutilisable (appelant)
  • 🖱️ Workflow Dispatch (déclenchement manuel)
  • Types d'inputs disponibles
  • 🚦 Groupes de Concurrence
  • 🔧 Pipeline Complet Intermédiaire
  • Flux d'exécution
  • ❌ Erreurs Courantes
  • 📌 Points Clés
  • 📚 Ressources
  • 🚀 Prochaines étapes