Aller au contenu
CI/CD & Automatisation medium

Déclencheurs de pipelines GitLab CI/CD

15 min de lecture

logo gitlab

Votre pipeline tourne deux fois sur chaque commit ? C'est le piège classique : un pipeline sur la branche ET un sur la merge request. Ce guide vous apprend à contrôler précisément quand vos pipelines s'exécutent grâce aux sources de pipeline et à CI_PIPELINE_SOURCE.

À la fin de ce module, vous saurez :

  • Comprendre CI_PIPELINE_SOURCE : identifier comment un pipeline a été déclenché
  • Éviter les doublons branch/MR : configurer workflow:rules pour un seul pipeline
  • Configurer des schedules : exécuter des jobs de nuit ou périodiques
  • Cibler les tags : déclencher des releases sur les tags de version
  • Déclencher via API : lancer un pipeline depuis un script externe
  • Adapter les variables : gérer les différences entre sources de pipeline

Avant de continuer, assurez-vous de maîtriser :

Chaque pipeline a une source qui indique comment il a été déclenché :

SourceDéclencheurCas d'usage
pushCommit poussé sur une branchePipeline standard
merge_request_eventCréation/mise à jour d'une MRReview, tests pré-merge
scheduleCron configuré dans GitLabTests de nuit, scans
webBouton "Run pipeline" dans l'UIDebug, déploiement manuel
apiAppel API /pipelineAutomatisation externe
triggertrigger: depuis un autre pipelineMulti-projet
parent_pipelineChild pipelineParent-enfant
pipelineDownstream multi-projetOrchestration

La variable est disponible dans tous les pipelines, quelle que soit la source : c'est le seul critère qui fonctionne aussi bien dans workflow:rules que dans les rules: d'un job.

job_only_on_mr:
script: echo "Tests pré-merge"
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
job_only_on_schedule:
script: echo "Scan de sécurité nocturne"
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"
job_only_on_tag:
script: echo "Release"
rules:
- if: $CI_COMMIT_TAG

C'est le symptôme qui amène la plupart des lecteurs sur cette page : deux pipelines identiques par commit, deux fois les minutes de runner consommées, et une liste de pipelines illisible. La cause n'est pas un bug, c'est le comportement par défaut quand le fichier .gitlab-ci.yml ne contient aucun workflow:rules. Deux corrections existent, la première convient à la grande majorité des projets.

Par défaut, quand vous créez une MR, GitLab peut créer deux pipelines :

  1. Un pipeline branch (source: push)
  2. Un pipeline MR (source: merge_request_event)

C'est du gaspillage de ressources et ça pollue l'interface.

Les règles de workflow: sont évaluées de haut en bas et la première qui correspond décide du sort du pipeline. Un commit poussé sur une branche de travail ne correspond à aucune des trois conditions : aucun pipeline branch n'est créé.

workflow:
rules:
# Pipelines MR pour toutes les branches avec MR ouverte
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
# Pipeline branch uniquement sur main (après merge)
- if: $CI_COMMIT_BRANCH == "main"
# Tags de release
- if: $CI_COMMIT_TAG

Cette variante conserve un pipeline sur les branches tant qu'aucune MR n'est ouverte, puis bascule sur le pipeline MR dès qu'une revue démarre. Le when: never en tête est ce qui supprime le doublon.

workflow:
rules:
# Si une MR est ouverte, laisser le pipeline MR s'en charger
- if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
when: never
# Pipeline MR
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
# Pipeline branch (si pas de MR ouverte)
- if: $CI_COMMIT_BRANCH

Le choix dépend d'une seule question : voulez-vous que les commits poussés sur une branche sans MR ouverte déclenchent des tests ?

ApprocheAvantageInconvénient
MR uniquementSimple, clairPas de pipeline sur branches sans MR
CI_OPEN_MERGE_REQUESTSPipeline branch si pas de MRPlus complexe

Les tags sont souvent utilisés pour les releases. Ciblez-les spécifiquement :

release:
stage: deploy
script:
- echo "Building release $CI_COMMIT_TAG"
- ./build-release.sh
rules:
- if: $CI_COMMIT_TAG

Dans un pipeline de tag, CI_COMMIT_BRANCH est vide : le tag ne pointe pas vers une branche. Les variables ci-dessous sont celles sur lesquelles s'appuyer pour construire un numéro de version ou vérifier une protection.

VariableContenu
CI_COMMIT_TAGNom du tag (ex: v1.2.3)
CI_COMMIT_REF_NAMETag ou branche
CI_COMMIT_REF_PROTECTEDtrue si tag/branche protégé

Les expressions régulières s'écrivent entre barres obliques, sans guillemets, et sont ancrées explicitement avec ^ et $ : sans ancres, v1.0.0-rc1 correspondrait aussi au motif des versions finales.

release_production:
rules:
# Tags de release (v1.0.0, v2.1.3, etc.)
- if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/
release_prerelease:
rules:
# Tags de prérelease (v1.0.0-rc1, v2.0.0-beta)
- if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+-.+$/

Un pipeline schedulé ne se déclare pas dans le fichier .gitlab-ci.yml mais dans l'interface du projet : le fichier ne fait que réagir à la source schedule. C'est le mécanisme des scans de sécurité nocturnes, des rapports périodiques et des tâches de maintenance, tout ce qui ne doit pas dépendre d'un commit.

