Exercice 05 : Planifier et déclencher des pipelines automatiquement
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Créer un pipeline planifié (Schedule) avec une expression cron dans CI/CD → Schedules
- ✅ Détecter un pipeline schedulé avec
$CI_PIPELINE_SOURCE == "schedule"dansrules: - ✅ Déclencher un pipeline programmatiquement via l'API REST GitLab
- ✅ Utiliser
$CI_PIPELINE_CREATED_ATpour tracer les exécutions planifiées
Durée estimée : 20 minutes
Difficulté : ⭐⭐⭐⭐☆ (Avancé)
Prérequis :
- Module GitLab CI Avancé - Exercices 01 à 04 complétés
- Notions de base sur les cron expressions
📖 Contexte
Les pipelines GitLab peuvent être déclenchés de quatre façons : par un git push, manuellement depuis l'interface, par un webhook/API, ou automatiquement selon un planning cron (Schedules). Les pipelines schedulés sont idéaux pour les tâches de maintenance : nettoyage de la base, génération de rapports, tests de régression nocturnes.
📋 Énoncé
Configurez un pipeline schedulé qui exécute des tâches de maintenance à 2h du matin tous les jours. Ces tâches ne doivent s'exécuter QUE sur les pipelines schedulés, pas sur les git push. Ajoutez aussi un déclencheur API pour les déploiements d'urgence.
🧭 Déroulement de l'exercice
Tâche 1 : Créer un Schedule dans GitLab
Dans votre projet GitLab, naviguez vers CI/CD → Schedules → New schedule. Créez un schedule avec l'expression cron 0 2 * * * (tous les jours à 2h00 UTC) sur la branche main.
Indice : Format d'une expression cron :
minute heure jour-du-mois mois jour-de-semaine-
0 2 * * *= à la minute 0 de l'heure 2, tous les jours-
0 9 * * 1-5= à 9h00 du lundi au vendredi-
0 */6 * * *= toutes les 6 heuresGitLab exécute les schedules en UTC. Pensez à convertir selon votre fuseau horaire.
Vérification : Le schedule apparaît dans CI/CD → Schedules avec la prochaine date d'exécution prévue.
Tâche 2 : Détecter le pipeline schedulé avec rules
Créez un job maintenance-nightly qui ne s'exécute QUE sur les pipelines schedulés. Utilisez $CI_PIPELINE_SOURCE == "schedule" dans les rules:.
Indice :
`yamlmaintenance-nightly:
rules:
- if: '$CI_PIPELINE_SOURCE == "schedule"'
when: on_success
- when: never
script:
- echo "Tâche de maintenance nocturne"
- echo "Lancée le : $CI_PIPELINE_CREATED_AT"
`
$CI_PIPELINE_SOURCEvautschedulepour les pipelines planifiés,pushpour les pushs Git,webpour les déclenchements manuels.
Vérification : Sur un git push, maintenance-nightly est absent du pipeline. En cliquant "Run" sur le schedule, il s'exécute.
Tâche 3 : Créer des jobs conditionnels push vs schedule
Créez un pipeline avec deux types de jobs : les jobs "build" qui s'exécutent sur push, et les jobs "maintenance" qui s'exécutent sur schedule. Les deux types ne doivent jamais s'exécuter ensemble.
Indice :
`yaml# Job normal (push seulement)
build:
rules:
- if: '$CI_PIPELINE_SOURCE != "schedule"'
when: on_success
- when: never
>
# Job maintenance (schedule seulement)
cleanup-old-artifacts:
rules:
- if: '$CI_PIPELINE_SOURCE == "schedule"'
when: on_success
- when: never
`
Vérification : Un git push déclenche uniquement les jobs build. Le schedule déclenche uniquement cleanup-old-artifacts.
Tâche 4 : Déclencher un pipeline via l'API
GitLab permet de déclencher un pipeline via son API REST. Créez un Pipeline Trigger Token dans CI/CD → Pipeline triggers, puis déclenchez un pipeline manuellement avec curl.
Indice :
`bashcurl -X POST \
--form "token=<TRIGGER_TOKEN>" \
--form "ref=main" \
--form "variables[DEPLOY_ENV]=staging" \
"https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/trigger/pipeline"
`La variable
DEPLOY_ENVsera disponible dans les jobs du pipeline déclenché.$CI_PIPELINE_SOURCEvaudratriggerdans ce cas.
Vérification : L'appel API retourne un JSON avec l'ID du pipeline déclenché. Le pipeline apparaît dans CI/CD → Pipelines avec la source "trigger".
Tâche 5 : Utiliser $CI_PIPELINE_CREATED_AT
Dans les jobs de maintenance, utilisez $CI_PIPELINE_CREATED_AT pour générer un rapport horodaté. Formatez la date pour l'inclure dans un nom de fichier d'artefact.
Indice :
`bash# $CI_PIPELINE_CREATED_AT format : 2024-01-15T02:00:00.000Z (ISO 8601 UTC)
REPORT_DATE=$(echo $CI_PIPELINE_CREATED_AT | cut -c1-10)
echo "Rapport du $REPORT_DATE" > report-$REPORT_DATE.txt
`Combinez avec
artifacts:pour conserver les rapports de maintenance avec leur date dans le nom.
Vérification : Le fichier artefact est nommé report-2026-04-29.txt (avec la date réelle du pipeline).
🗂️ Mini-Projet : Pipeline avec scheduling et déclencheurs
Checkpoints de validation :
- Le schedule
0 2 * * *est créé dans CI/CD → Schedules maintenance-nightlyn'apparaît pas sur ungit push- En cliquant "Run" sur le schedule, seuls les jobs de maintenance s'exécutent
- Le déclenchement API crée bien un nouveau pipeline avec
source: trigger - Le rapport horodaté utilise
$CI_PIPELINE_CREATED_ATdans son nom