Les pipelines CI/CD dans GitLab
Introduction
À ce stade de votre lecture, vous avez suffisamment de connaissances sur Git et les fonctionnalités de gestion et de suivi de projets dans GitLab pour utiliser ces outils dans les phases initiales du cycle de vie du développement logiciel.
Dans ce chapitre, nous allons entrer dans le vif du sujet et voir comment fonctionnent les pipelines CI/CD. Nous commencerons par une partie théorique où nous verrons en quoi consistent les pipelines, quels sont leurs composants et comment elles mettent en œuvre l’intégration continue (CI) et la livraison ou le déploiement continus (CD).
Après avoir terminé ce volet théorique, nous apprendrons à écrire des fichiers de configuration de pipelines en utilisant des structures de données YAML et des mots-clés qui nous permettront de définir des étapes (stages) et des jobs.
Pour illustrer notre propos, nous commencerons par configurer un pipeline simple de type Hello World! et nous poursuivrons avec d’autres exemples plus complexes que nous construirons progressivement pour bien comprendre le rôle de chaque composant.
En plus de découvrir les différentes façons dont GitLab permet de déclencher des pipelines, nous verrons aussi en quoi il peut être pertinent de contrôler la fréquence de leur exécution.
À travers les exemples que nous...
Définition de la notion de pipeline
Un pipeline CI/CD dans GitLab est une série d’étapes définissant une ou plusieurs tâches (jobs) qui s’exécutent sur les fichiers du projet chaque fois qu’une modification est effectuée dans le dépôt Git d’un projet. Ces étapes peuvent inclure la compilation du code, l’exécution de tests, le déploiement de l’application, etc.
En d’autres termes, l’exécution d’un pipeline est déclenchée par un commit, mais il est également possible de configurer d’autres modes de déclenchement que nous verrons en détail plus bas.
Les actions effectuées par un pipeline sont spécifiées dans un fichier spécial nommé .gitlab-ci.yml qui doit être créé à la racine du dépôt du projet. Ce fichier utilise une syntaxe YAML pour définir les différentes étapes et jobs du pipeline ainsi que leur plateforme d’exécution ou leur environnement de déploiement.

Le terme « pipeline » est parfois utilisé pour désigner l’ensemble des tâches qui seront exécutées sur le code source d’un projet, mais, de manière générale, il désigne une seule instance ou exécution de ce pipeline sur une version particulière des fichiers d’un dépôt.
Une autre façon de voir un pipeline est de dire qu’il s’agit d’un plan ou d’une recette pour exécuter une série d’étapes qui seront appliquées aux fichiers d’un projet. Dans le contexte qui nous occupe, il s’agit des fichiers inclus dans un dépôt Git hébergés sur GitLab : code source, configuration, documentation, etc. Bien entendu, les fichiers de code source sont les plus couramment ciblés par les étapes d’un pipeline.
1. La notion d’étape d’un pipeline
Le pipeline de chaque projet se compose d’une ou plusieurs étapes que nous pouvons définir comme un ensemble de jobs partageant un thème similaire, tel que la construction (build), le test ou le déploiement du code source.
Comme GitLab ne traduit pas « job »...
Les deux parties d’un pipeline
Bien que chaque projet GitLab ne définisse qu’un seul pipeline, la plupart du temps elles sont composées de deux parties, comme le souligne l’expression « pipeline CI/CD ».
La première partie relève de l’intégration continue (CI), tandis que la deuxième est liée à la livraison ou le déploiement continus (CD). Voyons ce qui distingue ces deux aspects d’un pipeline.
1. La partie intégration continue (CI)
Nous pouvons décrire la partie CI d’un pipeline en nous demandant si elle répond aux questions suivantes : « Le code est-il bon ? », « Est-il correctement écrit ? », « Est-il de qualité ? ». Car cette partie consiste généralement en une combinaison de tests automatisés, d’analyses de sécurité, de vérifications de conformité des licences ou de contrôles de la qualité du code source.
La partie CI s’assure que toutes les modifications de fichiers que vous effectuez s’intègrent bien à la base de code (codebase) stable de votre projet. En d’autres termes, lorsque vous fusionnez une branche de fonctionnalité ou de correction de bugs dans la branche par défaut, le pipeline vous permet de voir si de nouveaux problèmes apparaissent.
Comme nous l’avons déjà mentionné au chapitre Comprendre le cycle de développement logiciel, l’idée derrière le CI est de repérer les bugs ou les vulnérabilités le plus tôt possible pour les corriger avant fusionner avec la branche principale.
a. Le shift left et la collaboration
Les étapes CI d’un pipeline permettent de mettre en application la notion de « shift left » qui vise à détecter les problèmes le plus tôt possible dans le cycle de développement logiciel, alors qu’ils sont encore faciles et peu coûteux à résoudre.
Les changements se font de manière itérative, en petits incréments comme le recommandes les approches agiles et le DevOps.
Cette partie d’intégration continue favorise également...
Comprendre le fichier .gitlab-ci.yml
Comme nous l’avons mentionné plus haut, la configuration d’un pipeline CI/CD se fait dans un fichier nommé .gitlab-ci.yml qui se trouve à la racine du dépôt d’un projet. Ce nom est spécifique à GitLab et son utilisation est requise pour que les pipelines soient reconnus et exécutés. Comme l’extension le suggère, il s’agit d’un fichier rédigé en YAML, un format de sérialisation de données simple et facile à lire.
Le .gitlab-ci.yml est un fichier de configuration qui détermine les tâches qui seront effectuées dans le pipeline de ce projet. Il contient les instructions nécessaires pour automatiser le processus de build, les tests et le déploiement d’une application. C’est dans ce fichier que sont déclarés les étapes, les jobs et les commandes dont nous avons déjà parlé.
Chaque fichier .gitlab-ci.yml utilise un langage spécifique qui se compose principalement de mots-clés avec des valeurs correspondantes. Certains d’entre eux définissent les étapes et les jobs, alors que d’autres sont utilisés pour configurer différentes tâches dans le pipeline. Il existe d’autres mots-clés qui permettent de définir des variables, de spécifier des images Docker pour exécuter les jobs ou d’autres actions comme l’ajout d’une condition de déclenchement ou la création d’artéfacts.
Le langage utilisé pour le fichier de configuration comprend environ 30 mots-clés qui sont largement suffisants pour faire presque toutes les tâches du SDLC. Il n’est pas nécessaire de mémoriser toutes les options disponibles, mais plutôt d’avoir une vue d’ensemble de ce que ces mots-clés permettent de faire dans les pipelines.
En général, vous utiliserez environ une dizaine de ces mots-clés. Au besoin, vous pouvez consulter la documentation...
Exemple de pipeline Hello world
Avant de mettre en pratique la syntaxe YAML en créant notre premier fichier .gitlab-ci.yml, commençons par exécuter le pipeline de test Hello world proposé par GitLab pour nous familiariser avec le processus. Vous pouvez réutiliser le projet avec lequel nous avons travaillé dans le chapitre Organiser et suivre son travail dans GitLab ou en créer un nouveau.
Pour accéder au pipeline de test à partir de la page d’accueil d’un projet, appuyez sur Compilation dans le panneau de gauche, puis sur Pipelines.