Le planning est attaché à une branche cible et s'exécute avec les droits de son créateur : si cette personne perd l'accès à la branche protégée, le planning cesse silencieusement de fonctionner.

  1. Accéder aux schedules

    Build > Pipeline schedules > New schedule

  2. Configurer le cron

    • Description : "Scan de sécurité nocturne"
    • Interval pattern : 0 2 * * * (tous les jours à 2h)
    • Target branch : main
  3. Ajouter des variables (optionnel)

    • SCAN_TYPE = full
    • Ces variables sont disponibles dans le pipeline

Les variables définies dans le planning écrasent celles du job. Déclarer une valeur par défaut au niveau du job, comme SCAN_TYPE ci-dessous, évite que le script reçoive une variable vide lors d'une exécution manuelle.

security_scan:
stage: test
script:
- ./security-scan.sh --type $SCAN_TYPE
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"
variables:
SCAN_TYPE: "quick" # Valeur par défaut si non définie

GitLab utilise la syntaxe cron standard à cinq champs, interprétée dans le fuseau horaire configuré pour l'instance. Voici les rythmes les plus courants.

CronDescription
0 2 * * *Tous les jours à 2h
0 2 * * 1-5Lun-Ven à 2h
0 */6 * * *Toutes les 6 heures
0 0 * * 0Dimanche minuit
0 0 1 * *Premier jour du mois

Le déclenchement externe sert à relier GitLab à ce qui vit en dehors : un outil de release, un autre dépôt, un système de tickets. Deux chemins existent et ils ne produisent pas la même valeur de CI_PIPELINE_SOURCE, ce qui a des conséquences directes sur vos rules:.

L'appel accepte des variables via la syntaxe variables[NOM]=valeur, qui arrivent dans le pipeline comme des variables CI ordinaires. L'option --fail fait échouer curl sur une réponse HTTP d'erreur, sans quoi un token invalide passerait inaperçu dans un script.

Fenêtre de terminal
curl -X POST \
--fail \
-F "token=$TRIGGER_TOKEN" \
-F "ref=main" \
-F "variables[DEPLOY_ENV]=staging" \
"https://gitlab.example.com/api/v4/projects/123/trigger/pipeline"

Le token n'est affiché qu'à sa création : s'il est perdu, il faut en générer un nouveau et mettre à jour tous les appelants.

  1. Settings > CI/CD > Pipeline trigger tokens
  2. Add new token
  3. Copier le token (affiché une seule fois)

Tester les deux sources dans la même condition évite d'avoir à savoir quel mécanisme d'appel a été utilisé côté client.

deploy_from_api:
script:
- echo "Déploiement déclenché via API"
- echo "Environnement: $DEPLOY_ENV"
rules:
- if: $CI_PIPELINE_SOURCE == "trigger" || $CI_PIPELINE_SOURCE == "api"

Certaines variables ne sont disponibles que pour certaines sources :

Variablepushmerge_request_eventschedule
CI_COMMIT_BRANCH
CI_MERGE_REQUEST_IID
CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
CI_PIPELINE_SOURCE
CI_OPEN_MERGE_REQUESTS

Cet exemple rassemble les cinq cas traités jusqu'ici dans un seul fichier. Le bloc workflow: filtre en amont : un pipeline qui ne correspond à aucune de ses règles n'est jamais créé, et les rules: des jobs n'ont donc plus qu'à distinguer les cas restants. C'est aussi pourquoi le job test n'a aucune règle : tout ce qui arrive jusqu'à lui a déjà été validé par workflow:.

workflow:
rules:
# 1. Pipelines MR (review)
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
# 2. Branches protégées (après merge)
- if: $CI_COMMIT_BRANCH == "main"
- if: $CI_COMMIT_BRANCH == "develop"
# 3. Tags de release
- if: $CI_COMMIT_TAG
# 4. Schedules (scans nocturnes)
- if: $CI_PIPELINE_SOURCE == "schedule"
# 5. Déclenchement manuel/API
- if: $CI_PIPELINE_SOURCE == "web"
- if: $CI_PIPELINE_SOURCE == "api"
# Jobs conditionnels selon la source
test:
stage: test
script: npm test
# Tourne toujours (workflow l'a déjà filtré)
security_scan:
stage: test
script: ./security-scan.sh
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: manual
allow_failure: true
deploy_staging:
stage: deploy
script: ./deploy.sh staging
rules:
- if: $CI_COMMIT_BRANCH == "develop"
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: manual
release:
stage: deploy
script: ./release.sh
rules:
- if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/

Ces cinq situations couvrent l'essentiel des tickets ouverts sur le sujet. Le point commun des trois premières : le pipeline se comporte comme prévu, c'est la compréhension de la source qui est fausse.

ErreurCauseSolution
Pipeline tourne 2 foisPas de workflow:rules pour filtrerAjouter workflow MR-first
CI_COMMIT_BRANCH videPipeline MRUtiliser CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
Schedule ne tourne pasBranch protégée sans permissionVérifier les permissions du créateur
Tag non détectérules: trop restrictivesAjouter if: $CI_COMMIT_TAG
API retourne 401Token invalideRégénérer le trigger token
ConceptClé
Source de pipelineCI_PIPELINE_SOURCE identifie le déclencheur
Doublonsworkflow:rules MR-first évite 2 pipelines
SchedulesPour scans nocturnes, maintenance périodique
Tags$CI_COMMIT_TAG pour les releases
Variables MRCI_COMMIT_BRANCH n'existe pas, utiliser CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
MR ouverteCI_OPEN_MERGE_REQUESTS liste les MR pour ce commit

Passez au Lab 08, Déclencher pipeline pour configurer schedules, triggers et API.

Testez vos connaissances sur les déclencheurs de pipelines GitLab.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
5 min.
70% requis

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

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn