Aller au contenu
CI/CD & Automatisation medium

CI/CD Components et Catalog GitLab

17 min de lecture

logo gitlab

Vous cherchez des briques pipeline prêtes à l’emploi au lieu de tout écrire vous-même ? Les CI/CD Components (GA depuis GitLab 17.0) sont des blocs de pipeline réutilisables, versionnés et documentés. Vous les trouvez dans le CI/CD Catalog, vous les incluez avec include:component, et ils fonctionnent — comme installer un package npm pour vos pipelines.

Ce guide vous montre d’abord comment trouver et utiliser des composants existants, puis comment créer les vôtres pour votre équipe.

  • Trouver des composants dans le CI/CD Catalog (gitlab.com ou self-hosted)
  • Utiliser un composant dans votre pipeline avec include:component
  • Comprendre la différence entre include classique et les components
  • Créer votre propre composant avec spec:inputs
  • Publier et versionner un composant dans le catalog

Vous écrivez des pipelines GitLab CI/CD et vous vous retrouvez régulièrement à :

  • Copier-coller du YAML d’un projet à l’autre pour les jobs classiques (build Docker, lint, tests, SAST)
  • Chercher dans des repositories internes des templates partagés sans savoir lesquels existent
  • Maintenir des include: project: dont personne ne documente les variables attendues

Le CI/CD Catalog résout ces trois problèmes. C’est un registry de briques pipeline — cherchez, incluez, configurez.

Un CI/CD Component est un bloc de pipeline réutilisable hébergé dans un projet GitLab. Chaque composant :

  • Déclare ses paramètres via spec:inputs (nom, type, valeur par défaut, description)
  • Est versionné via les tags Git du projet (semver)
  • Est publié dans le CI/CD Catalog de l’instance GitLab
  • Est découvrable : recherche par nom, documentation intégrée, liste des inputs
CritèreincludeComponents
ComplexitéSimple — inclure un fichier YAMLPlus structuré — projet dédié
ParamétrageVariables d’environnement (non typées)spec:inputs typés avec defaults
Versioningref: optionnelTags Git obligatoires pour le catalog
DocumentationREADME séparé (si on y pense)Intégrée dans le catalog
DécouvrabilitéIl faut connaître le cheminRecherche dans le catalog
ValidationAucune — le YAML est inclus tel quelInputs validés à l’évaluation
Cas d’usagePartage interne équipe, petits projetsPartage cross-équipes, standards org

Règle pratique : si c’est utilisé par plus de 3 projets ou plus d’une équipe, un component est plus adapté qu’un include.

Le catalog est accessible depuis le menu latéral de GitLab :

  • GitLab.com : Allez sur Explore > CI/CD Catalog ou directement à l’URL https://gitlab.com/explore/catalog
  • Self-hosted : menu latéral Explore > CI/CD Catalog, ou https://votre-instance.example.com/explore/catalog

Le catalog affiche pour chaque composant :

  • Le README du projet (documentation)
  • Les versions disponibles (tags)
  • Le nombre de projets qui l’utilisent
  • Les inputs de chaque template (extraits automatiquement du spec:)

GitLab maintient des composants officiels dans le namespace gitlab.com/components/. Quelques exemples utiles :

ComposantUsageRéférence
components/sastAnalyse statique de sécuritégitlab.com/components/sast@<version>
components/secret-detectionDétection de secretsgitlab.com/components/secret-detection@<version>
components/code-qualityQualité de codegitlab.com/components/code-quality@<version>
components/container-scanningScan d’images Dockergitlab.com/components/container-scanning@<version>

Incluez un composant dans votre .gitlab-ci.yml avec la directive include:component :

.gitlab-ci.yml
include:
- component: $CI_SERVER_FQDN/components/sast@7.3.2
inputs:
stage: test
stages:
- test
- build
build:
stage: build
script: npm run build

Ce pipeline inclut le composant officiel SAST. Le composant crée automatiquement un ou plusieurs jobs dans le stage indiqué — vous n’avez pas à les écrire.

Le chemin d’un composant suit ce format :

<instance>/<namespace>/<projet>/<template>@<version>
PartieSignificationExemple
<instance>Votre instance GitLabgitlab.com ou gitlab.example.com
<namespace>/<projet>Groupe et projet du composantcomponents/sast
<template>Fichier dans templates/ (sans .yml)Omis si le projet n’a qu’un template
@<version>Tag Git (version sémantique)@7.3.2
.gitlab-ci.yml
include:
# Scan SAST officiel — crée un job sast dans le stage test
- component: $CI_SERVER_FQDN/components/sast@7.3.2
inputs:
stage: test
# Détection de secrets — crée un job secret-detection dans le stage test
- component: $CI_SERVER_FQDN/components/secret-detection@7.3.2
inputs:
stage: test
stages:
- test
- build
build:
stage: build
image: node:20
script:
- npm ci
- npm run build

Ce que le pipeline produit : 3 jobs au total — sast et secret-detection (créés par les composants), plus votre job build. Les composants gèrent tout (image, script, artifacts) — vous ne fournissez que les inputs.

Pour un composant publié par votre équipe (pas un composant officiel) :

.gitlab-ci.yml
include:
# Composant build interne — projet devops/ci-components-nodejs
- component: $CI_SERVER_FQDN/devops/ci-components-nodejs/build@1.0.0
inputs:
image: node:20
build_command: "npm run build"
# Composant test du même projet (autre template)
- component: $CI_SERVER_FQDN/devops/ci-components-nodejs/test@1.0.0
inputs:
image: node:20
with_coverage: true

Ici, le projet ci-components-nodejs expose deux templates (build et test), chacun avec ses propres inputs.

Un input sans default est obligatoire. GitLab refuse le pipeline si vous ne le fournissez pas :

# ❌ Erreur : 'image' est requis (pas de default dans le composant)
include:
- component: $CI_SERVER_FQDN/devops/ci-components-nodejs/build@1.0.0
inputs:
build_command: "npm run build"
# ✅ OK : 'image' fourni, 'build_command' a une valeur par défaut
include:
- component: $CI_SERVER_FQDN/devops/ci-components-nodejs/build@1.0.0
inputs:
image: node:20

Pour savoir quels inputs existent et lesquels sont obligatoires, consultez la page du composant dans le catalog — les inputs sont listés avec leur type, leur description et leur éventuel default.

Un composant peut créer un ou plusieurs jobs. Pour savoir ce qui sera ajouté à votre pipeline :

  1. Lisez la documentation du composant dans le catalog
  2. Consultez le pipeline editor : allez dans Build > Pipeline editor et cliquez « Visualize ». GitLab résout les composants et affiche tous les jobs
  3. Regardez le CI Lint : dans Build > Pipeline editor > CI Lint, collez votre .gitlab-ci.yml et validez — le résultat montre la configuration complète après résolution

Un composant vit dans un projet GitLab dédié :

ci-components-nodejs/
├── templates/
│ ├── build.yml # Composant build
│ ├── test.yml # Composant test
│ └── lint.yml # Composant lint
├── README.md # Documentation (affichée dans le catalog)
└── .gitlab-ci.yml # Pipeline pour tester le composant lui-même

Chaque fichier dans templates/ est un composant indépendant avec son propre spec:inputs.

Le cœur d’un composant est la section spec:inputs qui déclare l’interface :

templates/build.yml
spec:
inputs:
stage:
default: build
description: "Le stage dans lequel le job s'exécute"
image:
description: "Image Docker pour le build"
build_command:
default: "npm run build"
description: "Commande de build"
artifacts_path:
default: "dist/"
description: "Chemin des artefacts produits"
---
build:
stage: $[[ inputs.stage ]]
image: $[[ inputs.image ]]
script:
- $[[ inputs.build_command ]]
artifacts:
paths:
- $[[ inputs.artifacts_path ]]
expire_in: 30 days

Le séparateur --- sépare la déclaration des inputs du contenu YAML du composant.

TypeDescriptionExemple de valeur
stringValeur texte (type par défaut)"node:20"
numberValeur numérique30
booleantrue / falsetrue
arrayListe de valeurs["docker", "linux"]
templates/test.yml
spec:
inputs:
image:
description: "Image Docker pour les tests"
type: string
with_coverage:
default: false
description: "Activer le rapport de couverture"
type: boolean
timeout_minutes:
default: 10
description: "Timeout du job en minutes"
type: number
---
test:
image: $[[ inputs.image ]]
script:
- npm ci
- npm test
timeout: $[[ inputs.timeout_minutes ]] minutes
rules:
- if: $[[ inputs.with_coverage ]]
variables:
COVERAGE_FLAG: "--coverage"
  1. Allez dans Settings > General > Visibility, project features, permissions

  2. Activez CI/CD Catalog resource

  3. Ajoutez un README.md décrivant vos composants (c’est la page affichée dans le catalog)

  4. Créez un tag Git pour la première version :

    Fenêtre de terminal
    git tag -a v1.0.0 -m "Premier release du composant build Node.js"
    git push origin v1.0.0

Ajoutez un pipeline qui publie automatiquement le composant quand vous créez un tag :

.gitlab-ci.yml
stages:
- test
- release
# Tester le composant avec lui-même (dogfooding)
test:component:
stage: test
trigger:
include:
- component: $CI_SERVER_FQDN/$CI_PROJECT_PATH/build@$CI_COMMIT_SHA
inputs:
image: node:20
strategy: depend
# Publier dans le catalog via une release GitLab
create-release:
stage: release
image: registry.gitlab.com/gitlab-org/release-cli:latest
script:
- echo "Publishing $CI_COMMIT_TAG to catalog"
release:
tag_name: $CI_COMMIT_TAG
description: "Release $CI_COMMIT_TAG"
rules:
- if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/

Si vous avez déjà des templates partagés via include: project:, la migration est progressive :

  1. Créez le projet component avec la structure templates/

  2. Ajoutez spec:inputs pour formaliser les paramètres implicites

    # Avant (template classique) — paramétrage via variables implicites
    .build:
    image: $BUILD_IMAGE
    script:
    - $BUILD_COMMAND
    # Après (component) — paramétrage explicite et documenté
    spec:
    inputs:
    image:
    description: "Image Docker pour le build"
    build_command:
    default: "npm run build"
    ---
    build:
    image: $[[ inputs.image ]]
    script:
    - $[[ inputs.build_command ]]
  3. Publiez v1.0.0 dans le catalog

  4. Migrez les consommateurs un par un :

    # Avant
    include:
    - project: 'devops/ci-templates'
    file: '/templates/build.yml'
    ref: 'main'
    # Après
    include:
    - component: $CI_SERVER_FQDN/devops/ci-components/build@1.0.0
    inputs:
    image: node:20
  5. Conservez l’ancien template temporairement pour les projets non migrés

PratiqueRecommandation
Un projet par domaineci-components-nodejs, ci-components-docker, ci-components-terraform
Un template par responsabilitébuild.yml, test.yml, lint.yml — pas un monolithe
Groupe dédiédevops/ci-components/ pour centraliser
README soignéC’est la vitrine dans le catalog
ChangementVersionExemple
Fix sans changement d’interfacePatch 1.0.1Corriger un bug dans le script
Nouvel input optionnelMinor 1.1.0Ajouter with_coverage: false
Suppression d’un input, changement de comportementMajor 2.0.0Renommer build_cmd en build_command
  • N’exposez pas de secrets dans les templates — les secrets doivent rester dans les variables CI/CD du projet consommateur
  • Validez les inputs : utilisez les types (number, boolean) pour empêcher les injections
  • Revue de code : un composant partagé à 50 projets mérite la même rigueur qu’une bibliothèque partagée
SymptômeCause probableSolution
component not foundMauvais chemin ou le projet n’est pas un catalog resourceVérifier le chemin complet <fqdn>/<namespace>/<project>/<template>@<tag> et que le catalog est activé
input 'xxx' is requiredUn input sans default n’est pas fourniConsulter la page du composant dans le catalog pour voir les inputs obligatoires
invalid input typeType attendu number mais valeur string fournieVérifier les types déclarés dans spec:inputs
Le composant ne s’affiche pas dans le catalogPas de tag Git publiéCréer un tag vX.Y.Z et vérifier les permissions du projet
Changement non visible après mise à jourVersion épingléeIncrémenter le tag et mettre à jour @version chez les consommateurs
Ne sait pas quels jobs le composant créeDocumentation insuffisanteUtiliser Pipeline editor > Visualize ou CI Lint pour voir la config résolue
  • Le CI/CD Catalog est le point d’entrée : cherchez-y des composants avant d’écrire du YAML — Explore > CI/CD Catalog
  • include:component remplace include: project: pour le partage cross-équipes — interface typée, versionnée, documentée
  • Utilisez $CI_SERVER_FQDN au lieu du nom de domaine en dur pour rendre vos pipelines portables
  • Chaque composant déclare son interface via spec:inputs — la syntaxe $[[ inputs.xxx ]] est évaluée avant la création du pipeline
  • Toujours épingler une version sémantique (@1.0.0) — jamais @main
  • Un composant crée des jobs complets dans votre pipeline — utilisez Pipeline editor pour visualiser le résultat
  • Les include classiques restent adaptés pour le partage intra-équipe de fichiers YAML simples
  • La migration include → components est progressive : les deux approches coexistent

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