
Un collègue a poussé du code et le pipeline est tout rouge. Trois jobs échouent, chacun pour une raison différente. Personne ne comprend pourquoi, et le réflexe est de relancer le pipeline « au cas où ». Spoiler : relancer ne corrige rien. Dans ce lab, vous allez apprendre à lire les logs d'un pipeline GitLab pour identifier précisément ce qui casse, puis corriger chaque erreur.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Lire les logs d'un job GitLab CI/CD pour identifier l'erreur exacte
- Distinguer les types d'erreurs : lint (code), runtime (import manquant), configuration CI (stage invalide)
- Corriger un pipeline cassé en modifiant le code et la configuration CI
- Comprendre les exit codes et leur impact sur le statut d'un job
Dans quel contexte ?
Section intitulée « Dans quel contexte ? »En entreprise, le pipeline rouge est le quotidien. Un collègue pousse du code sans tester localement, une dépendance disparaît, un copier-coller introduit une typo dans le .gitlab-ci.yml. Si vous ne savez pas lire les logs, vous perdez du temps à deviner, relancer, et deviner encore.
Situations réelles où ce lab vous aide :
- Un développeur junior a poussé du code qui casse le lint et ne comprend pas le message de ruff
- Une dépendance a été retirée de
requirements.txtpar erreur lors d'un merge - Un job échoue avec un message
unknown stageaprès un renommage - L'équipe relance les pipelines « au cas où » au lieu de lire les logs
Prérequis
Section intitulée « Prérequis »- Lab 01 complété — ou partir directement de la branche
starter/lab-02 - Savoir naviguer dans l'interface GitLab (Build > Pipelines > cliquer sur un job)
- Avoir lu Debug : lire les logs d'un pipeline (conseillé)
Point de départ
Section intitulée « Point de départ »Si c'est votre premier lab, lisez d'abord la section Comment ça marche pour savoir comment forker et cloner le dépôt Pipeline Craft.
-
Passez sur la branche de départ de ce lab
Fenêtre de terminal cd pipeline-craftgit checkout starter/lab-02Cette branche contient le
.gitlab-ci.ymldu Lab 01 — mais aussi 3 bugs que vous allez devoir trouver en lisant les logs du pipeline. -
Poussez la branche pour déclencher le pipeline sur votre fork
Fenêtre de terminal git push origin starter/lab-02 -
Observez le résultat dans Build > Pipelines sur votre fork GitLab
Le pipeline démarre et… échoue. Vous voyez du rouge — c'est normal, c'est le but de ce lab.
Le problème
Section intitulée « Le problème »Le pipeline contient un .gitlab-ci.yml fonctionnel (celui du Lab 01), mais 3 erreurs ont été introduites. Chaque erreur affecte un aspect différent du pipeline :
| Bug | Quel job est touché | Type d'erreur |
|---|---|---|
| 🔴 Bug 1 | ruff-lint | Erreur de code (lint) |
| 🔴 Bug 2 | ruff-lint | Erreur de code (lint) |
| 🔴 Bug 3 | pytest | Configuration CI invalide (stage) |
Votre mission : identifier et corriger les 3 erreurs en lisant les logs.
L'exercice
Section intitulée « L'exercice »Étape 1 — Observez le pipeline cassé
Section intitulée « Étape 1 — Observez le pipeline cassé »-
Passez sur la branche de départ de ce lab
Fenêtre de terminal cd pipeline-craftgit checkout starter/lab-02Cette branche contient le
.gitlab-ci.ymldu Lab 01 — mais aussi 3 bugs que vous allez devoir diagnostiquer en lisant les logs du pipeline. -
Poussez la branche pour déclencher le pipeline sur votre fork
Fenêtre de terminal git push origin starter/lab-02 -
Observez le résultat dans Build > Pipelines sur votre fork GitLab
Le pipeline démarre et affiche du rouge — c'est normal, c'est le but de ce lab. Prenez le temps d'explorer les logs avant de proposer des corrections.
Étape 2 — Diagnostiquez les 3 bugs
Section intitulée « Étape 2 — Diagnostiquez les 3 bugs »Le pipeline contient des erreurs de trois types différents :
| Bug | Quel job | Type d'erreur | À chercher dans les logs |
|---|---|---|---|
| 🔴 Bug 1 | ruff-lint | Erreur de code (lint) | F401 — import inutilisé |
| 🔴 Bug 2 | ruff-lint | Erreur de code (lint) | F401 — import inutilisé |
| 🔴 Bug 3 | pytest | Config CI invalide | unknown stage ou stage manquant |
À vous :
- Cliquez sur chaque job échoué pour lire ses logs
- Cherchez les erreurs correspondant à la table ci-dessus
- Notez le chemin du fichier et la ligne du problème (ex:
app/main.py:3) - Pas encore de corrections — juste l'identification des bugs
Étape 3 — À vous de proposer les corrections
Section intitulée « Étape 3 — À vous de proposer les corrections »Maintenant que vous avez identifié les 3 bugs, à vous de proposer les corrections. Vous devez modifier 3 fichiers :
app/main.py— Enlever une ligne problématiqueapp/routes/health.py— Enlever une ligne problématique.gitlab-ci.yml— Corriger une typo
Indices :
- Pour les bugs 1 et 2 : ruff dit "imported but unused". La solution est logique : supprimez l'import inutilisé.
- Pour le bug 3 : le message d'erreur dans GitLab CI dit que le stage n'existe pas. Cherchez la typo dans le
.gitlab-ci.yml(différence de 1 lettre).
Effectuez les corrections sur base de vos diagnostics. Quand vous pensez avoir trouvé les 3 solutions, vérifiez ci-dessous :
👉 Vérifier vos solutions
Bug 1 — Import os inutilisé dans app/main.py
Section intitulée « Bug 1 — Import os inutilisé dans app/main.py »Ruff signale app/main.py:3:8: F401 [*] \os` imported but unused`.
Ouvrez app/main.py et supprimez la ligne import os :
"""Pipeline Craft — API FastAPI fil rouge pour les labs GitLab CI/CD."""
from fastapi import FastAPI
from app.config import settingsfrom app.routes import health, items, versionBug 2 — Import httpx inutilisé dans app/routes/health.py
Section intitulée « Bug 2 — Import httpx inutilisé dans app/routes/health.py »Ruff signale app/routes/health.py:4:8: F401 [*] \httpx` imported but unused`.
Ouvrez app/routes/health.py et supprimez la ligne import httpx :
"""Endpoint de health check."""
from fastapi import APIRouter
from app.models import HealthResponsePourquoi c'est grave : httpx est uniquement dans requirements-dev.txt (dépendances de dev), pas dans requirements.txt (production). Si ce code restait, le docker build échouerait en production avec ModuleNotFoundError.
Bug 3 — Stage invalide dans .gitlab-ci.yml
Section intitulée « Bug 3 — Stage invalide dans .gitlab-ci.yml »GitLab refuse de créer le job pytest. En regardant le .gitlab-ci.yml, vous trouvez :
stages: - lint - test # ← défini comme "test" - build
pytest: stage: tests # ← référence "tests" (avec un S) → n'existe pas !Corrigez la typo :
pytest: stage: test # ← maintenant "test" (sans S) image: python:3.12-slim before_script: - pip install -r requirements-dev.txt script: - pytest -vPourquoi c'est différent : GitLab valide le YAML avant de lancer les jobs. Si un stage n'existe pas, aucun job ne peut l'utiliser — c'est une erreur de configuration, pas une erreur d'exécution.
Étape 4 — Vérifiez et poussez
Section intitulée « Étape 4 — Vérifiez et poussez »-
Vérifiez localement que le lint passe
Fenêtre de terminal ruff check app/ tests/Sortie attendue :
All checks passed! -
Committez et poussez
Fenêtre de terminal git add app/main.py app/routes/health.py .gitlab-ci.ymlgit commit -m "fix: remove unused imports, fix stage name typo"git push origin starter/lab-02 -
Vérifiez le pipeline dans GitLab
Un nouveau pipeline se déclenche automatiquement. Cette fois, les 3 jobs doivent passer au vert.
Vérification
Section intitulée « Vérification »- Les 3 erreurs identifiées uniquement via les logs (pas en parcourant le code au hasard)
-
ruff checkpasse localement sans erreur - Le pipeline GitLab affiche 3 jobs verts après le fix
- Vous savez expliquer la différence entre F401 (import inutilisé), un stage inconnu et un import de dépendance absente
Comment lire les logs efficacement
Section intitulée « Comment lire les logs efficacement »Quand un job échoue, les logs GitLab peuvent faire plusieurs centaines de lignes. Voici comment les lire sans se perdre :
- Allez directement à la fin — l'erreur fatale est presque toujours dans les dernières lignes
- Cherchez le code de sortie —
exit code 1signifie « erreur dans le script »,exit code 127signifie « commande introuvable » - Repérez les sections — GitLab structure les logs en sections pliables (
before_script,script,after_script). L'erreur est dans la section rouge - Lisez le message complet — ne vous arrêtez pas à la première ligne d'erreur. Souvent, l'explication vient juste en dessous (ruff donne le numéro de ligne, pytest affiche la trace complète)
| Exit code | Signification |
|---|---|
0 | Succès — le job est vert |
1 | Erreur dans le script (test échoué, lint en erreur, build cassé) |
127 | Commande introuvable (outil non installé) |
137 | Killed — le job a dépassé la limite mémoire (OOM) |
Pièges fréquents
Section intitulée « Pièges fréquents »| Symptôme | Cause | Solution |
|---|---|---|
| « Relancer résoudra le problème » | Faux — si le code est cassé, relancer ne change rien | Lire les logs d'abord, corriger, puis pousser |
| Le pipeline échoue avant même de lancer un job | Erreur de syntaxe YAML ou stage inexistant | Vérifier le YAML dans Build > Pipeline editor |
Ruff signale F401 mais ça ne casse pas pytest | Le lint et les tests sont indépendants — une erreur de lint n'empêche pas les tests de tourner | Corriger les deux : un code propre passe tous les jobs |
ModuleNotFoundError dans le build Docker | Un import Python référence un paquet absent de requirements.txt | Soit ajouter le paquet dans requirements.txt, soit supprimer l'import inutile |
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Validez votre YAML localement avec la CLI
glab:glab ci lint .gitlab-ci.ymlvérifie la syntaxe et les stages sans pousser. Voir Valider un .gitlab-ci.yml. - Explorez
allow_failure: true: ajoutez cette clé à un job pour que le pipeline continue même si le job échoue (le job apparaît en orange). Utile pour les vérifications non bloquantes. - Comparez avec
solution/lab-02:git diff origin/starter/lab-02..origin/solution/lab-02montre exactement les 3 corrections attendues.
À retenir
Section intitulée « À retenir »- Lisez les logs, ne devinez pas — l'erreur exacte est toujours dans la sortie du job
- Un import inutilisé (F401) n'est pas juste du bruit : il peut masquer une dépendance fantôme qui cassera en production
- Un stage mal nommé empêche GitLab de créer le job — vérifiez que les noms dans
stage:correspondent exactement à ceux destages: - La commande
glab ci lintpermet de détecter les erreurs de configuration CI avant de pousser - Ne relancez jamais un pipeline sans avoir d'abord lu les logs du précédent échec