Dans la vue centrale, cliquez sur le bouton Essayer le modèle de test de l’exemple nommé « Hello world » avec GtiLab CI.

L’éditeur de pipeline va s’ouvrir sur un fichier .gitlab-ci.yml.
1. Présentation du fichier .gitlab-ci.yml
Avant de déclencher le pipeline en appuyant sur Valider les modifications, prenons un instant pour voir ce qui est défini dans ce fichier .gitlab-ci.yml en l’examinant plus attentivement.

D’abord, nous pouvons constater que la syntaxe de tout fichier .gitlab.yml est vérifiée automatiquement par GitLab pour s’assurer que votre YAML est correct et que les mots-clés sont bien utilisés.

Après les commentaires, nous voyons que les étapes sont déclarées avec le mot-clé stages (ligne 19) et chacune d’entre elle constitue une valeur de la séquence ou tableau qui suit (build, test, deploy). Le nom des étapes n’a pas d’importance, mais il est préférable de conserver une nomenclature universelle comme celle-ci.

Les étapes indiquent un ordre précis d’exécution à respecter que vous pouvez voir en mode graphique en appuyant sur l’onglet Visualiser.

Le bloc suivant définit le premier job (build-job) en précisant :
-
l’étape à laquelle le job doit s’exécuter (valeur de la clé stage à la ligne 25) ;
-
l’action que doit effectuer le GitLab Runner : exécuter un script (commandes).
Comme c’était le cas pour les « stages », le nom des jobs n’a aucune importance. Il convient toutefois d’adopter une nomenclature simple qui exprime bien...
Créer un premier fichier de configuration de pipeline
Maintenant que nous connaissons les principales notions des pipelines dans GitLab et que nous avons en avons vu un en action avec l’exemple Hello world, nous sommes prêts à créer notre premier fichier de configuration.
Dans les sections qui suivent, nous allons construire un fichier .gitlab-ci.yml pas à pas en expliquant les mots-clés à mesure que nous les utiliserons.
1. Indications sur l’utilisation des composants
Avant de commencer, il est important de bien comprendre comment s’emboîtent les étapes, les jobs et les commandes. Voici quelques indications sur l’utilisation de ces composants dans GitLab :
-
Chaque pipeline se compose d’au moins une étape (stage). Une étape représente une catégorie de tâches que le pipeline doit effectuer.
-
Chaque étape contient au moins un job et ce dernier représente une tâche unique que le pipeline doit effectuer.
-
Chaque job contient au moins une commande (ou script). Une commande est l’équivalent de ce qu’une personne taperait dans un shell pour effectuer une tâche de pipeline.
Comme nous l’avons déjà mentionné, la plupart des pipelines contiennent au moins trois étapes (Build, Test et Deploy) et le type de job au sein de chacune d’entre elles est souvent assez similaire d’un projet à l’autre.
Bien que ces étapes et jobs de base soient assez courants, la plupart des projets vont avoir recours à une nomenclature spécifique aux besoins du produit à développer.
Créer un nouveau projet pour tester le pipeline
Pour pratiquer l’écriture d’un fichier .gitlab-ci.yml et tester les pipelines, nous vous invitons à créer un nouveau projet dans GitLab. Le nôtre se nomme « Exemples Bash », car nous allons nous exercer avec des commandes simples en Bash.
Après avoir créé votre nouveau projet, ouvrez le menu Compilation dans le panneau latéral gauche et appuyez sur Éditeur de pipeline. Cliquez ensuite sur le bouton Configurer le pipeline dans la vue centrale.

Supprimez le contenu du fichier qui donne un exemple de création du fichier de configuration.
Pour les exemples...
Contrôler l’exécution des pipelines
GitLab propose un certain nombre de mots-clés et d’instructions permettant de contrôler l’exécution des pipelines. Il s’agit généralement de conditions et leur utilisation peut optimiser les processus CI/CD selon les besoins spécifiques d’un projet. Les sections qui suivent présentent les mots-clés de contrôle d’exécution les plus utilisés.
1. Empêcher l’exécution d’un pipeline
Même s’il est toujours préférable d’utiliser les pipelines CI/CD de GitLab pour tirer profit de tous les jobs définis dans le fichier de configuration, il y a des moments où il est préférable de ne pas exécuter un pipeline. Voici quelques exemples :
-
Les équipes utilisant la version SaaS de GitLab (c’est-à-dire l’instance hébergée sur gitlab.com) disposent d’un nombre limité de minutes de calcul par mois pour exécuter des pipelines. S’ils manquent de minutes, ils peuvent choisir d’exécuter des pipelines uniquement sur les commits les plus importants.
-
Lorsque vous vous apprêtez à effectuer plusieurs petits commits sur la même branche et que ces derniers présentent un faible risque, vous pouvez attendre qu’ils soient tous complétés avant d’exécuter...
Autres modes de déclenchement des pipelines
Comme nous le savons maintenant, la manière la plus courante d’exécuter un pipeline consiste à faire un commit à la suite d’une modification sur une branche. À chaque fois que vous le faites, GitLab exécute automatiquement un pipeline sur la version des fichiers de votre projet qui existe dans ce commit.
Il existe d’autres modes de déclenchement des pipelines que nous allons présenter dans les sections suivantes.
1. L’exécution manuelle
GitLab vous permet d’exécuter manuellement un pipeline sur n’importe quelle branche Git, même si ce n’était pas la dernière branche sur laquelle vous avez validé des modifications.
Pour déclencher un pipeline manuellement, rendez-vous sur la page d’accueil du projet et ouvrez le menu Compilation dans le panneau latéral. Dans la vue centrale, appuyez sur le bouton Nouveau pipeline en haut à droite (en anglais, ce bouton se nomme Run pipeline, ce qui est plus précis que « nouveau pipeline »).

Sélectionnez la branche sur laquelle vous souhaitez exécuter le pipeline et appuyez sur Nouveau pipeline. L’utilisation de variables sera présentée dans le chapitre Aller plus loin avec les pipelines CI/CD.

Vous verrez ensuite votre pipeline en cours d’exécution :

2. L’exécution planifiée
GitLab offre la possibilité de planifier l’exécution d’un pipeline sur n’importe quelle branche Git selon des intervalles spécifiques. Cette option peut être utile, notamment pour l’automatisation des tâches récurrentes, l’exécution de tâches critiques sur une base régulière ou simplement de manière proactive pour identifier...
Conclusion
Dans ce chapitre, nous avons commencé par une partie théorique qui nous a permis de passer en revue les principaux concepts liés aux pipelines dans GitLab. Après avoir présenté les étapes, les jobs et les modes de déclenchement, nous avons vu que les pipelines se divisent en deux parties : intégration continue (CI) et livraison ou déploiement continus (CD).
Nous avons continué notre parcours en découvrant les principales structures de données YAML pour rédiger un fichier de configuration .gitlab-ci.yml. Ces nouvelles connaissances nous ont permis de mettre en pratique plusieurs mots-clés que nous avons testés avec des exemple Bash.
Une grande partie du reste de cet ouvrage est consacrée à expliquer d’autres types de tâches que vous pouvez faire avec les pipelines ainsi que la syntaxe et les mots-clés à utiliser. Le chapitre Travailler avec les GitLab Runners porte sur le composant qui exécute les commandes en arrière-plan, c’est-à-dire les GitLab Runners. Nous allons voir de plus près comment ceux-ci fonctionnent en nous intéressant notamment à la notion d’exécuteur.