Aller au contenu
CI/CD & Automatisation medium

Lab 02 — Lire un échec et le corriger

12 min de lecture

logo gitlab

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.

  • 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

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.txt par erreur lors d'un merge
  • Un job échoue avec un message unknown stage après un renommage
  • L'équipe relance les pipelines « au cas où » au lieu de lire les logs
  • 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é)

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.

  1. Passez sur la branche de départ de ce lab

    Fenêtre de terminal
    cd pipeline-craft
    git checkout starter/lab-02

    Cette branche contient le .gitlab-ci.yml du Lab 01 — mais aussi 3 bugs que vous allez devoir trouver en lisant les logs du pipeline.

  2. Poussez la branche pour déclencher le pipeline sur votre fork

    Fenêtre de terminal
    git push origin starter/lab-02
  3. 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 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 :

BugQuel job est touchéType d'erreur
🔴 Bug 1ruff-lintErreur de code (lint)
🔴 Bug 2ruff-lintErreur de code (lint)
🔴 Bug 3pytestConfiguration CI invalide (stage)

Votre mission : identifier et corriger les 3 erreurs en lisant les logs.

  1. Passez sur la branche de départ de ce lab

    Fenêtre de terminal
    cd pipeline-craft
    git checkout starter/lab-02

    Cette branche contient le .gitlab-ci.yml du Lab 01 — mais aussi 3 bugs que vous allez devoir diagnostiquer en lisant les logs du pipeline.

  2. Poussez la branche pour déclencher le pipeline sur votre fork

    Fenêtre de terminal
    git push origin starter/lab-02
  3. 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.

Le pipeline contient des erreurs de trois types différents :

BugQuel jobType d'erreurÀ chercher dans les logs
🔴 Bug 1ruff-lintErreur de code (lint)F401 — import inutilisé
🔴 Bug 2ruff-lintErreur de code (lint)F401 — import inutilisé
🔴 Bug 3pytestConfig CI invalideunknown 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

Maintenant que vous avez identifié les 3 bugs, à vous de proposer les corrections. Vous devez modifier 3 fichiers :

  1. app/main.py — Enlever une ligne problématique
  2. app/routes/health.py — Enlever une ligne problématique
  3. .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

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 settings
from app.routes import health, items, version

Bug 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 HealthResponse

Pourquoi 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.

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 -v

Pourquoi 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.

  1. Vérifiez localement que le lint passe

    Fenêtre de terminal
    ruff check app/ tests/

    Sortie attendue : All checks passed!

  2. Committez et poussez

    Fenêtre de terminal
    git add app/main.py app/routes/health.py .gitlab-ci.yml
    git commit -m "fix: remove unused imports, fix stage name typo"
    git push origin starter/lab-02
  3. Vérifiez le pipeline dans GitLab

    Un nouveau pipeline se déclenche automatiquement. Cette fois, les 3 jobs doivent passer au vert.

  • Les 3 erreurs identifiées uniquement via les logs (pas en parcourant le code au hasard)
  • ruff check passe 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

Quand un job échoue, les logs GitLab peuvent faire plusieurs centaines de lignes. Voici comment les lire sans se perdre :

  1. Allez directement à la fin — l'erreur fatale est presque toujours dans les dernières lignes
  2. Cherchez le code de sortieexit code 1 signifie « erreur dans le script », exit code 127 signifie « commande introuvable »
  3. Repérez les sections — GitLab structure les logs en sections pliables (before_script, script, after_script). L'erreur est dans la section rouge
  4. 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 codeSignification
0Succès — le job est vert
1Erreur dans le script (test échoué, lint en erreur, build cassé)
127Commande introuvable (outil non installé)
137Killed — le job a dépassé la limite mémoire (OOM)
SymptômeCauseSolution
« Relancer résoudra le problème »Faux — si le code est cassé, relancer ne change rienLire les logs d'abord, corriger, puis pousser
Le pipeline échoue avant même de lancer un jobErreur de syntaxe YAML ou stage inexistantVérifier le YAML dans Build > Pipeline editor
Ruff signale F401 mais ça ne casse pas pytestLe lint et les tests sont indépendants — une erreur de lint n'empêche pas les tests de tournerCorriger les deux : un code propre passe tous les jobs
ModuleNotFoundError dans le build DockerUn import Python référence un paquet absent de requirements.txtSoit ajouter le paquet dans requirements.txt, soit supprimer l'import inutile
  • Validez votre YAML localement avec la CLI glab : glab ci lint .gitlab-ci.yml vé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-02 montre exactement les 3 corrections attendues.
  • 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 de stages:
  • La commande glab ci lint permet 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

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn