GraphQL expliqué simplement en 5 minutes

Logo de GraphQL

2012.

Les statistiques du web mobile commencent à exploser.

Les entreprises de la tech flairent le filon des applications web responsives design accessibles via les navigateurs web.

Parmi elles, Facebook.

Sa première web app pour iOS est créée la même année. Sauf que les experts de l’expérience utilisateur du réseau social remarquent vite un gros problème : l’interface-utilisateur n’est pas fluide.

Les ingénieurs de la firme se creusent les méninges… et décident de créer une application mobile native pour iOS.

Et là encore, nouveau problème, leurs APIs REST renvoient trop d’informations et ne sont pas adaptées aux spécifications du développement mobile.

Les APIs REST consomment beaucoup trop de bande passante. Ralentissent la version mobile du réseau social. Et surtout, surchargent les serveurs en back-office pour rien.

De là, vient l’idée à Lee Byron et à deux de ses collègues de créer un nouveau langage de requêtes : GraphQL.

Publié pour la première fois en 2012, il devient open-source en 2015, et depuis, il ne cesse de séduire les développeurs web et mobiles.

Et aujourd’hui, on va parler de GraphQL, quels avantages vous pouvez en tirer et comment il fonctionne.

Let’s go.

Qu’est-ce que GraphQL ?

Pour comprendre GraphQL, vous devez savoir ce qu’est une API (si si, c’est important). Une API, ou “Application Programming interface”, est un ensemble de protocoles qui permettent à deux composants logiciels de communiquer.

Elles sont énormément utilisées dans les architectures client-serveur pour permettre à l’utilisateur de récupérer des données depuis une base de données.

C’est au concepteur-développeur de l’application de choisir et de concevoir l’interface de programmation qui sera utilisée.

GraphQL, ou Graph Query Language, est un langage de requêtes et un environnement d’exécution côté serveur pour API.

Sa particularité ? C’est la requête du client qui définit la structure des données qu’il veut.

Particularité qui a déjà séduit plusieurs entreprises, dont :

  • PayPal ;
  • Coursera ;
  • Dailymotion ;
  • GitHub ;
  • Meta.

Vous en trouverez plus en vous rendant sur le site de la fondation GraphQL (voici une partie de la liste).

Entreprises utilisant les API GraphQL

Et cette nuance est importante. Car les autres APIs les plus utilisées sont les APIs REST (Representational State Transfer).

Et elles vous renvoient des informations prédéfinies par le développeur qui a conçu l’architecture serveur. Même si elles ne correspondent pas aux besoins de l’utilisateur.

Parfois, elles envoient trop de données, et côté client, on ne sélectionne que celles qui nous intéressent. On parle d’over-fetching.

Parfois, à l’inverse, elles n’envoient pas toutes les informations, ce qui oblige à faire plusieurs appels sur la base de données. On parle d’under-fetching.

Ces deux problèmes peuvent être évités grâce à une API GraphQL.

Comment fonctionne une API GraphQL ?

Au sein d’une API GraphQL, toutes les requêtes sont des requêtes POST avec, en attribut, une structure de données.

Et c’est la structure de données passée en paramètre qui contient les noms des attributs que l’on souhaite recevoir en retour.

À l’intérieur du code de l’API, vous trouverez deux catégories de données :

  • les données « Types » ;
  • les données « Champs ».

Et parmi les objets, vous trouverez 3 types d’objets différents :

  • les objets « Requêtes », qui contiennent toutes les requêtes acceptées par l’API et qui vérifient que les formats reçus sont autorisées ;
  • les objets « mutation » qui définissent toutes les actions possibles et qui permettent de faire des modifications sur les modèles définis ;
  • les objets « abonnement », qui définissent les modèles de la base de données.

Bon, ok, tout ça, c’est un peu théorique.

Alors voici un exemple de code-source.

On va définir, en GraphQL, une structure de données représentant un concessionnaire automobile (juste son nom et son emplacement). Ensuite, on va récupérer son emplacement.

Voici ce que ça donne.

type Concessionnaire {
 nom: String
 emplacement: String
 voitures: String
}

Définition du graphe de données.

Vous voyez à quel point c’est simple ? Let’s go pour un appel en javascript.

const { ApolloClient, InMemoryCache, gql } = require('@apollo/client');
// Remplacez l'URL par l'endpoint de votre serveur GraphQL

const graphqlEndpoint = 'https://votre-serveur-graphql.com/graphql';

// Initialisez le client Apollo

const client = new ApolloClient({
 uri: graphqlEndpoint,
 cache: new InMemoryCache(),
});

// Définissez votre requête GraphQL
const GET_EMPLACEMENTS = gql`
 query {
   concessionnaires {
     emplacement
   }
 }
`;
// Effectuez la requête

client.query({ query: GET_EMPLACEMENTS })
 .then(result => {
   const emplacements = result.data.concessionnaires.map(concessionnaire => concessionnaire.emplacement);
   console.log('Emplacements des concessionnaires (GraphQL) :', emplacements);
 })
 .catch(error => {
   console.error('Erreur lors de la récupération des données (GraphQL) :', error);
 });

Prêtez bien attention à la définition du schéma de requête.

const GET_EMPLACEMENTS = gql`
 query {
   concessionnaires {
     emplacement
   }
 }
`;

Clairement, on fait comprendre au serveur qu’on ne veut que l’emplacement et rien d’autre.

Ainsi, pas besoin de filtrer le résultat qu’il retourne.

Si on fait la même chose avec une API REST, voici ce que ça donne :

const axios = require('axios');

// Remplacez l'URL par l'endpoint de votre API REST
const restEndpoint = 'https://votre-api-rest.com/concessionnaires';

// Effectuez une requête GET pour récupérer les données
axios.get(restEndpoint)
.then(response => {
const concessionnaires = response.data;
const emplacements = concessionnaires.map(concessionnaire => concessionnaire.emplacement);
console.log('Emplacements des concessionnaires (REST) :', emplacements);
})
.catch(error => {
console.error('Erreur lors de la récupération des données (REST) :', error);
});

Vous voyez la nuance sur les lignes :

const concessionnaires = response.data;

    const emplacements = concessionnaires.map(concessionnaire => concessionnaire.emplacement);

Ici, on récupère toutes les informations des concessionnaires. Et après ça, on extrait le champ qui nous intéresse.

Imaginez un peu si on avait plus d’informations sur les concessionnaires :

  • Des images de plusieurs centaines de voitures au format .png ;
  • Des vidéos de présentations ;
  • Des dizaines d’informations textuelles supplémentaires, etc.

Devinez quoi ? On aurait dû tout transférer depuis les serveurs avec une API REST pour, au final, ne garder qu’une seule colonne.

Bon, c’est un peu exagéré, généralement, on définit une API spécifique qui ne renvoie que des données précises pour chaque cas. Mais vous voyez l’idée.

Pourquoi GraphQL est (parfois) un meilleur choix qu’une API REST ?

Quel API choisir pour concevoir vos logiciels ? À quels protocoles allez-vous faire confiance pour le transfert de vos données ?

Le cabinet Postman a posé la question à plusieurs développeurs dans le monde. Et voici les résultats qu’ils ont obtenus :

Statistiques sur les architectures des API, Postman Report 2023

source : 2023 State of API Report, Postman

Dans les faits, 89 % des devs utilisent des APIs Rest dans leur pile technique contre à peine 29 % pour les APIs GraphQL (ils pouvaient choisir plusieurs réponses).

Qu’est-ce qui explique ces choix ?

1ʳᵉ Réponse : vos besoins applicatifs (ceux que vous avez listés dans votre cahier des charges).

Et pour être sûr de tirer un maximum d’avantages de GraphQL, incluez-la comme critère lorsque vous composez votre équipe de développeurs.

 2ᵉ réponse : les avantages et les inconvénients de GraphQL.

Et justement, voyons-les tout de suite.

3+1 Avantages de GraphQL

GraphQL a 4 avantages majeurs comparé à REST.

1 – Vous évitez l’under-fetching

L’under-fetching se produit lorsqu’une requête ne retourne pas toutes les données dont le programmeur a besoin.

En conséquence, il doit encore faire un appel serveur et initier un autre transfert de données pour avoir toutes les informations qu’il veut. 

Vous sentez la dégradation des performances de votre app venir ?

Du moins, ça se passe comme ça dans une API Rest.

Dans une API GraphQL, vous n’avez pas ce problème. Vous demandez des données, et le serveur vous les retourne, un point c’est tout.

2 – Vous évitez l’over-fetching

L’over-fetching est l’autre face de l’under-fetching.

Il se produit lorsque vous avez besoin d’une information, mais que l’API vous retourne tout un tas d’autres données dont vous n’avez pas besoin.

