
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