← Retourner à la liste des articles
Image blog
Auteur

Par Maxime Jumelle

CTO & Co-Founder

Publié le 23 nov. 2023

Catégorie Cloud / DevOps

Jenkins : tout comprendre de l'outil CI/CD open-source

La mise en place d'une gestion efficace et automatisée des processus de construction, de déploiement et d'intégration continue est devenue essentielle dans le contexte en constante évolution du développement logiciel. C'est là que Jenkins joue un rôle crucial dans les équipes de développement et d'exploitation : il s'agit d'un serveur d'intégration continue open source, est devenu un élément essentiel du domaine DevOps et du développement logiciel contemporain.

Dans cet article, nous allons voir comment Jenkins a pu être propulsé en quelques années sur le devant de la scène, pour en faire aujourd'hui l'un des outils CI/CD les plus utilisés parmi les très nombreuses alternatives présentes sur le marché.

L'histoire de Jenkins

L'histoire de Jenkins remonte à près de deux décennies. Le projet a été créé initialement par Kohsuke Kawaguchi, un développeur de Sun Microsystems, en 2004, sous le nom de projet Hudson. Le projet Hudson était initialement conçu comme un outil interne de gestion de l'intégration continue pour l'équipe de développement de Sun Microsystems.

Jusqu'à 2010, le projet a gagné en popularité à la suite de son ouverture du code source. Mais en 2010, en raison d'une problématique politique interne à Sun Microsystems suite au rachat par Oracle, les membres fondateurs du projet étaient en désaccord. De ce désaccord est né Jenkins, qui à l'époque était un fork du projet Hudson.

Jenkins a alors continué son développement open source au fil des ans, pour devenir aujourd'hui l'un des outils les plus populaires pour la gestion de l'intégration continue et de la livraison continue, grâce à sa flexibilité, sa robustesse et sa capacité à s'intégrer à de nombreuses autres technologies.

Qu'est-ce que Jenkins ?

Jenkins est un outil d'automatisation de serveur open source qui permet aux développeurs d'intégrer rapidement des changements dans leur projet et de trouver des problèmes tôt en automatisant les processus de construction et de test. Il a été initialement conçu pour les projets logiciels d'intégration continue et de déploiement continu (CI/CD), mais il est devenu un pilier de l'industrie DevOps.

Le choix de Jenkins est justifié en raison de sa grande flexibilité et de son écosystème varié. Il peut intégrer de nombreux plugins, ce qui lui permet d'intégrer presque tous les outils de développement, de test ou de déploiement. Jenkins fonctionne en mode serveur : un serveur central exécute des "tâches" spécifiées dans un répertoire de code source, déclenchées par divers événements, tels qu'un commit.

Jenkins est une application Java qui peut être exécutée dans un conteneur de servlet comme Apache Tomcat ou directement via son propre environnement d'exécution intégré. Après l'installation, Jenkins fonctionne comme un processus daemon et surveille les modifications ou les demandes entrantes sur le système de gestion de versions (VCS). Il peut être configuré à l'aide d'une interface utilisateur Web simple à utiliser.


À lire : découvrez notre formation DevOps Engineer


Jenkins peut aussi être configuré pour détecter ces changements et exécuter automatiquement un job lorsqu'un développeur pousse des modifications dans le VCS, comme Git. Le travail commencera généralement par extraire le code source le plus récent, suivi d'étapes spécifiques telles que l'exécution de scripts de construction, l'exécution de tests et la génération de rapports. Jenkins peut ensuite déployer le code dans des environnements de test ou de staging et, éventuellement, en production, en fonction des résultats et de la configuration.

Fonctionnement et architecture de Jenkins

Jenkins possède une architecture relativement proche de ce que l'on peut trouver sur le marché en alternatives. Néanmoins, son architecture et sa terminologie associée sont essentielles pour comprendre comment Jenkins fonctionne.

Master et Agents

Jenkins suit un modèle maître-esclave où le serveur maître (Jenkins Master) délègue les tâches aux noeuds esclaves, ce qui permet de distribuer les charges de travail. Le Jenkins Master est le cœur de l'installation Jenkins, et c'est lui qui supervise la planification, la gestion de la configuration et la planification des travaux. De plus, le Master a la capacité de contrôler les plugins, les utilisateurs et les autorisations.

Ensuite, les Jenkins Agents, sont des nœuds (ou machines) qui sont distribués pour effectuer les tâches. Ils sont responsables de l'exécution des tâches de construction, de test et de déploiement. Un agent peut être installé sur une machine à distance et configuré pour effectuer des tâches particulières.

Ces agents peuvent alors être déployés sur n'importe quel type de plateforme : machine virtuelle, image Docker, etc.

Typiquement, les Jenkins Agents peuvent être utiles lorsqu'il y a de nombreuses automatisations à effectuer en parallèle, et que la machine exécutant Jenkins Master ne pourrait pas exécuter en même temps.

Il est par ailleurs possible d'exécuter des automatisations sans agent, et c'est d'ailleurs le comportement par défaut : le Jenkins Master peut exécuter lui-même des automatisations sans utiliser d'agents. Ce sera notamment le cas pour les projets dans lesquels il n'y a pas beaucoup d'automatisations gourmandes en ressources.

Terminologie

Jenkins dispose de son propre vocabulaire pour identifier des objets, des processus ou des événements. En pratique, on retrouvera un ensemble assez important de vocabulaire déjà connu parmi les autres outils équivalents.

  • Job : il s'agit sûrement l'un des concepts les plus importants. Un Job est une tâche automatisée que Jenkins doit exécuter. Cela peut inclure la construction d'un projet, l'exécution de tests ou encore le déploiement d'une application. Il s'agit particulièrement de la plus petite unité de calcul dans un processus automatisé.
  • Pipeline : lorsque des jobs sont exécutés de manière séquentielle ou en parallèle (ou même les deux à la fois), cela forme des Pipelines. Il s'agit d'une séquence de Jobs organisés de manière à automatiser un processus de bout en bout. Jenkins permet de définir des pipelines complexes en utilisant le code déclaratif ou le DSL (Domain Specific Language) de pipeline.
  • Trigger : le trigger indique la manière donc un pipeline est déclenché/exécuté. Par exemple, le déclenchement peut être réalisé en réponse à un événement (push sur Git, appel API via Webhook), ou selon des intervalles périodiques (CRON).

Pipeline Jenkins

En réalité, un pipeline, c'est plus que simplement des Jobs ordonnés. En effet, comment ces Jobs peuvent-ils communiquer entre eux ? Comment peuvent-ils se partager des informations ou des fichiers ?

Les Jobs sont isolés les uns des autres pour garantir la cohérence et la sécurité des opérations. Chaque travail s'exécute dans son propre espace de travail isolé, appelé Workspace, ce qui signifie qu'il dispose de son propre répertoire dédié où il effectue toutes les opérations de construction, de test et de déploiement. Cette isolation entre les travaux permet d'éviter les interférences potentielles entre eux et garantit que les travaux s'exécutent de manière fiable et prévisible.

Ensuite, certains de ces Jobs vont produire des Artifacts, qui sont le résultat de la construction d'une application. Il peut s'agir d'un fichier binaire, d'un package, ou d'autres éléments créés lors de la construction. En général, ce sont ces artifacts que l'on déploie.

  • Il peut s'agit de fichiers HTML/CSS/JS statique pour le déploiement de site Web.
  • Cela peut être des fichiers JAR qui seront ensuite déployés.
  • Des images Docker peuvent également être construites dans un Job Jenkins.

Au final, il y a beaucoup de flexibilité au sein d'un Job, il suffit de choisir une typologie de Job qui convient à nos besoins.

Avantages de Jenkins

Bien que Jenkins soit largement reconnu comme un outil d'automatisation de serveur puissant, ses avantages ne ressortent que lorsqu'ils sont comparés à d'autres plateformes telles que GitHub Actions ou GitLab CI. Pour clarifier son positionnement, examinons les avantages uniques que Jenkins propose et comment ils le distinguent des autres solutions CI/CD disponibles sur le marché.

  • Polyvalence et écosystème de plugins : Jenkins dispose d'un écosystème de plugins exceptionnellement riche, ce qui le rend très polyvalent. Jenkins peut s'adapter à presque tous les workflows de développement avec des milliers de plugins disponibles (AWS, Docker, etc). Il est compatible avec une variété d'outils tiers, y compris des systèmes de gestion de version (tels que Git ou SVN), des outils de déploiement, de suivi des erreurs, d'analyse de code et plus encore. Cette extensibilité signifie que Jenkins peut probablement s'adapter à toute pile technologique. Bien que GitHub Actions et GitLab CI offrent des intégrations avec plusieurs outils, ils sont généralement plus limités à leurs écosystèmes respectifs.
  • Scalabilité et distribution de charge : Jenkins est également conçu pour être scalable et gérer des charges de travail distribuées de manière dynamique. L'architecture de Jenkins permet l'exécution de jobs sur plusieurs noeuds simultanément, ce qui optimise l'utilisation des ressources et accélère les temps de construction. Les nœuds peuvent être facilement ajoutés ou retirés en fonction des ressources et des besoins.
  • Personnalisation puissante : enfin, Jenkins permet aux utilisateurs de définir des pipelines de construction complexes et de préciser avec une grande précision les étapes de construction, de test et de déploiement grâce à sa capacité de scriptage avancée avec Groovy dans les Jenkinsfiles. Les workflows peuvent être créés à l'aide de YAML avec GitHub Actions et GitLab CI, mais le scriptage Groovy de Jenkins peut offrir plus de personnalisation et de contrôle fin.

Utiliser Docker dans Jenkins

Les extensions logicielles (appelées plugins) sous Jenkins ajoutent des fonctionnalités et des capacités supplémentaires au système d'intégration continue. Les plugins Jenkins sont essentiels pour personnaliser et étendre Jenkins pour répondre à des besoins spécifiques. En effet, Jenkins se veut générique et épuré : son objectif est simplement de proposer une plateforme d'automatisation pour les projets à code source.


À découvrir : notre formation DevOps Engineer


Puisqu'il serait bien trop lourd et complexe d'avoir une plateforme qui contient une très grande bibliothèque de fonctionnalité, il est plus pratique d'utiliser des plugins : cela permet d'installer et d'utiliser que les fonctionnalités dont nous avons besoin.

Parmi les plugins les plus populaires, nous avons le plugin Docker : ce dernier permet d'exécuter des jobs directement dans des conteneurs Docker. Cela permet aussi de construire des images et les pousser vers un registre d'images Docker. Mais quel est l'intérêt d'utiliser Docker pour exécuter des jobs ?

Le principal intérêt avec les conteneurs Docker sur Jenkins, c'est de pouvoir isoler les différents environnements. En effet, si le job est exécuté sur le serveur principal ou sur un agent Jenkins, alors ce dernier devra avoir toutes les dépendances logicielles installées. Par exemple, pour générer des fichiers statiques d'un projet React, npm devra être installé. Pareil pour Java, si l'on souhaite packager une application sous forme de JAR, java et javac devront être installés.

Ainsi, si la plateforme est utilisée pour de nombreux projets, il y aura beaucoup de dépendances à installer, ce qui alourdira les consommations en ressources. De plus, il peut y avoir des conflits entre versions si l'on doit utiliser des versions différentes pour un même outil.

Avec les conteneurs Docker, nous avons donc beaucoup d'avantages qui règlent tous ces problèmes.

  • Il n'y a plus besoin d'installer les dépendances sur le système qui exécute les jobs.
  • Il n'y a plus aucun conflit de versions entre les dépendances.
  • Il n'y a plus besoin de savoir à l'avance quels outils seront utilisés pour les projets.

Par exemple, si un projet nécessite à la fois de tester unitairement un programme Java, de build des fichiers HTML/CSS et ensuite de packager l'application Java, chaque étape du processus sera réalisé dans un conteneur Docker différent, qui aura ses propres dépendances nécessaires pour l'étape concernée.

Conclusion

Jenkins est un élément clé de l'écosystème DevOps, aidant les entreprises dans leurs efforts d'intégration et de déploiement continus. Jenkins a su s'adapter aux besoins des équipes de développement grâce à sa flexibilité, à son extensibilité et à sa robustesse. Les entreprises peuvent améliorer considérablement la réactivité et la qualité de leurs produits en comprenant l'importance d'outils comme Jenkins dans le cycle de vie d'un logiciel, ce qui les rend plus compétitives sur le marché.

Articles similaires

Blog

28 févr. 2024

Cloud / DevOps

Pour de nombreuses entreprises, innover chaque jour en proposant des applications à ses utilisateurs est un sujet primordial. Pour autant, cette course au déploiement continu de nouvelles applications nécessite des compétences bien particulières sur les architectures Cloud, l'automatisation de projets et la supervision. C'est à partir de ce moment qu'intervient le rôle de l'ingénieur DevOps dans les entreprises.

Maxime Jumelle

Maxime Jumelle

CTO & Co-Founder

Lire l'article

Blog

23 févr. 2024

Cloud / DevOps

Dans le monde du DevOps, les conteneurs sont rapidement devenus des incontournables, aussi important que les machines virtuelles. Des plateformes de conteneurisation comme Docker ont permis de simplifier et d'accélérer la création d'image et l'exécution de conteneurs sur différents systèmes, à portée de tous.

Maxime Jumelle

Maxime Jumelle

CTO & Co-Founder

Lire l'article

Blog

16 févr. 2024

Cloud / DevOps

Dans l'approche GitOps, il existe de nombreux outils permettant d'exécuter des pipelines CI/CD : certains se concentrent uniquement sur la partie intégration continue, d'autres avec le déploiement en plus. S'il y en a un qui est considéré comme l'un des plus matures et des plus robustes, c'est bien GitLab.

Maxime Jumelle

Maxime Jumelle

CTO & Co-Founder

Lire l'article