Sur les APIs REST, c’est fréquent.

On fait un appel à la base de données via une API dont les champs retours sont déjà spécifiés. Ensuite, après avoir consommé la bande passante du serveur et du client, on jette tous les champs qui ne nous intéressent pas.

Du gaspillage pur.

Et ça empire si vous avez besoin de données sur le même serveur, mais accessibles via des API différentes.

Heureusement, avec GraphQL, ça ne se produit pas.

Le développeur précise clairement les champs qu’il attend et le back-end lui fournit uniquement ceux-là.

Vous vous souvenez de l’extrait de code qu’on vous a fourni plus haut avec le concessionnaire ? C’est exactement ce qui s’y passe.

const concessionnaires = response.data;

    const emplacements = concessionnaires.map(concessionnaire => concessionnaire.emplacement);

Avec l’API Rest, malgré le fait que l’on ne souhaite avoir que l’emplacement, on télécharge d’abord toutes les données renvoyées par le serveur.

L’over-fetching est particulièrement énervant pour les applications mobiles et web car elle les ralentit fortement.

3 – Gérer les versions n’a jamais été aussi simple

Vos applications évoluent. Les versions se succèdent et parfois ne se ressemblent pas.

Très souvent, vous ajouterez ou retirerez des fonctionnalités de l’app.

Problème : vos équipes de dev vont devoir modifier les champs retournés par l’API.

Si vous utilisez REST, apprêtez-vous à de longues journées à chercher exactement quelles fonctions dépendent de quelles APIs.

Essayez de retirer un champ dans une API alors qu’il est critique pour une fonction utilisant cette API… et une pluie de bugs informatiques et de crash vont vous tomber dessus.

À l’inverse, rajoutez trop de champs dans vos APIs pour faire tourner vos nouvelles fonctions, et vos systèmes informatiques vont ralentir. Sans compter les risques de vulnérabilité accrus aux cyberattaques.

(Si vous vous reconnaissez dans l’un de ces cas, notre chef de projet informatique peut vous aider à éviter que vos applications explosent. Faites-lui un message).

Bref, la gestion des versions d’un logiciel va vous obliger à aller toucher à vos APIs et aux requêtes serveurs qui les utilisent.

Sauf si vous utilisez GraphQL.

Alors non, les APIs GraphQL ne sont pas immuables. Mais elles ont une meilleure rétrocompatibilité, sont plus simples à faire évoluer et à adapter à vos nouveaux besoins.

4 – GraphQL vous facilitent l’accès aux données éparpillées dans plusieurs bases de données relationnelles

Voici ce à quoi ressemble l’architecture des bases de données typiques des grands groupes :

Architecture typique d'une base de données distribuée

Source : Oracle https://docs.oracle.com/cd/A58617_01/server.804/a58227/ch21.html

Les silos représentent ici des bases de données.

Vous voyez où je veux en venir ? Les informations peuvent être contenues dans différents serveurs situés à des emplacements géographiques différents.

Et c’est logique : si votre entreprise ouvre une branche à Paris, vous voudrez très probablement stocker les informations de vos clients de Paris à proximité de Paris. Question de simplifier l’accès aux données de vos collaborateurs qui gèrent ces clients.

Par contre, vous n’avez pas besoin de dupliquer les informations de votre département Ressources Humaines sur place. Vous les garderez donc près de votre siège.

Et si, comme tous les GAFAM, vous décidez d’installer votre siège européen à Dublin, devinez quoi ? Vous allez assurément y stocker les informations sur vos ventes, vos finances, etc.

Pourquoi je vous parle de ça ?

Pour vous faire comprendre que vos données peuvent facilement être éparpillées dans des data centers aux 4 coins du monde.

Et il n’est pas rare que vous ayez besoin, dans une seule requête, d’informations situées dans plusieurs data centers différents.

Vos équipes de développement vont devoir faire appel à plusieurs APIs. Ensuite faire des JOIN/Merge en SQL entre les clés primaires et secondaires de leurs retours.

C’est fastidieux. Ça consomme énormément de ressources (électricité + bande passante). Enfin, ce flux de SELECT, JOIN et de MERGE diminuent la durée de vie de votre infrastructure informatique.

Pour au final ne récupérer que peu d’informations.

Avec une couche GraphQL, les performances de telles requêtes vont considérablement s’améliorer, car il s’appuie sur des technos web.

C’est ce qu’a fait Netflix lors de la création de son système de gestion des publicités Monet. En effet, ses pages devaient charger des informations éparpillées sur ses différents serveurs.

Grâce à l’ajout d’une couche de GraphQL, les pages qui chargeaient 10 MB de données n’avaient plus besoin que de 200 KB. Et les performances globales du système ont fait un boost de x8.

API REST vs API GraphQL

Les 4 inconvénients majeurs de GraphQL

Après tout ce qu’on a dit plus haut, on peut être tenté de se dire que GraphQL est la solution technique à tous vos problèmes.

Attendez.

Parce que les API GraphQL ont aussi leurs défauts.

1 – Pas de mise en cache côté serveur (ou trop complexe)

Avec une API Rest, vous savez exactement quelles informations le client va vous demander.

Et si le même client demande les mêmes informations plusieurs fois, vous pouvez les mettre en cache côté serveur pour gagner en vitesse.

C’est impossible ou très peu envisageable avec une API GraphQL.

La raison : la structure des données retours n’est pas définie côté serveur.

Une tactique utilisée par les développeurs GraphQL est de mettre les informations dans le cache du client. C’est moins efficace, mais ça marche.

2 – La courbe d’apprentissage du langage de requête peut être abrupte

REST est une norme d’échanges d’informations créée en 2000.

Ça fait 24 ans qu’elle est enseignée par défaut aux geeks et autres passionnés d’informatique par défaut.

Tous ceux qui s’intéressent aux codes informatiques et à la gestion des données doivent maîtriser par cœur la formule CRUD des API REST. (CRUD = CREATE READ UPDATE DELETE).

En conséquence, la transition du modèle CRUD vers les schémas, résolveurs, souscriptions et graphes de GraphQL peut s’avérer difficile.

3 – Il y a peu de développeurs spécialisés sur cette technologie (comparée aux API REST)

Si vous ne voulez pas, ou n’avez pas le temps de faire une montée en compétence, l’autre solution est d’embaucher un expert maîtrisant cette technologie.

Sauf que, vous vous en doutez, ils sont moins nombreux que ceux maîtrisant les interfaces de programmation d’applications REST.

En écrivant ces lignes, je suis allé faire un tour sur Fiverr, l’une des marketplace de freelance les plus populaires au monde.

J’ai fait une recherche sur le terme « Développeur API GraphQL » et ensuite, j’ai filtré les prestataires parlant français et/ou anglais.

Requête "Développeur GraphQL API" sur Fiverr

Bilan : 1.444 prestataires ( et à peine 75 qui parlent au moins le français)

À l’inverse, les développeurs d’API REST parlant français et/ou anglais sont  15.180 ! (et 656 quand je ne prend que ceux qui parlent français).

Requête "Développeur API REST" sur Fiverr

Je vous laisse faire les calculs vous-mêmes pour voir la différence de taille dans le vivier de talents disponible sur la technologie GraphQL. 

4 – Sécuriser les serveurs est plus compliqué

Sécuriser un serveur utilisant une API GraphQL présente des défis en termes de cybersécurité plus importants qu’avec une API REST.

La raison ? les réponses des points terminaux (les clients) ne sont pas statiques comme dans une API REST.

Bien sûr, il y a des moyens pour les sécuriser, sinon Facebook et tous les autres géants de la tech ne l’utiliseraient pas 😉

Et hop, transition parfaite pour le prochain point.

Comment sécuriser son API GraphQL ? (4 méthodes)

Logo de GraphQ

On est d’accord, GraphQL a ses avantages, si ça fait de votre système informatique une passoire pour hacker, hors de question de l’utiliser.

Heureusement, il existe une myriade de techniques pour transformer vos API GraphQL en coffres-forts anti-hackers.

1 – Restreindre les autorisations

Oui, GraphQL permet à l’utilisateur de demander les données qui l’intéressent.

Mais encore faut-il qu’il ait l’autorisation de lire tous les champs de données qu’il demande.

Raison pour laquelle, l’un des moyens les plus sûrs pour diminuer le risque d’attaque informatique est de limiter les autorisations.

Couplé à une politique d’authentification robuste et le chiffrement des données et vous êtes presque invulnérable.

Enfin, une autre technique consiste à surveiller les activités de l’API pour identifier et neutraliser les menaces. Ainsi, même si les identifiants d’un utilisateur sont compromis, vous pourrez rapidement repérer la source de l’attaque et la bloquer.

2 – La validation des requêtes de l’API

L’API peut être une source d’attaque.

Comment ? Il suffit que l’attaquant demande des informations sensibles ou injecte du code malveillant via un appel-serveur.

Évitez ça.

Pour cela, rien de plus simple : pensez à toujours vérifier les inputs/outputs de l’API et à les nettoyer au besoin.

Ça vous évitera notamment des attaques par injection.

3 – Gérez la complexité des requêtes avec soin

Vous vous souvenez de ce que l’on disait que GraphQL permet de limiter l’under-fetching en récupérant directement toutes les données ?

Ça aussi, ça peut être une source de vulnérabilités informatiques.

Si un individu malveillant parvient à faire une requête profonde, il peut récupérer un lot d’informations sensibles. Ou pire, il peut surcharger les serveurs qui hébergent vos données via une attaque par déni de service DDoS.

Pour parer à ça, une seule solution : limitez la profondeur et l’étendue des requêtes.

4 – Soyez vigilant sur les demandes d’introspection

L’introspection est une fonctionnalité de GraphQL qui permet au développeur de connaître le schéma de votre base de données. 

Elle révèle absolument tous les champs… ce qui peut vite devenir problématique si un individu malveillant utilise cette fonction.

Raison pour laquelle il est nécessaire de toujours restreindre et gérer soigneusement les données exposées via les points de terminaison.

Comment faire pour implémenter une API GraphQL ou une API REST sur votre projet ?

Ok.

À ce stade, vous savez ce qu’est GraphQL (et REST, vu que j’en ai beaucoup parlé). Et vous voulez savoir si ça peut booster les performances de votre application web/mobile ou de votre logiciel.

Alors comment faire ?

J’aimerais bien vous donner une réponse type faite A puis B puis C, seulement, votre projet est unique. Et les solutions techniques dont vous avez besoin le sont aussi.

Alors, j’ai une autre réponse à vous donner : venez en discuter avec notre chef de projet informatique.

En lui exposant votre projet, il pourra alors mieux vous conseiller et vous dire que faire.C’est par ici pour le rencontrer.

Comment construire un Pipeline CI/CD avec Jenkins et Gitlab?

Développer une application n’est jamais simple.

Et plus elle est complexe, plus vous avez de chance de vous retrouver dans l’une des situations suivantes :

  • vos équipes de développement prennent de plus en plus de temps pour intégrer les nouveaux morceaux de code ;
  • vos testeurs détectent les bugs tardivement ;
  • le respect des délais de livraison passe d’un “impératif” à un “on va essayer d’être dans les temps”.

Bref, les problèmes techniques vont vous sauter à la gorge et risquent de faire couler votre projet.

Heureusement, l’ingénierie logicielle et l’approche DevOps ont développée une solution pour chasser ce nuage noir : l’automatisation via un pipeline CI/CD avec Jenkins et Gitlab.

Qu’est-ce qu’un pipeline CI/CD et comment il dope la productivité de vos développeurs ?

Un pipeline CI/CD est une série d’étapes à réaliser durant le développement d’un logiciel.

Son objectif : simplifier le développement logiciel en améliorant la distribution des nouvelles versions d’un logiciel via des tests automatisés.

Il est chargé de surveiller, d’automatiser les tests manuels extrêmement chronophages durant tout le cycle de vie du logiciel. Y compris lors de la phase d’intégration et celle du déploiement.

A chaque étape, le développeur rédige un ou plusieurs scripts qui seront exécutés à des moments précis du processus de livraison.

Dis comme ça, ça peut ressembler à une description d’un théorème obscur sorti tout droit de l’almanach d’un savant fou. Mais c’est en fait un gage de la qualité du code final et de votre capacité à respecter le cahier des charges dans les temps impartis.

Pour comprendre à quel point un pipeline CI/CD va transformer vos processus de création d’applications, il y a 2 concepts essentiels : l’intégration continue (CI) et le déploiement continu (CD).

L’intégration continue CI

Comment faire pour être certain que l’ajout de nouvelles fonctionnalités dans le code-source ne va pas entraîner de problèmes de compatibilité ?

Comment être certain que tous les membres de vos codeurs ont exactement la même version du code que celle de la branche maîtresse ?

Ou que le retrait ou la modification d’un bout de corde ne va pas créer une cascade d’erreurs liées aux dépendances ?

Malheureusement, c’est impossible à garantir. 

Surtout si votre code source est composé de milliers de lignes de codes, d’une kyrielles de dépôts et de packages entremêlés (bref, un bon gros plat de spaghetti informatique 🍝).

Par contre, ce que vous pouvez faire, c’est vérifier automatiquement s’il y a une erreur à chaque modification d’un morceau de code.

C’est le principe de l’intégration continue (ou continuous integration, dans la langue de Shakespeare).

Pour citer wikipedia : “L’intégration continue (de l’anglais : Continuous integration, CI), est un ensemble de pratiques utilisées en génie logiciel consistant à vérifier à chaque modification de code source que le résultat des modifications ne produit pas de régression dans l’application développée”.

L’intégration continue permet aux programmeurs de ne plus avoir à tester manuellement si leurs modifications créent des bugs. 

L’outil d’intégration analyse constamment les dossiers dans lesquels se trouvent les codes. Et s’il détecte un commit ou un git push dans votre SCM, il lance la compilation de la nouvelle version du code. Ensuite, il lance l’exécution des tests (tests fonctionnels, tests de régression, tests d’intégration, tests d’acceptation, etc.).

A la fin, le programmeur reçoit un rapport de tests lui indiquant s’il y a des erreurs et comment les corriger.

Le déploiement continu (CD)

Réduire le Time-to-Market de vos app pour fournir une valeur client plus rapide vous intéresse ?

Si oui, vous allez adorer la livraison continue (Continuous Delivery) et le déploiement continu (Continuous Deployment).

Concrètement, à chaque commit, la livraison continue va effectuer des tests automatisés et intégrer le code. Ensuite, elle attend une validation humaine pour déployer la dernière version du logiciel dans les différents environnements de tests, d’intégration et de mise en production.

Le déploiement continu va faire exactement pareil. A une différence près : son processus de déploiement automatisé ne nécessite aucune validation humaine.

Et pour pouvoir mettre en place un pipeline mêlant le CI et le CD, vous allez avoir besoin d’outils d’intégration.

Ce qui nous conduit à nos deux champions du jour : GitLab CI/CD et Jenkins.

Qu’est-ce que GitLab CI/CD et Jenkins ?

D’emblée, sachez que vous pouvez utiliser uniquement l’un ou l’autre, ou les deux, en fonction de votre cahier des charges et de votre équipe.

Maintenant, voyons-les en détail.

GitLab

Logo de Gitlab

GitLab est un logiciel de gestion de versions (VCS) complet fortement orienté sur la collaboration et le travail en équipe.

Et parmi ses fonctions, GitLab CI/CD.

GitLab CI/CD est un outil de gestion de l’intégration continue et du déploiement continu des projets hébergés sur GitLab.

Parmi ses fonctionnalités, voici quelques-unes qui sont très appréciées par les aficionados du code informatique :

  • la gestion du code source ;
  • l’intégration d’outils de monitoring et d’analyse ;
  • le suivi complet des problèmes ;
  • l’usage de la syntaxe YAML ;
  • son intégration native avec Git.

Toutefois, contrairement à ce que leurs noms peuvent laisser penser, GitLab et GitHub appartiennent à des entreprises différentes.

GitHub, racheté par Microsoft en 2018, est une autre solution open-source répondant aux mêmes besoins.

Néanmoins, les deux sont basés sur le même logiciel de versions décentralisé et open-source : git.

D’où la ressemblance dans les noms.

Jenkins

Logo de Jenkins

Créé en 2004 sous le nom de projet Hudson, Jenkins était d’abord un logiciel interne dédié à l’intégration continue pour l’équipe de développement de Sun Microsystems.

Hudson gagne en popularité grâce à son modèle communautaire, flexible et rapide. Sauf qu’en 2009, Oracle rachète Sun et veut imposer sa vision du processus de développement idéal d’un logiciel.

Plus lent. Plus contrôlé. Bref, moins agile et radicalement différent de la conception des créateurs originaux.

Raison pour laquelle, en 2011, les développeurs originels de Hudson créent un fork du projet sur GitHub. C’est ce fork qui est devenu Jenkins.

Alors qu’est-ce que jenkins et à quoi ça sert ?

Jenkins est un serveur d’intégration continu open-source écrit dans le langage de programmation Java.

Il est 100 % gratuit et mise sur la flexibilité et la rapidité des livraisons.

Autre point fort de Jenkins : son immense bibliothèque qui contient plus de 1900 intégrations à d’autres outils pour passionnés du code informatique.

Voici quelques-uns des plus populaires :

  • Amazon Elastic Compute Cloud ;
  • GIT ;
  • Jira ;
  • Maven ;
  • Kubernetes ;
  • SonarQube Plugin ;
  • Docker ;
  • Blue Ocean.

Et ce modèle a déjà séduit 11 millions de d’amateurs de programmation.

Comment intégrer un pipeline CI/CD avec Jenkins et Gitlab en 3 étapes ?

Jenkins

Maintenant, entrons dans le vif du sujet : comment intégrer un pipeline CI/CD avec Jenkins et Gitlab.

Avant d’aller plus loin, assurez-vous de cocher ces 2 cases :

  • vous avez créer un compte sur Gitlab (si ce n’est pas le cas, voici tuto détaillé sur le sujet) ;
  • vous avez déjà créé un projet sur Gitlab.

Prêt ? Commençons.

Etape 1 – Installer Jenkins sur votre serveur

Si vous avez déjà installé Jenkins, vous pouvez sauter cette partie.

1 – Téléchargez et installez Java SE sur votre PC/Serveur

Java SE est une plateforme qui contient les API et bibliothèques de base du langage de programmation Java.

Grâce à ce framework, votre ordinateur sera capable de “comprendre” le langage Java. 

Jenkins étant écrit en Java, Java SE est donc indispensable.

Bref, rendez-vous sur la page d’oracle, téléchargez la version correspondante à votre système d’exploitation. Ensuite installez-la comme n’importe quel autre logiciel.

2 – Configurez les variables d’environnement pour Java

Les variables d’environnement sont utilisées pour dire en gros à votre OS :”voici où il faut chercher les fichiers qui contiennent les commandes de Java”.

Ainsi, lorsque vous écrirez des lignes de commande sur votre serveur virtuel Jenkins, l’ordinateur saura où aller chercher.

Rassurez-vous, c’est extrêmement facile :

  • Allez dans system -> Paramètre système avancé > Avancé ;
  • cliquez sur les variables d’environnement ;
  • sélectionnez Java_Home et entre le chemin de navigation suivant : C:\Program Files\Java\jdk-[Numéro de votre version Java] ;
  • Dans l’onglet variables système, ajoutez le chemin du fichier Java bin C:\Program Files\Java\jdk-[Numéro de votre version Java]\bin ;

C’est tout.

3 – Téléchargez et configurez Jenkins

Maintenant que votre desktop est configuré pour Java, passons à la prochaine étape : installer Jenkins.

Ca aussi, c’est très simple à faire en quelques clics.

Voici ce que vous avez à faire :

  • Téléchargez Jenkins en allant sur l’adresse : https://www.jenkins.io/download/ ;
  • lancez l’installation ;
  • choisissez “exécuter le service en local ou en tant que “domaine utilisateur”;

Attendez patiemment que l’installation se termine.

Voilà, Jenkins est installé sur votre machine.

Maintenant, il faut le “débloquer”.

Pour cela :

  • ouvrez votre navigateur internet et allez sur http://localhost:8080
  • Sur l’écran qui s’ouvre, entrez le mot de passe créé par Jenkins dans les fichiers logs (ils sont ici : C:\Program Files\Jenkins\secrets\initialAdminPassword)
  • Entrez le mot de passe.

Créez votre tout premier utilisateur – sans oublier de lui donner le rôle d’administrateur – et le tour est joué.

Etape 2 – Créez un nouveau projet Freestyle ou Pipeline sur Jenkins

A cette étape, vous avez déjà un serveur Jenkins qui fonctionne.

Place à la création du pipeline.

Voici la marche à suivre :

  • Allez sur Gitlab et copiez l’URL de votre référentiel (le répertoire de travail dans lequel se trouve votre projet) ;
  • Connectez-vous sur Jenkins ;
  • Allez dans les préférences ;
  • Créez un token, ou jeton d’accès, personnel ;
  • Stockez votre token dans un fichier texte ;
  • Créez un nouvel item et choisissez “Freestyle project”;
  • Dans l’onglet “Source Code Project Management”, choisissez Git et collez l’URL de votre projet sur Gitlab ;
  • Cochez l’option “Trigger Builds Remotely” et insérez votre token personnel ;
  • Rajoutez des étapes dans votre pipeline si nécessaire (celles par défaut font parfaitement l’affaire pour de petits projets) ;
  • lancez le build.

Et voilà. A chaque fois que l’équipe de développement modifiera le code stocké sur le compte Git, l’instance Jenkins effectuera toutes les étapes que définies dans votre pipeline.

De plus, vous pouvez aussi modifier votre code directement dans l’interface web de l’IDE de Jenkins.

Vous n’aurez plus qu’à aller dans l’espace “workspace” sur Jenkins pour lancer le build.

Étape 3 : configurez vos pipelines Jenkins

Robot regardant la liste des étapes d'un pipeline ci cd

Pour modifier le pipeline créé par défaut, vous allez devoir ouvrir le jenkins file du projet. C’est le fichier de configuration de votre pipeline.

Il se trouve à la racine du projet.

Un jenkinsfile est un simple fichier texte dans lequel vous allez écrire vos instructions dans un langage spécifique à un domaine – ou DSL. 

Celui de Jenkins ressemble beaucoup à du code Groovy.

Vous avez le choix entre deux modes d’écriture :

  • Le mode déclaratif, plus simple, adapté aux débutants et aux projets de petite envergure. Pour l’utiliser, téléchargez le plugin Pipeline Declarative ;
  • Le mode scénarisé, plus complexe et plus puissant, qui s’écrit dans le langage Jenkins Job DSL fourni avec le plugin pipeline.

Après avoir téléchargé le plugin correspondant à vos attentes, installez un environnement de programmation (IDE). Visual Studio Code fera parfaitement l’affaire.

Voici un exemple de fichier Jenkins en mode déclaratif.

// Declarative //
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}
// Script //

Et un autre en mode scénarisé.

// Scripted //
node {
stage('Example') {
if (env.BRANCH_NAME == 'master') {
echo 'I only execute on the master branch'
} else {
echo 'I execute elsewhere'
}
}
}

Si vous souhaitez en apprendre plus sur les différentes syntaxes des pipelines groovy, faites un tour sur la documentation officielle.

Ces fichiers sont tous basés sur les concepts propres à Jenkins :

  • les étapes ou “steps”, qui sont des tâches uniques chargées d’exécuter un processus spécifique ;
  • les phases ou “stages”, qui sont des série d’étapes ;
  • les noeuds, aka les machines sur lesquelles Jenkins s’exécute ;
  • enfin, les pipelines qui sont des séries de phases.

Place à l’écriture de vos premières directives (voici un billet qui détaille les plus importantes).

Ce serait beaucoup trop long pour cet article, alors faites un tour sur ce billet de blog entièrement consacré à l’écriture des pipelines.

Bonus : Comment créer un pipeline CI/CD uniquement avec GitLab

Vous vous souvenez, plus haut nous vous avons dit que vous pouvez utiliser soit l’un, soit l’autre pour créer votre pipeline CI/CD ?

Eh bien, c’est extrêmement simple : vous n’avez qu’à créer un fichier avec l’extension .gitlab-ci.yml à la racine du référentiel GitLab.

Ensuite, vous définissez les différentes étapes de votre pipeline CI/CD et le tour est joué.

Voici quelques sections les plus courantes dans ces fichiers:

  • Stages : définit les différentes étapes du pipeline, chacune ayant un nom significatif.
  • +install : dans cette étape, il y a un job appelé install_Dependencies qui s’occupe de l’installation des dépendances du projet en utilisant la commande npm install. C’est une étape courante pour s’assurer que les dépendances sont à jour.
  • +Cache :l’étape Node-Modules-Cache utilise une fonction de mise en cache pour stocker le répertoire node_modules/ entre les exécutions de jobs. Il permet d’économiser du temps en évitant de réinstaller les mêmes dépendances à chaque exécution.
  • +build : c’est ici qu’à lieu la construction de l’application.
  • +security :inclut des tâches liées à la sécurité du code telles que les analyses statiques de sécurité SAST et les analyses dynamiques de sécurité (DAST).
  • variables : définit les variables d’environnement qui peuvent être utilisées dans les jobs du pipelineDe

Voilà, maintenant vous savez tout ce qu’il y a à savoir sur les pipelines CI/CD avec Jenkins et GitLab.

Si vous avez besoin de discuter avec un expert, n’hésitez pas à contacter notre chef de projet informatique.