Exercice 04 : Créer un pipeline DAG avec needs
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Utiliser
needs:pour créer des dépendances directes entre jobs sans attendre tout un stage - ✅ Réduire la durée totale du pipeline grâce au DAG (Directed Acyclic Graph)
- ✅ Transmettre des artefacts entre jobs liés via
needs: artifacts: true - ✅ Visualiser le graphe de dépendances dans GitLab CI/CD → Pipelines
Durée estimée : 20 minutes
Difficulté : ⭐⭐⭐☆☆ (Intermédiaire)
Prérequis :
- Module GitLab CI Intermédiaire - Exercice 03 complété
- Compréhension des stages et artefacts GitLab CI
📖 Contexte
Sans needs:, tous les jobs d'un stage doivent terminer avant que le stage suivant démarre. Avec needs:, un job peut démarrer dès que ses dépendances directes sont terminées, même si d'autres jobs du stage précédent tournent encore. C'est le principe du DAG : chaque job avance au rythme de ses vraies dépendances.
📋 Énoncé
Créez un pipeline avec deux chaînes de builds indépendantes (frontend et backend) qui convergent vers un job de déploiement. Sans needs:, le déploiement attendrait les builds les plus lents. Avec needs:, il démarre dès que les deux builds sont terminés.
🧭 Déroulement de l'exercice
Tâche 1 : Comprendre le problème sans needs
Créez d'abord un pipeline "classique" sans needs: avec 3 stages : build, test, deploy. Dans le stage build, créez deux jobs : build-frontend (sleep 10) et build-backend (sleep 5). Dans le stage test, créez test-frontend (sleep 3) et test-backend (sleep 2).
Indice : Sans
needs:,test-frontendettest-backendattendent quebuild-frontendETbuild-backendsoient terminés. Le stagetestne démarre qu'après 10 secondes (durée du plus lent des builds).
Vérification : Observez dans le pipeline que test-backend attend inutilement build-frontend.
Tâche 2 : Ajouter needs pour les jobs de test
Ajoutez needs: à test-frontend pour qu'il dépende uniquement de build-frontend, et needs: à test-backend pour qu'il dépende uniquement de build-backend.
Indice :
`yamltest-backend:
stage: test
needs:
- build-backend
script:
- sleep 2
`Avec
needs:,test-backendpeut démarrer après 5 secondes (fin debuild-backend), sans attendre les 10 secondes debuild-frontend.
Vérification : Dans le graphe DAG, les flèches montrent les vraies dépendances. test-backend démarre avant build-frontend soit terminé.
Tâche 3 : Transmettre des artefacts via needs
Dans build-frontend, produisez un artefact dist/frontend.js. Dans test-frontend, ajoutez artifacts: true dans la déclaration needs: pour accéder à cet artefact.
Indice :
`yamltest-frontend:
needs:
- job: build-frontend
artifacts: true
script:
- ls dist/ # accès à l'artefact de build-frontend
`Sans
artifacts: true,needs:crée seulement une dépendance d'ordre. Avecartifacts: true, les artefacts du job cible sont également téléchargés.
Vérification : test-frontend liste correctement dist/frontend.js dans ses logs.
Tâche 4 : Créer le job de déploiement convergent
Créez un job deploy qui dépend à la fois de test-frontend ET test-backend. Il doit récupérer les artefacts des deux jobs.
Indice :
`yamldeploy:
stage: deploy
needs:
- job: test-frontend
artifacts: true
- job: test-backend
artifacts: true
`
deploydémarre dès que les deux tests sont terminés, sans attendre d'autres jobs.
Vérification : deploy liste les artefacts des deux chaînes dans ses logs.
Tâche 5 : Visualiser le graphe DAG
Dans GitLab, naviguez vers CI/CD → Pipelines → votre pipeline. Activez la vue "Needs" ou "DAG" (bouton en haut à droite). Comparez la vue "Stage" et la vue "DAG".
Indice : La vue DAG montre le graphe de dépendances réel avec des flèches entre les jobs. La vue Stage montre les colonnes traditionnelles. Sur un pipeline complexe, la différence de durée peut être de 30 à 50%.
Vérification : Le graphe DAG affiche deux chaînes indépendantes qui convergent vers deploy.
🗂️ Mini-Projet : Pipeline DAG frontend + backend
Structure DAG :
build-frontend ──→ test-frontend ──┐
├──→ deploy
build-backend ──→ test-backend ──┘Checkpoints de validation :
test-backenddémarre avant la fin debuild-frontend- Les artefacts de
build-frontendsont accessibles danstest-frontend - Le job
deployrécupère les artefacts des deux chaînes - La vue DAG dans GitLab affiche les flèches de dépendance
- La durée totale du pipeline est réduite par rapport à la version sans
needs: