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