Aller au contenu
CI/CD & Automatisation medium

Écrire un fichier .gitlab-ci.yml

12 min de lecture

logo gitlab

Vous connaissez maintenant les concepts fondamentaux : pipeline, stages, jobs, runners. Il est temps de passer à la pratique ! Le fichier .gitlab-ci.yml décrit ce que GitLab doit automatiser. Ce guide vous apprend à le structurer méthodiquement : comment découper votre workflow en stages, définir des jobs, et écrire les scripts qui seront exécutés.

À la fin de ce module, vous saurez :

  • Structurer un fichier .gitlab-ci.yml : la hiérarchie stages → jobs → script
  • Définir des stages : organiser les grandes étapes de votre pipeline
  • Créer des jobs : configurer les tâches avec les bonnes propriétés
  • Écrire des scripts : les commandes exécutées par chaque job
  • Spécifier une image Docker : choisir l’environnement d’exécution
  • Utiliser les variables : configurer vos jobs dynamiquement
  • Valider votre fichier : éviter les erreurs de syntaxe

Avant de continuer, assurez-vous de maîtriser :

Avant d’écrire du YAML, posez-vous ces questions :

  1. Quelles sont les grandes étapes de mon workflow ? → Ce seront vos stages
  2. Quelles tâches dois-je accomplir à chaque étape ? → Ce seront vos jobs
  3. Quelles commandes chaque tâche doit-elle exécuter ? → Ce sera le script

Structure d'un fichier .gitlab-ci.yml : stages contiennent des jobs qui contiennent des scripts

Exemple de raisonnement pour un projet web :

QuestionRéponseÉlément YAML
Grandes étapes ?Compiler, tester, déployerstages: [build, test, deploy]
Tâches du test ?Tests unitaires, linting2 jobs dans le stage test
Commandes du lint ?npm run lintscript: [npm run lint]

Un fichier .gitlab-ci.yml valide contient au minimum :

# 1. Déclarer les stages (optionnel mais recommandé)
stages:
- build
- test
# 2. Définir au moins un job avec un script
mon-job:
stage: build
script:
- echo "Hello GitLab CI!"

Le fichier doit être :

  • Nommé exactement .gitlab-ci.yml (avec le point)
  • Placé à la racine du repository
  • Encodé en UTF-8

Les stages représentent les grandes étapes de votre pipeline. Ils s’exécutent dans l’ordre déclaré.

stages:
- build # Étape 1 : compiler le code
- test # Étape 2 : exécuter les tests
- deploy # Étape 3 : déployer l'application

Règles des stages :

RègleExplication
Ordre séquentielbuild se termine avant que test commence
Échec bloquantSi build échoue, test et deploy ne s’exécutent pas
Stages par défautSans déclaration, GitLab utilise : build, test, deploy

Créez un stage quand vous avez une dépendance logique :

  • test dépend de build → 2 stages séparés
  • deploy-staging avant deploy-prod → 2 stages séparés
  • ❌ Tests unitaires et tests d’intégration → même stage (pas de dépendance)

Un job est une tâche qui appartient à un stage. C’est ici que vous décrivez ce qui doit être fait.

# Syntaxe d'un job
nom-du-job: # Nom libre, visible dans l'interface
stage: test # À quel stage appartient ce job
script: # Commandes à exécuter (OBLIGATOIRE)
- commande1
- commande2
PropriétéObligatoireDescription
script✅ OuiListe des commandes à exécuter
stageNonStage d’appartenance (défaut: test)
imageNonImage Docker pour l’environnement
variablesNonVariables d’environnement du job
artifactsNonFichiers à conserver après le job
cacheNonFichiers à réutiliser entre pipelines
rulesNonConditions d’exécution
needsNonDépendances explicites (ignore l’ordre des stages)

Les jobs d’un même stage s’exécutent en parallèle :

stages:
- test
test-unitaires:
stage: test
script:
- npm run test:unit
test-integration:
stage: test
script:
- npm run test:integration
lint:
stage: test
script:
- npm run lint

Ces 3 jobs démarrent simultanément car ils sont tous dans le stage test.

Le script contient les commandes shell exécutées par le job.

build:
stage: build
script:
- echo "Début du build"
- npm ci
- npm run build
- echo "Build terminé"
RègleExemple
Chaque ligne = une commande- npm install
Exécution séquentielleLigne 1, puis ligne 2, puis ligne 3…
Échec = arrêtSi une commande retourne un code ≠ 0, le job échoue
Shell par défaut/bin/sh (ou celui de l’image Docker)

Pour des commandes longues, utilisez le pipe YAML | :

script:
- |
echo "Première ligne"
echo "Deuxième ligne"
if [ -f "config.json" ]; then
echo "Config trouvée"
fi

Utilisez ces sections pour factoriser du code :

# S'exécute AVANT le script de chaque job
default:
before_script:
- echo "Préparation..."
- npm ci
test:
script:
- npm test
after_script:
- echo "Nettoyage..." # S'exécute même si le job échoue

Par défaut, les jobs s’exécutent dans une image Docker Ruby. Spécifiez une image adaptée :

build:
image: node:18-alpine # Node.js 18 sur Alpine Linux
script:
- node --version
- npm ci
- npm run build

Images recommandées :

LangageImage légèreImage complète
Node.jsnode:18-alpinenode:18
Pythonpython:3.11-slimpython:3.11
Gogolang:1.21-alpinegolang:1.21
Javaeclipse-temurin:17-alpineeclipse-temurin:17
Génériquealpine:3.19ubuntu:22.04

Les variables permettent de configurer vos jobs sans modifier le script.

variables:
NODE_ENV: production
DEPLOY_TARGET: staging
build:
script:
- echo "Environment: $NODE_ENV"
- echo "Target: $DEPLOY_TARGET"
build:
variables:
NODE_ENV: development
script:
- npm run build
deploy:
variables:
NODE_ENV: production
script:
- npm run deploy

GitLab injecte automatiquement des variables utiles :

VariableContenu
$CI_COMMIT_BRANCHNom de la branche
$CI_COMMIT_SHORT_SHAHash court du commit
$CI_PROJECT_NAMENom du projet
$CI_PIPELINE_SOURCEDéclencheur (push, merge_request, etc.)
$CI_JOB_NAMENom du job en cours
build:
script:
- echo "Building $CI_PROJECT_NAME on branch $CI_COMMIT_BRANCH"
- echo "Commit: $CI_COMMIT_SHORT_SHA"

Voici un pipeline réaliste pour un projet Node.js :

# Déclaration des stages dans l'ordre d'exécution
stages:
- build
- test
- deploy
# Variables globales disponibles dans tous les jobs
variables:
NODE_ENV: production
# --- STAGE BUILD ---
build:
stage: build
image: node:18-alpine
script:
- echo "📦 Installation des dépendances..."
- npm ci
- echo "🔨 Compilation..."
- npm run build
artifacts:
paths:
- dist/ # Conserve le dossier dist/ pour les jobs suivants
expire_in: 1 hour # Supprimé après 1 heure
# --- STAGE TEST ---
# Ces 2 jobs s'exécutent EN PARALLÈLE
test-unit:
stage: test
image: node:18-alpine
script:
- npm ci
- npm run test:unit
test-lint:
stage: test
image: node:18-alpine
script:
- npm ci
- npm run lint
# --- STAGE DEPLOY ---
deploy:
stage: deploy
image: alpine:3.19
script:
- echo "🚀 Déploiement vers $DEPLOY_TARGET..."
- echo "Fichiers à déployer:" && ls dist/
rules:
- if: $CI_COMMIT_BRANCH == "main" # Seulement sur main
when: manual # Clic requis pour démarrer

Avant de pusher, validez votre fichier :

  1. Dans GitLab : Build > Pipeline editor > Validate
  2. En local avec l’outil gitlab-ci-lint :
    Fenêtre de terminal
    npm install -g gitlab-ci-lint
    gitlab-ci-lint .gitlab-ci.yml
NiveauÉlémentRôle
1stagesDéfinit l’ordre des grandes étapes
2JobsTâches à accomplir (nommées librement)
3scriptCommandes shell à exécuter

Construction logique :

  1. Listez vos étapes → stages
  2. Pour chaque étape, listez les tâches → jobs
  3. Pour chaque tâche, listez les commandes → script

Testez vos connaissances sur la structure des fichiers .gitlab-ci.yml.

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.