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