Exercice 02 : Tester sur plusieurs versions avec la stratégie matrix
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Définir
strategy.matrixpour lancer des jobs en parallèle sur plusieurs versions - ✅ Référencer une valeur de la matrice avec
${{ matrix.node-version }} - ✅ Configurer
fail-fast: falsepour ne pas annuler toutes les combinaisons si une échoue - ✅ Utiliser
includeetexcludepour personnaliser les combinaisons de la matrice
Durée estimée : 20 min | Difficulté : ⭐⭐⭐☆☆
📖 Contexte
Quand une bibliothèque ou une application doit fonctionner sur plusieurs versions de Node.js (ou plusieurs OS, ou plusieurs versions d'une dépendance), tester chaque combinaison manuellement est fastidieux. La stratégie matrix de GitHub Actions génère automatiquement un job pour chaque combinaison et les exécute en parallèle.
Avec 3 versions de Node.js et 2 OS, GitHub génère 6 jobs automatiquement - sans dupliquer le YAML.
📋 Énoncé
Vous allez créer un workflow qui teste votre application sur Node.js 18, 20 et 22 en parallèle, puis étendre la matrice pour tester sur Linux et Windows simultanément.
Résultat attendu :
- 3 jobs parallèles nommés
Tests (18),Tests (20),Tests (22) - Si la version 18 échoue, les versions 20 et 22 continuent
- La matrice étendue génère 6 jobs (3 versions × 2 OS)
🧭 Déroulement
Tâche 1 : Créer une matrix sur les versions Node.js
Créez .github/workflows/matrix.yml avec un job test qui utilise strategy.matrix pour définir trois versions de Node.js : 18, 20, et 22.
Indice :
`yamltest:
name: Tests (Node ${{ matrix.node-version }})
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18, 20, 22]
steps:
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
`
Vérification : L'interface Actions affiche 3 jobs parallèles avec des noms distincts.
Tâche 2 : Configurer fail-fast: false
Ajoutez fail-fast: false dans la stratégie. Forcez un échec sur la version 18 (via if: matrix.node-version == 18) et observez que les versions 20 et 22 continuent quand même.
Indice :
`yamlstrategy:
fail-fast: false
matrix:
node-version: [18, 20, 22]
`Par défaut (
fail-fast: true), si un job de la matrice échoue, GitHub annule immédiatement tous les autres. Avecfalse, ils continuent jusqu'à leur terme.
Vérification : Avec fail-fast: false et un job volontairement en échec, les autres jobs continuent et affichent leur résultat.
Tâche 3 : Étendre la matrix avec les OS
Ajoutez os: [ubuntu-latest, windows-latest] dans la matrice et remplacez runs-on: ubuntu-latest par runs-on: ${{ matrix.os }}. Cela génère 6 combinaisons.
Indice :
`yamlstrategy:
matrix:
node-version: [18, 20, 22]
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
`Une matrix à 2 dimensions génère N×M jobs. Ici : 3 × 2 = 6 jobs en parallèle.
Vérification : L'interface affiche 6 jobs avec des noms comme Tests (18, ubuntu-latest) et Tests (18, windows-latest).
Tâche 4 : Exclure une combinaison avec exclude
Excluez la combinaison Node 18 + Windows (trop ancienne pour être supportée sur ce OS) avec exclude:.
Indice :
`yamlmatrix:
node-version: [18, 20, 22]
os: [ubuntu-latest, windows-latest]
exclude:
- node-version: 18
os: windows-latest
`La matrice passe de 6 à 5 combinaisons.
Vérification : L'interface affiche 5 jobs - la combinaison 18 + windows est absente.
Tâche 5 : Ajouter une combinaison avec include
Ajoutez une combinaison spéciale Node 20 + macOS (non présente dans la matrice de base) avec include:.
Indice :
`yamlinclude:
- node-version: 20
os: macos-latest
experimental: true
`
includepeut ajouter des combinaisons entièrement nouvelles ou enrichir des combinaisons existantes avec des propriétés supplémentaires.
Vérification : L'interface affiche un job supplémentaire pour Node 20 + macOS.
🗂️ Mini-Projet : Matrix complète avec include/exclude
# Checkpoints à valider :
# [ ] strategy.matrix définit node-version: [18, 20, 22]
# [ ] ${{ matrix.node-version }} est utilisé dans actions/setup-node
# [ ] fail-fast: false est configuré
# [ ] La matrix à 2D (versions × OS) génère les bons jobs
# [ ] exclude retire la combinaison 18 + windows-latest
# [ ] include ajoute la combinaison 20 + macos-latest
# [ ] Bonus : ajoutez une propriété expérimental via include