Maîtriser GitLab CI/CD: Introduction
L'Intégration et le Déploiement Continus (CI/CD)
Dans le cycle de développement moderne, l'efficacité repose sur deux piliers indissociables : le CI (Continuous Integration) et le CD (Continuous Deployment). GitLab CI automatise la gestion et les tests de vos projets à chaque envoi de code, tandis que le CD prend le relais pour placer automatiquement ces changements validés en production.
Imaginez une chaîne de montage automobile ultra-moderne. Le CI est le scanner laser qui vérifie chaque soudure en temps réel. Le CD est le bras robotisé qui place la voiture finie sur le camion de livraison dès qu'elle est validée. Grâce à ce système, vous détectez les erreurs immédiatement et déployez sur la branche main en toute sérénité.
Le fichier .gitlab-ci.yml : Le Chef d'Orchestre
Qu'est-ce que ce fichier et pourquoi est-il vital ?
Le fichier .gitlab-ci.yml est le cerveau de votre automatisation. C'est un fichier texte au format YAML que vous devez impérativement placer à la racine de votre dépôt. Sans lui, GitLab n'est qu'un simple espace de stockage, avec lui, il devient une usine logicielle intelligente.
C'est une recette de cuisine technique : dès que vous effectuez un push, GitLab lit ce fichier et délègue les instructions aux GitLab Runners. Il permet de standardiser vos méthodes de travail : peu importe l'ordinateur du développeur, le code sera toujours testé et déployé de la même manière.
"Visualisation du flux de travail CI avec GitLab"
Anatomie du pipeline : Stages et Jobs
Le fonctionnement de votre pipeline CI/CD repose sur une hiérarchie stricte définie dans le fichier :
- Les Stages (Étapes) : Ils définissent la chronologie (ex: d'abord on build, ensuite on teste). Un stage ne démarre que si le précédent est réussi.
- Les Jobs (Tâches) : Ce sont les scripts réels (ex: npm test). Plusieurs jobs peuvent tourner en parallèle au sein d'un même stage pour gagner du temps.
Implémentation pratique du pipeline
Voici une configuration YAML complète pour une application Node.js :
stages:
- build
- test
- deploy
job_compilation:
stage: build
image: node:22-alpine
script:
- npm ci
- npm run build
artifacts:
paths:
- dist/
job_tests_unitaires:
stage: test
image: node:22-alpine
script:
- npm test
job_deploiement_prod:
stage: deploy
image: alpine:latest
script:
- echo "Déploiement sur le serveur de production..."
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
Le conseil du Pro
Le format YAML est extrêmement sensible aux indentations. Utilisez l'outil CI Lint intégré à GitLab (dans le menu CI/CD > Editor) pour valider votre syntaxe avant de commiter.
Les Stages : La chronologie de votre projet
La directive stages est la colonne vertébrale de votre automatisation. Elle définit l'ordre chronologique dans lequel vos tâches vont s'exécuter. Dans votre exemple, nous avons trois étapes clés : build (construction), test et deploy (déploiement).
Imaginez une chaîne de montage automobile. Les stages garantissent que l'on ne peint pas la voiture (déploiement) avant d'avoir vérifié si le moteur fonctionne (test) et on ne teste pas le moteur avant de l'avoir assemblé (build). Si une étape échoue, GitLab arrête tout immédiatement pour protéger votre production.
Le Job : L'ouvrier spécialisé
Un job est une unité de travail concrète. Dans votre code, job_compilation ou job_tests_unitaires sont des jobs. Chaque job doit être rattaché à un stage.
- image : C'est l'environnement de travail (le conteneur Docker). Utiliser node:22-alpine garantit que votre code s'exécute avec la version exacte de Node.js dont il a besoin.
- script : C'est le cœur de l'action. Ce sont les commandes terminal que le Runner va taper à votre place. La commande npm ci installe les dépendances de manière rapide et ultra-fiable.
Les Artifacts : Transmettre les résultats
Par défaut, chaque job démarre dans un environnement totalement vide. Lorsqu'un job de compilation crée un dossier dist/, ce dossier disparaît dès que le job est fini.
Les artifacts permettent de "sauver" des fichiers pour les transmettre aux jobs suivants. Ici, le dossier de compilation est conservé pour que le job de déploiement puisse l'utiliser plus tard.
Les Rules : L'intelligence conditionnelle
Le mot-clé rules apporte une intelligence de décision à votre pipeline. Vous ne voulez pas déployer sur votre serveur de production à chaque fois qu'un développeur fait un test sur une petite branche isolée.
Dans votre code, la règle utilise des Variables CI/CD prédéfinies :
if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
Cela signifie : "N'exécute ce job de déploiement QUE si le code est poussé sur la branche par défaut (généralement main)". C'est votre sécurité anti-erreur humaine.
Information
Ne vous inquiétez pas si certains concepts vous paraissent encore flous : ce n'est qu'une première introduction. Nous reviendrons sur chacun de ces points bien plus en profondeur dans les chapitres suivants.
Exécution du pipeline
Voici ce que verra un développeur dans sa console GitLab lors du lancement de ce pipeline après un push sur la branche principale.
Sortie terminal - Statut global :
Pipeline #458712 started for branch 'main'
[Stage: build]
- job_compilation: RUNNING...
$ npm ci
$ npm run build
Uploading artifacts... dist/ (2.4MB)
Job succeeded
[Stage: test]
- job_tests_unitaires: RUNNING...
$ npm test
7 runs, 15 assertions, 0 failures
Job succeeded
[Stage: deploy]
- job_deploiement_prod: RUNNING...
$ echo "Déploiement sur le serveur de production..."
Job succeeded
Pipeline succeeded in 2m 54s
Conclusion
Le couple CI/CD et son fichier .gitlab-ci.yml transforment radicalement votre quotidien de développeur. Vous passez d'un mode manuel stressant à un flux automatisé, fiable et rapide.
Cependant, pour que votre pipeline puisse interagir avec vos serveurs en toute sécurité, il ne faut jamais écrire vos mots de passe en clair dans ce fichier. Dans le prochain chapitre, nous allons apprendre à utiliser les Variables CI/CD pour protéger vos secrets.
Espace commentaire
Écrire un commentaire
Rejoignez la discussion
Vous devez être connecté pour poster un message.
28 commentaires
Assure-toi que tu n'as pas de faute de frappe sur le nom de la variable. Vérifie aussi que tu es bien sur une version récente de GitLab, les variables
CI_COMMIT_BRANCHsont standard maintenant.J'ai une erreur sur le
if: $CI_COMMIT_BRANCH. Il ne reconnaît pas la variable.Vérifie si ton runner doit télécharger l'image Docker à chaque fois. Utilise un cache local ou garde une image de base plus légère.
Le pipeline est super lent à démarrer. Une astuce ?
Non, les artifacts c'est pour les fichiers. Pour les variables, utilise les
dotenvreports ou les variables globales du projet.Est-ce qu'on peut passer des variables d'un job à l'autre via les artifacts justement ?
Merci pour l'explication sur les
artifacts, ça m'a sauvé la vie.Ça se règle au niveau du
Runner, pas dans le fichier YAML. Regarde la configurationconcurrentdans le fichierconfig.tomldu runner.Est-ce que je peux limiter le nombre de jobs qui tournent en parallèle ?
Vérifie que tes jobs font bien référence à des stages définis dans la liste globale
stages:au début du fichier.J'ai un warning sur le
stage. Il me dit que le nom n'est pas reconnu.Oui, mais c'est une très mauvaise pratique. Si tu insistes, ajoute
allow_failure: truedans ton job de test.Sympa le tuto. Mais si mon job de test plante, je veux quand même que le déploiement se fasse. C'est possible ?
Ajoute simplement une commande
before_scriptdans ton job pour installer les paquets nécessaires :Comment je fais pour installer des dépendances système comme
gitoucurldans le containeralpine?Utilise le
CI Lintdans le menu CI/CD de GitLab comme indiqué dans l'article. C'est radical pour trouver les erreurs de syntaxe invisibles.J'ai une erreur
yaml invalid. Pourtant j'ai copié-collé l'exemple. Help.Oui, dans l'interface GitLab, va dans
Build > Jobs, clique sur le job en cours. Tu verras le flux défiler.Y'a un moyen de voir les logs en temps réel ?
C'est probablement un problème de DNS sur ton runner ou un accès restreint au registre Docker. Teste un
docker pull node:22-alpinedirectement sur la machine qui héberge le runner pour voir si ça sort.Même problème ici. On dirait qu'il n'arrive pas à pull l'image Docker.
Le runner est bloqué sur le stage
build. Il afficheimage: node:22-alpinemais ça tourne dans le vide.Faut modifier la condition dans
rules. Remplace$CI_DEFAULT_BRANCHpar le nom de ta branche cible ou utilise une regex :Comment je peux forcer le déploiement sur une branche différente de
mainpour faire des tests ?Vérifie l'indentation dans ton
.gitlab-ci.yml. Si le blocartifactsest mal aligné sousjob_compilation, GitLab l'ignore purement et simplement. C'est du YAML, la moindre espace compte.