Aller au contenu
CI/CD & Automatisation medium

Lab 11 — Débugger un job bloqué

9 min de lecture

logo gitlab

Quand un job est rouge, vous avez des logs. Quand un job reste en pending ou qu'un pipeline apparaît skipped, c'est plus déroutant : parfois il n'y a presque aucun indice visible. Ce lab vous donne une méthode de diagnostic fiable pour ces deux cas fréquents.

  • Diagnostiquer un job bloqué en pending
  • Diagnostiquer un pipeline skipped
  • Lire les indices utiles dans l'interface GitLab
  • Corriger les causes les plus fréquentes

Ce lab vient après Lab 10. Si vous avez déjà une base solide sur rules et workflow, vous pouvez commencer directement sur starter/lab-11.

En environnement réel, ces incidents arrivent souvent juste avant une mise en production. Le stress monte parce que le pipeline n'avance pas, mais personne ne sait pourquoi. Sans méthode claire, l'équipe perd du temps à relancer des pipelines inutiles.

Ce lab vous sert pour :

  • identifier un tag runner mal configuré
  • détecter une règle workflow trop restrictive
  • comprendre pourquoi un job ne démarre jamais alors que le code est correct
  1. Basculez sur la branche du lab

    Fenêtre de terminal
    cd pipeline-craft
    git checkout starter/lab-11
  2. Déclenchez un pipeline

    Fenêtre de terminal
    git push origin starter/lab-11
  3. Ouvrez la vue pipeline

    Vous devriez observer au moins un comportement anormal (pending ou skipped).

Deux symptômes différents demandent deux diagnostics différents.

Un job pending signifie généralement que GitLab n'a trouvé aucun runner compatible (tags, disponibilité, quota). Un pipeline skipped vient souvent des rules ou du workflow qui ne matchent pas la source courante.

  1. Ouvrez le job pending.

  2. Vérifiez les messages d'assignation runner.

  3. Contrôlez les tags du job dans .gitlab-ci.yml.

  4. Vérifiez qu'un runner actif possède ces tags.

    Dans GitLab : Settings > CI/CD > Runners. Si aucun runner n'a le tag requis, le job restera pending indéfiniment.

👉 Vérifier votre solution (Étape 1)

Ouvrez le job pending dans GitLab. Le message d'assignation indique la cause :

This job is stuck because no runners are online

ou

This job is stuck because the project doesn't have any runners online assigned to it

Dans starter/lab-11, le job ruff-lint contient un tag inexistant :

ruff-lint:
tags:
- missing-runner-tag

Allez dans Settings > CI/CD > Runners et vérifiez les tags des runners disponibles.

Supprimez le bloc tags du job ruff-lint :

ruff-lint:
stage: lint
image: python:3.12-slim
# plus de tags forcés

Étape 2 — À vous de traiter un pipeline skipped

Section intitulée « Étape 2 — À vous de traiter un pipeline skipped »
  1. Ouvrez le .gitlab-ci.yml.

  2. Relisez le bloc workflow: rules.

  3. Comparez les règles avec votre contexte réel (push, merge_request_event, tag).

    Indice : une règle qui ne couvre qu'un tag skippe volontairement les pushes standards.

👉 Vérifier votre solution (Étape 2)

Un pipeline skipped signifie qu'aucune règle workflow: ne correspond à la source courante.

starter/lab-11 contient un workflow: trop restrictif :

workflow:
rules:
- if: $CI_COMMIT_TAG

Si vous faites un git push sur une branche de feature, le pipeline est skipped — comportement voulu par vos règles.

Correction attendue dans solution/lab-11 :

workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "push"
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_COMMIT_TAG
  1. Ajustez tags/rules

  2. Validez avec glab ci lint

    Fenêtre de terminal
    glab ci lint .gitlab-ci.yml
  3. Poussez et observez un run normal

    Fenêtre de terminal
    git add .gitlab-ci.yml
    git commit -m "ci: fix pending/skipped root causes"
    git push origin starter/lab-11
👉 Vérifier votre solution (Étape 3)
Fenêtre de terminal
# 1. Modifier .gitlab-ci.yml
# 2. Valider localement
glab ci lint .gitlab-ci.yml
# 3. Pousser une fois la validation verte
git add .gitlab-ci.yml
git commit -m "ci: fix pending/skipped root causes"
git push origin starter/lab-11

Observez le pipeline : les jobs doivent passer de pending ou skipped à running puis passed.

📄 Voir le fichier .gitlab-ci.yml complet
stages:
- lint
- test
- build
- deploy
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "push"
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_COMMIT_TAG
variables:
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.pip-cache"
ruff-lint:
stage: lint
image: python:3.12-slim
cache:
key:
files:
- requirements-dev.txt
paths:
- .pip-cache/
policy: pull
before_script:
- pip install ruff
script:
- ruff check app/ tests/
pytest:
stage: test
image: python:3.12-slim
cache:
key:
files:
- requirements-dev.txt
paths:
- .pip-cache/
before_script:
- pip install -r requirements-dev.txt
script:
- pytest -v --junitxml=report.xml --cov=app --cov-report=term-missing
coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
artifacts:
when: always
paths:
- report.xml
reports:
junit: report.xml
expire_in: 7 days
docker-build:
stage: build
image: docker:27
services:
- docker:27-dind
variables:
DOCKER_TLS_CERTDIR: "/certs"
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA .
- docker build -t $CI_REGISTRY_IMAGE:latest .
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
- docker push $CI_REGISTRY_IMAGE:latest
deploy-staging:
stage: deploy
image: alpine:3.20
script:
- echo "Deploying $CI_COMMIT_SHORT_SHA to staging..."
- ./scripts/deploy-demo.sh staging
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
deploy-production:
stage: deploy
image: alpine:3.20
script:
- echo "Deploying $CI_COMMIT_SHORT_SHA to production..."
- ./scripts/deploy-demo.sh production
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
when: manual
  • Le job pending est pris par un runner
  • Le pipeline n'est plus skipped de façon inattendue
  • Les règles couvrent les sources de pipeline attendues
  • La correction est reproductible sur un nouveau push

Un job pending n'est pas un job cassé. C'est un job en attente de runner. Chercher une erreur applicative dans le code ne sert donc à rien à ce stade. Il faut d'abord résoudre l'assignation runner.

Pour skipped, le piège est de penser à un bug GitLab. Dans la majorité des cas, c'est le comportement voulu par vos règles, même si vous ne l'aviez pas anticipé.

  • pending et skipped sont des statuts de pilotage CI, pas des erreurs applicatives
  • Les tags runner doivent correspondre exactement
  • workflow: rules décide si le pipeline démarre
  • Une checklist simple évite les diagnostics au hasard

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