Aller au contenu
CI/CD & Automatisation medium

Déclencheurs de pipelines GitLab CI/CD

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

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.

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
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
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
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é
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+-.+$/
  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
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
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
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"
  1. Settings > CI/CD > Pipeline trigger tokens
  2. Add new token
  3. Copier le token (affiché une seule fois)
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
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+$/
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

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