
Vous avez poussé du code mais le pipeline n'apparaît pas ou est marqué "skipped" ? Ce guide vous aide à comprendre pourquoi et à corriger le problème.
Comprendre la différence
Section intitulée « Comprendre la différence »Avant de toucher au .gitlab-ci.yml, identifiez lequel des trois symptômes vous
avez sous les yeux : ils se ressemblent dans l'interface mais ne se corrigent pas
au même endroit. Le critère de tri est simple : allez dans Build > Pipelines
et regardez si une ligne de pipeline existe. Si elle existe et qu'elle est
grise, le problème est dans les règles. Si aucune ligne n'apparaît, GitLab
n'a même pas réussi à lire votre configuration.
| Situation | Symptôme | Cause |
|---|---|---|
| Pipeline skipped | Pipeline visible mais gris | workflow:rules ne matche pas ou [skip ci] |
| Jobs skipped | Pipeline vert mais jobs gris | rules: des jobs ne matchent pas |
| Pas de pipeline | Rien dans Pipelines | Fichier absent, invalide, ou workflow:rules exclut ce cas |
Cause #1 : workflow:rules ne matche pas
Section intitulée « Cause #1 : workflow:rules ne matche pas »C'est la cause la plus fréquente. workflow:rules contrôle si le pipeline est créé.
Exemple de problème :
workflow: rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' # Incorrect : il manque le cas des pushs
# Ce pipeline ne se crée JAMAIS sur un push simpleQuand vous poussez sur une branche (sans MR ouverte), $CI_PIPELINE_SOURCE vaut push, pas merge_request_event. Aucune règle ne matche → pipeline skipped.
Solution :
workflow: rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - if: '$CI_COMMIT_BRANCH' # Correct : le cas des pushs est couvertCause #2 : Tous les jobs ont when: never
Section intitulée « Cause #2 : Tous les jobs ont when: never »Si aucun job n'est ajouté au pipeline (rules qui ne matchent nulle part), le pipeline apparaît généralement skipped ou vide selon le type de pipeline.
Exemple :
build: rules: - if: '$CI_COMMIT_BRANCH == "main"' when: never # Exclus sur main - when: never # Exclus partout ailleurs !
test: rules: - if: '$CI_COMMIT_BRANCH == "develop"' # Sur main, aucune règle ne matche → job skippedSur main, les deux jobs sont skipped → pipeline skipped.
Diagnostic : vérifiez que au moins un job s'exécute dans chaque scénario.
Cause #3 : Fichier .gitlab-ci.yml invalide
Section intitulée « Cause #3 : Fichier .gitlab-ci.yml invalide »Un fichier YAML invalide empêche la création du pipeline.
Diagnostic :
- Build > Pipeline editor → Collez votre fichier → Validate
- Utilisez l'option "Simulate pipeline creation" pour voir quelles rules bloquent
- Ou Build > Pipelines → Message d'erreur en rouge
Erreurs courantes :
| Erreur | Cause | Solution |
|---|---|---|
Invalid yaml syntax | Indentation incorrecte | Utiliser 2 espaces, pas de tabs |
Unknown key | Faute de frappe | Vérifier l'orthographe (script pas scripts) |
jobs:xxx:rules config should be an array | Mauvaise structure | rules: doit être une liste |
Cause #4 : Branche avec MR ouverte
Section intitulée « Cause #4 : Branche avec MR ouverte »GitLab évite les pipelines en double. Si une MR est ouverte pour votre branche, seul le pipeline MR s'exécute.
Exemple (pattern recommandé par GitLab) :
workflow: rules: - if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS' when: never # Skip si branche a une MR - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - if: '$CI_COMMIT_BRANCH'Avec cette config, pousser sur une branche avec MR ouverte ne crée pas de pipeline push (c'est voulu pour éviter les doublons).
Cause #5 : Commit message [skip ci]
Section intitulée « Cause #5 : Commit message [skip ci] »Un commit contenant [skip ci] ou [ci skip] dans son message provoque un pipeline skipped.
Piège courant : GitLab évalue le message du commit pointé par la référence
poussée, pas celui que vous venez d'écrire. Créer une branche depuis un commit
contenant [skip ci] sans rien ajouter dessus revient donc à pousser ce commit,
et le pipeline est de nouveau skipped alors que vous n'avez rien demandé.
Diagnostic :
Vérifiez le message du dernier commit :
git log -1 --format=%BSolution : faites un nouveau commit sans [skip ci] ou utilisez Run pipeline depuis l'interface.
Diagnostic pas à pas
Section intitulée « Diagnostic pas à pas »Suivez ces cinq vérifications dans l'ordre : elles vont du plus grossier au plus subtil, et chacune élimine une famille de causes. Les deux premières prennent dix secondes et écartent déjà la majorité des cas. L'étape 4, le job de debug, est la seule qui vous montre les valeurs réelles des variables dans votre contexte exact ; c'est elle qui tranche quand les règles ont l'air correctes sur le papier.
-
Vérifier que le fichier existe
Le fichier doit s'appeler exactement
.gitlab-ci.ymlà la racine du repo. -
Valider le YAML
Build > Pipeline editor > Validate
-
Vérifier
workflow:rulesQuelles sont vos règles ? Matchent-elles votre cas ?
workflow:rules:- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'- if: '$CI_COMMIT_BRANCH'- if: '$CI_COMMIT_TAG' -
Ajouter un job de debug
debug:script:- echo "SOURCE=$CI_PIPELINE_SOURCE"- echo "BRANCH=$CI_COMMIT_BRANCH"- echo "TAG=$CI_COMMIT_TAG"- echo "MR=$CI_MERGE_REQUEST_ID"rules:- if: '$CI_PIPELINE_SOURCE'when: always -
Utiliser le CI Lint avec simulation
Build > Pipeline editor > Validate puis lancez la simulation pour voir quels jobs seraient créés lors d'un push sur la branche par défaut.
Tableau de référence : sources de pipeline
Section intitulée « Tableau de référence : sources de pipeline »C'est la colonne du milieu qui vous intéresse : la valeur exacte à comparer dans
un if:. Elle est sensible à la casse et s'écrit toujours en minuscules avec
des underscores. Deux confusions reviennent souvent : push couvre à la fois les
branches et les tags, et pipeline désigne les pipelines multi-projets,
pas les pipelines enfants, qui prennent la valeur parent_pipeline.
| Source | $CI_PIPELINE_SOURCE | Quand ? |
|---|---|---|
| Push | push | Commit poussé |
| Merge Request | merge_request_event | MR créée/mise à jour |
| Schedule | schedule | Pipeline planifié |
| Web | web | Bouton "Run pipeline" |
| API | api | Appel API |
| Trigger | trigger | Token de trigger |
| Parent | parent_pipeline | Pipeline parent-enfant |
| Multi-project | pipeline | Pipeline multi-projets |
Exemples de workflow:rules corrects
Section intitulée « Exemples de workflow:rules corrects »Pipeline sur push ET merge requests
Section intitulée « Pipeline sur push ET merge requests »C'est la configuration de départ recommandée quand vous ne savez pas encore quoi mettre. Elle accepte tout ce qui vient d'une merge request et tout ce qui vient d'une branche. Conséquence à assumer : pousser sur une branche qui a déjà une MR ouverte déclenche deux pipelines pour le même commit, et double la consommation de minutes de runner.
workflow: rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - if: '$CI_COMMIT_BRANCH'Pipeline sur push, mais pas si MR ouverte (éviter doublons)
Section intitulée « Pipeline sur push, mais pas si MR ouverte (éviter doublons) »Cette variante corrige le doublon précédent. La règle en when: never ne bloque
pas le pipeline de merge request, parce que $CI_COMMIT_BRANCH n'est pas
définie dans un pipeline de MR : la condition ne peut pas correspondre.
$CI_OPEN_MERGE_REQUESTS contient la liste des merge requests dont la branche
courante est la source, et reste vide sinon. C'est le motif publié par
GitLab pour ne garder qu'un seul pipeline par commit.
workflow: rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS' when: never - if: '$CI_COMMIT_BRANCH'Pipeline sur tags uniquement
Section intitulée « Pipeline sur tags uniquement »Configuration typique d'un dépôt de release : rien ne part au quotidien, tout se déclenche à la pose d'un tag. Sachez ce que vous acceptez avec cette règle : tous les pushs de branche et toutes les merge requests sont skipped, donc aucun test ne tourne avant le tag. Réservez-la aux dépôts dont le contenu est déjà validé ailleurs.
workflow: rules: - if: '$CI_COMMIT_TAG'Pipeline partout sauf branches WIP
Section intitulée « Pipeline partout sauf branches WIP »L'exclusion doit venir en premier, avant les règles qui acceptent : GitLab
applique la première règle qui correspond et ignore les suivantes. Placée en
dernier, la règle wip- ne serait jamais évaluée. Le =~ compare la variable à
une expression régulière délimitée par des barres obliques, et l'accroche
^ la fait porter sur le début du nom de branche.
workflow: rules: - if: '$CI_COMMIT_BRANCH =~ /^wip-/' when: never - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - if: '$CI_COMMIT_BRANCH' - if: '$CI_COMMIT_TAG'Checklist de debug
Section intitulée « Checklist de debug »Parcourez cette liste dans l'ordre avant d'ouvrir un ticket ou de demander de
l'aide : elle reprend les causes du guide, de la plus triviale à la plus
subtile. Les trois premières lignes se vérifient sans quitter votre terminal.
Si tout est coché et que le pipeline reste skipped, le problème est
probablement une politique de sécurité au niveau du groupe, qui peut
restreindre la création de pipelines ou le comportement de [skip ci].
□ Le fichier .gitlab-ci.yml existe-t-il à la racine ?□ Le YAML est-il valide ? (Pipeline editor > Validate + Simulate)□ Le commit contient-il [skip ci] ou [ci skip] ?□ Y a-t-il une section workflow:rules ? → Oui : Couvre-t-elle votre cas (push, MR, schedule...) ? → Non : Le pipeline devrait se créer□ Au moins un job a-t-il des rules qui matchent ?□ La branche a-t-elle une MR ouverte ? → Vérifier si c'est voulu dans workflow:rulesÀ retenir
Section intitulée « À retenir »- Pipeline skipped =
workflow:rulesne matche pas ou[skip ci]dans le commit - Tous les jobs skipped = aucune
rules:de job ne matche (pipeline vide) - Pas de pipeline = fichier invalide, absent, ou
workflow:rulesexclut ce cas [skip ci]dans un commit peut affecter les branches créées depuis ce commit- Première règle qui matche gagne, ordre important
- CI Lint + Simulate pour valider avant de pusher
On passe à la pratique
Section intitulée « On passe à la pratique »Appliquez ces vérifications dans le Lab 11, Débugger un job bloqué.
Testez vos connaissances
Section intitulée « Testez vos connaissances »Ces questions portent sur les cinq causes décrites ci-dessus et sur la
lecture de workflow:rules. Si vous hésitez entre pipeline skipped et
pipeline non créé, relisez le premier tableau avant de commencer.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications