Aller au contenu
CI/CD & Automatisation medium

Lab 16 — Pipelines parent-enfant dynamiques

10 min de lecture

logo gitlab

Un pipeline statique peut devenir coûteux quand il traite tous les cas de la même manière. Dans ce lab, vous introduisez une orchestration parent-enfant pour générer un plan d’exécution dynamique, piloté par un script versionné dans le dépôt.

  • Concevoir une étape d’orchestration dans un pipeline CI
  • Générer dynamiquement un YAML enfant depuis un script shell
  • Déclencher un child pipeline avec trigger et artifact
  • Ajouter une logique contextuelle simple (branche par défaut vs autre branche)

Ce pattern devient utile quand un pipeline doit s’adapter à des changements fréquents de périmètre. Un monolithe CI finit par lancer trop de jobs pour des modifications mineures.

Vous utiliserez cette approche quand :

  • différents services doivent déclencher des sous-pipelines spécialisés ;
  • vous voulez isoler la logique de décision dans un script maintenable ;
  • vous cherchez à réduire le coût CI sans perdre de contrôle.
  1. Basculez sur la branche du lab

    Fenêtre de terminal
    cd pipeline-craft
    git checkout starter/lab-16
  2. Vérifiez la structure existante

    Le pipeline est déjà découpé et matriciel, mais pas encore dynamique.

  3. Lancez une baseline

    Fenêtre de terminal
    git push origin starter/lab-16

Le pipeline actuel exécute toujours la même séquence, même pour des cas simples. Vous allez introduire une orchestration pour produire un sous-plan plus ciblé.

Étape 1 — Ajouter un fichier d’orchestration CI

Section intitulée « Étape 1 — Ajouter un fichier d’orchestration CI »
  1. Créez ci/orchestration.yml

  2. Ajoutez un job generate-child-pipeline

  3. Publiez child-pipeline.yml en artifact

    Indice : utilisez un expire_in court pour cet artifact temporaire.

👉 Vérifier votre solution (Étape 1)
generate-child-pipeline:
stage: orchestrate
image: alpine:3.20
before_script:
- apk add --no-cache bash git
script:
- chmod +x scripts/generate-child-pipeline.sh
- ./scripts/generate-child-pipeline.sh
artifacts:
paths:
- child-pipeline.yml
expire_in: 1 day
run-child-pipeline:
stage: orchestrate
needs:
- generate-child-pipeline
trigger:
include:
- artifact: child-pipeline.yml
job: generate-child-pipeline
strategy: depend
rules:
- if: $CI_PIPELINE_SOURCE == "push"
- if: $CI_PIPELINE_SOURCE == "merge_request_event"

Étape 2 — Générer dynamiquement le YAML enfant

Section intitulée « Étape 2 — Générer dynamiquement le YAML enfant »
  1. Créez le script scripts/generate-child-pipeline.sh

    Indice : ce fichier n’existe pas dans le starter, vous devez le créer.

  2. Ajoutez une logique contextuelle

    Exemple : ajouter un job supplémentaire si la branche vaut main.

  3. Vérifiez que le script est exécutable

    Fenêtre de terminal
    chmod +x scripts/generate-child-pipeline.sh
👉 Vérifier votre solution (Étape 2)
#!/usr/bin/env bash
set -euo pipefail
# Dynamic child pipeline used in Lab 16.
# It adapts jobs according to branch context.
cat > child-pipeline.yml <<'YAML'
stages:
- verify
child-smoke:
stage: verify
image: alpine:3.20
script:
- echo "Smoke check in child pipeline"
YAML
if [[ "${CI_COMMIT_BRANCH:-}" == "${CI_DEFAULT_BRANCH:-}" ]]; then
cat >> child-pipeline.yml <<'YAML'
child-default-branch-check:
stage: verify
image: alpine:3.20
script:
- echo "Extra checks on default branch"
YAML
fi
cat child-pipeline.yml
  1. Ajoutez un job run-child-pipeline

  2. Utilisez trigger avec include artifact

    Indice : gardez strategy: depend pour propager l’état du pipeline enfant.

  3. Ajoutez ci/orchestration.yml dans les includes du pipeline racine

👉 Vérifier votre solution (Étape 3)

Le pipeline racine ajoute un stage orchestrate et inclut le fichier d’orchestration.

stages:
- lint
- test
- orchestrate
- build
- deploy
include:
- local: ci/lint.yml
- local: ci/test.yml
- local: ci/build.yml
- local: ci/deploy.yml
- local: ci/orchestration.yml
  1. Lint branch-aware

    Fenêtre de terminal
    glab ci lint .gitlab-ci.yml
  2. Commit

    Fenêtre de terminal
    git add .gitlab-ci.yml ci/orchestration.yml scripts/generate-child-pipeline.sh
    git commit -m "ci: add dynamic parent-child orchestration"
    git push origin starter/lab-16
  3. Vérifiez les deux niveaux de pipeline dans GitLab

👉 Vérifier votre solution (Étape 4)
  • generate-child-pipeline produit bien child-pipeline.yml en artifact ;
  • run-child-pipeline déclenche le child pipeline via trigger.include.artifact ;
  • le parent attend le résultat enfant (strategy: depend) ;
  • un job supplémentaire apparaît dans le child pipeline sur la branche par défaut.
📄 Voir le fichier .gitlab-ci.yml complet
stages:
- lint
- test
- orchestrate
- build
- deploy
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "push"
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_COMMIT_TAG
default:
interruptible: true
variables:
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.pip-cache"
include:
- local: ci/lint.yml
- local: ci/test.yml
- local: ci/build.yml
- local: ci/deploy.yml
- local: ci/orchestration.yml
📄 Voir le fichier ci/orchestration.yml complet
generate-child-pipeline:
stage: orchestrate
image: alpine:3.20
before_script:
- apk add --no-cache bash git
script:
- chmod +x scripts/generate-child-pipeline.sh
- ./scripts/generate-child-pipeline.sh
artifacts:
paths:
- child-pipeline.yml
expire_in: 1 day
run-child-pipeline:
stage: orchestrate
needs:
- generate-child-pipeline
trigger:
include:
- artifact: child-pipeline.yml
job: generate-child-pipeline
strategy: depend
rules:
- if: $CI_PIPELINE_SOURCE == "push"
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
📄 Voir le fichier scripts/generate-child-pipeline.sh complet
#!/usr/bin/env bash
set -euo pipefail
# Dynamic child pipeline used in Lab 16.
# It adapts jobs according to branch context.
cat > child-pipeline.yml <<'YAML'
stages:
- verify
child-smoke:
stage: verify
image: alpine:3.20
script:
- echo "Smoke check in child pipeline"
YAML
if [[ "${CI_COMMIT_BRANCH:-}" == "${CI_DEFAULT_BRANCH:-}" ]]; then
cat >> child-pipeline.yml <<'YAML'
child-default-branch-check:
stage: verify
image: alpine:3.20
script:
- echo "Extra checks on default branch"
YAML
fi
cat child-pipeline.yml
  • ci/orchestration.yml existe et est inclus dans le pipeline racine
  • child-pipeline.yml est généré puis consommé via artifact
  • Le child pipeline se déclenche correctement
  • Le comportement varie selon le contexte défini

Un child pipeline échoue souvent pour une raison simple : YAML généré invalide. Ajoutez un cat child-pipeline.yml dans le job de génération pour faciliter le debug.

Autre point important : sans strategy: depend, le parent peut se terminer sans attendre le résultat réel du child.

  • Le parent-enfant sépare orchestration et exécution métier
  • Un script versionné permet une logique dynamique contrôlée
  • Les artifacts servent de transport de configuration entre jobs
  • Un pipeline dynamique reste auditable s’il est lisible et traçable

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.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn