Comment installer et utiliser Jenkins pour créer un pipeline CI / CD
Pour les éditeurs de logiciels qui suivent un processus de développement agile, publier un logiciel chaque jour est un processus intensif. Jenkins est un outil qui peut accélérer votre flux de travail en automatisant de nombreuses tâches répétitives, telles que la création, les tests et la publication.
Sommaire
Qu'est-ce que Jenkins?
Jenkins a été conçu à l'origine dans un seul but: automatiser la création et le test des versions logicielles nocturnes. Les nouveaux commits doivent être régulièrement intégrés dans la branche principale (souvent appelée «intégration continue»), ce qui implique souvent des tests intensifs pour s'assurer que tout se passe bien. Faire cela une fois par semaine est une chose, mais lorsque vous intégrez plusieurs fois par jour, il vaut mieux pour tout le monde que ce soit un processus automatique.
Jenkins et d'autres solutions CI / CD similaires accélèrent ce processus. Vous pouvez le considérer comme un script shell automatisé. Par exemple, pour publier une nouvelle version d'une application React, vous devrez peut-être exécuter npm install
, npm run build
, puis exécutez une suite de tests comme Jest pour vérifier que la nouvelle version réussit tous les tests. En cas de succès, vous pouvez l'envoyer à un environnement de test pour une révision manuelle ou simplement publier une nouvelle version directement. Ce sont toutes des commandes que vous pouvez écrire assez facilement.
Jenkins peut gérer l'exécution de toutes ces tâches dans le cadre d'un pipeline. Chaque fois que Jenkins détecte des modifications dans votre contrôle de code source (sur le maître ou une branche de fonctionnalité), il démarre le pipeline automatisé et exécute chaque tâche que vous lui avez confiée. Certaines tâches sont aussi simples que des commandes bash, d'autres peuvent s'interfacer avec un service externe comme Jira, Git ou votre fournisseur de messagerie. Jenkins est également entièrement extensible avec des plugins, et peut vraiment être fait pour faire ce que vous voulez.
Jenkins a deux versions majeures, Blue Ocean et Classic. Blue Ocean est plus récent et comprend une interface utilisateur simplifiée qui facilite la création de pipelines. Nous utiliserons Blue Ocean pour ce guide, mais la plupart des mêmes concepts s'appliqueront aux deux versions de Jenkins.
Installer Jenkins
Les binaires Jenkin sont disponibles pour plusieurs systèmes d'exploitation, mais généralement pas à partir des gestionnaires de packages par défaut. Si vous utilisez Ubuntu, vous pouvez télécharger et installer avec les quelques commandes suivantes:
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add - sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list' sudo apt-get update sudo apt-get install jenkins
Pour rendre les choses indépendantes de la plate-forme, nous allons exécuter Jenkins en utilisant Docker, ce que Jenkins recommande de toute façon.
Installation de Docker
Docker est une plate-forme pour exécuter des applications dans des «conteneurs»; Le conteneur inclut toutes les dépendances nécessaires et garantira que l'application s'exécute de la même manière quel que soit le système d'exploitation de base. Tout ce que vous avez à faire est d'installer Docker pour votre système et d'exécuter quelques commandes.
Pour Ubuntu, vous devrez installer certains prérequis:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
Ajoutez ensuite la clé GPG de Docker:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Et ajoutez le repo lui-même:
sudo add-apt-repository "deb (arch=amd64) https://download.docker.com/linux/ubuntu bionic stable"
Rafraîchissez vos sources:
apt update
Et, enfin, installez Docker depuis apt:
sudo apt install docker-ce
Docker devrait maintenant fonctionner sur votre système, que vous pouvez vérifier avec systemctl
.
Configurer Jenkins
Avec Docker opérationnel, vous pouvez configurer le conteneur Docker pour Jenkins. Vous aurez d'abord besoin d'un réseau ponté sur lequel les conteneurs pourront communiquer:
docker network create jenkins
Docker est par nature éphémère – toutes les données stockées sur les conteneurs seront supprimées lorsque ces conteneurs seront arrêtés. Pour éviter cela, vous souhaiterez stocker des données sur des volumes Docker, qui resteront sur le disque. Vous aurez besoin de deux volumes, un pour certains certificats TLS dont Jenkins a besoin pour se connecter à Docker, et l'autre pour toutes vos données Jenkins. Ceux-ci seront liés au conteneur au moment de l'exécution.
docker volume create jenkins-docker-certs docker volume create jenkins-data
Jenkins doit en fait être capable d'exécuter Docker dans le cadre de son fonctionnement, pour configurer les environnements de construction. Ce n'est pas possible avec Docker normal, donc pour que cette fonction fonctionne correctement, vous devrez exécuter "Docker in Docker" ou DinD. La commande suivante exécutera le programme officiel de Docker docker:dind
conteneur, liez-y le réseau et les volumes que vous avez créés lors des étapes précédentes et publiez-le en tant que service s'exécutant sur le port 2376 pour que le conteneur Jenkins l'utilise. Vous êtes libre de modifier ce port si vous le souhaitez, mais vous devrez également le modifier à l'étape suivante.
docker container run --name jenkins-docker --rm --detach --privileged --network jenkins --network-alias docker --env DOCKER_TLS_CERTDIR=/certs --volume jenkins-docker-certs:/certs/client --volume jenkins-data:/var/jenkins_home --publish 2376:2376 docker:dind
Avec cette configuration, vous pouvez exécuter le jenkinsci/blueocean
container à l'aide de la commande suivante:
docker container run --name jenkins-blueocean --rm --detach --network jenkins --env DOCKER_HOST=tcp://docker:2376 --env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1 --volume jenkins-data:/var/jenkins_home --volume jenkins-docker-certs:/certs/client:ro --publish 8080:8080 --publish 50000:50000 jenkinsci/blueocean
Cela montera le réseau et les lecteurs, définissez le DOCKER_HOST
variable sur le port sur lequel DinD s'exécute, et publiez le service sur le port 8080, que vous pouvez modifier s'il n'est pas gratuit. (Le format est host:container
.) Il publie également la connexion administrative de Jenkin sur le port 50000, si vous prévoyez de configurer un serveur Jenkins maître avec plusieurs versions distribuées qui s'y connectent.
Une fois Jenkins opérationnel, il sera accessible via un navigateur sur le port 8080 de la machine hôte. Vous devrez effectuer un peu de configuration avant que Jenkins ne soit pleinement utilisable, la première étant de vous authentifier pour prouver que vous êtes le propriétaire du serveur, et non un robot attaquant une interface Web vulnérable.
Vous devrez saisir un mot de passe stocké dans /var/jenkins_home/
, qui fait partie du volume Docker. Pour y avoir accès, vous devrez exécuter cat
à l'intérieur du conteneur Docker:
docker container exec -it jenkins-blueocean cat /var/jenkins_home/secrets/initialAdminPassword
Cela imprimera le mot de passe, que vous pourrez copier et commencer le reste de la configuration.
Il vous sera demandé de configurer votre nom d'utilisateur et votre mot de passe d'administrateur, d'installer divers plug-ins. Sélectionner «Installer les plugins recommandés» installera simplement un grand nombre de ceux recommandés par la communauté pour démarrer. Vous êtes toujours libre d'en installer d'autres ultérieurement.
Créer un pipeline
Une fois que vous avez configuré Jenkins, vous serez accueilli par l'écran de bienvenue suivant. Cliquez sur «Créer un nouveau pipeline» pour commencer.
Vous devrez sélectionner l'emplacement de stockage de votre code. Vous pouvez lier votre compte Github ou BitBucket directement avec une clé d'accès.
Cependant, une meilleure solution consiste simplement à choisir «Git» générique. Entrez l'URL de votre référentiel et Jenkins vous donnera une clé publique. Étant donné que Jenkins est capable de faire des validations (et de toujours valider les modifications de la configuration du pipeline), vous devez créer un nouvel utilisateur de service et y ajouter la clé publique.
Jenkins prendra une seconde pour se connecter à Git, puis vous amènera à une page où vous pouvez modifier les paramètres du pipeline. Jenkins stocke toute la configuration du pipeline dans un fichier Jenkins, placé à la racine de votre référentiel. Chaque fois que vous apportez des mises à jour au pipeline dans l'éditeur, Jenkins validera la modification dans votre fichier Jenkins.
Chaque pipeline aura quelques étapes distinctes, telles que Build, Test ou Deploy, qui contiendront des étapes individuelles. Ceux-ci peuvent faire toutes sortes de choses, comme envoyer des e-mails, interagir avec d'autres services comme Jira et Git et coordonner le déroulement des autres étapes, mais vous les utiliserez le plus souvent pour exécuter des scripts shell simples. Toute erreur dans le retour de ces scripts entraînera l'échec du pipeline.
Avant d'ajouter des étapes, vous devez configurer les paramètres d'environnement. En règle générale, vous utilisez un conteneur Docker, tel que node:latest
.
Pour cet exemple, nous allons créer une application Web basée sur Node. Ajouter simplement deux étapes pour npm install
et npm run build
est tout ce qui est nécessaire. Jenkins exécutera ces commandes et passera à l'étape suivante, avec les artefacts de construction en place. Pour la phase de test, la configuration d'un script shell pour exécuter Jest exigera que tous les tests réussissent pour que la construction réussisse.
Jenkins peut exécuter plusieurs étapes en parallèle, ce qui est utile si vous devez tester sur plusieurs plates-formes différentes. Vous pouvez configurer une étape «Test sous Linux» et «Test sous Windows», et les faire exécuter en même temps afin que vous n’attendiez pas que l’une démarre l’autre. Si l'un ou l'autre échoue, le pipeline échouera toujours.
Une fois les modifications terminées, Jenkins démarrera automatiquement votre pipeline. Si vous cliquez dessus pour plus d'informations, vous pouvez suivre la progression de la construction à travers les étapes.
La barre supérieure deviendra rouge en cas d'erreur et verte si tout réussit. Si vous rencontrez des erreurs, vous pouvez cliquer sur les étapes incriminées pour afficher la sortie de la console des commandes provoquant l'échec du pipeline. Vous voudrez également vérifier la configuration de votre environnement pour vous assurer que tous les outils requis sont installés. (Vous pouvez configurer votre propre conteneur Docker pour vos builds.)