Intégration continue avec Jenkins

En regardant en arrière comment les logiciels ont été construits et déployés il y a encore 15 ans, il semble surprenant que nos applications aient réellement fonctionné. À cette époque, le cycle de vie du développement logiciel consistait à exécuter des builds sur une machine locale, à copier manuellement les artefacts sur un serveur intermédiaire et à tester manuellement chaque application via plusieurs itérations. Lorsque l'équipe de développement était satisfaite de la version, nous déploierions manuellement l'application en production. La chose la plus constante dans ce style de développement était l'incohérence - dans le processus et dans les résultats.

Il y a plus de dix ans, les développeurs agiles ont commencé à adopter et à promouvoir le développement piloté par les tests et l'intégration continue (CI). Avec ces techniques, nous pourrions créer automatiquement du code source chaque fois qu'un développeur le vérifiait dans un référentiel source, en exécutant une suite de tests unitaires exhaustive pour s'assurer qu'une application fonctionnait correctement. De nombreux développeurs axés sur les tests ont également commencé à effectuer des tests d'intégration et des tests de performances dans un processus CI secondaire.

Grâce à l'intégration continue, nous avons pu détecter les erreurs plus rapidement et publier le code beaucoup plus rapidement que nous ne l'avions fait les années précédentes. Il n'est pas exagéré de dire que CI a apprivoisé le côté «construction» du cycle de construction et de déploiement. De nos jours, de nombreuses équipes de développement sont passées du CI au CD, ce qui signifie soit une livraison continue, soit un déploiement continu. Quelle que soit la désignation, le CD est un processus qui fait passer le logiciel de l'enregistrement du code à la préparation, voire aux déploiements de production.

Cette tranche de projets Java Open source introduit une intégration continue avec Jenkins, un serveur d'automatisation de premier plan pour CI / CD. Nous commencerons par un aperçu du processus CI et CD, puis configurerons un projet Web Java à l'aide de Maven et Jenkins. Vous apprendrez à créer et à tester les unités du projet dans Jenkins avec JUnit, ainsi qu'à résoudre les échecs de compilation. Vous installerez et exécuterez également une poignée de plugins Jenkins populaires pour les tests et les rapports d'analyse de code statique.

Introduction à CI / CD

Dans un processus d'intégration continue, le code qui a été archivé dans un référentiel de code source peut être automatiquement extrait, construit, testé de diverses manières et publié dans un référentiel. Pour que l'intégration continue fonctionne, vous avez besoin d'un serveur CI comme Jenkins, qui est capable de surveiller votre référentiel de code source pour les nouveaux changements et de répondre de manière configurable.

Prenons l'exemple d'une application Java créée à l'aide de Maven. Lors de la détection de modifications de code, votre serveur CI pourrait répondre en exécutant un fichier mvn clean install. Dans une configuration de construction Maven typique, il exécuterait un nouvel ensemble de tests unitaires dans le cadre de la commande de construction. Pendant la construction du code source, le serveur pouvait exécuter n'importe quel nombre d'actions supplémentaires:

  • Fusionnez votre branche de fonctionnalité dans votre branche principale ou principale une fois que le code validé a réussi le test unitaire.
  • Exécuter une analyse de code statique, telle que la couverture du code, la complexité du code, la recherche de bogues courants, etc.
  • Publiez vos artefacts de construction dans un référentiel, tel que Artifactory ou Sonatype Nexus
  • Déployez votre application dans un environnement de test d'intégration
  • Exécuter des tests d'intégration
  • Déployez votre application dans un environnement de test de performances
  • Exécutez un test de charge par rapport à votre application
  • Déployez votre application dans un environnement de test d'acceptation utilisateur (UAT)
  • Déployez votre application en production

Ces étapes sont tous les types d'activités que vous pouvez effectuer dans le cadre d'un processus CI / CD. CI englobe généralement les phases de création et de test du cycle de vie du développement, tandis que le CD étend ce processus au déploiement d'un artefact de génération sur un serveur à des fins de test. Dans certains environnements, le CD va jusqu'à la production.

L'intégration continue est généralement effectuée à l'aide d'un outil tel que Jenkins, Bamboo ou TeamCity, qui orchestre vos étapes de construction dans un pipeline d'intégration. Jenkins est probablement le produit CI / CD le plus populaire, et il se marie bien avec Docker.

Téléchargez et installez Jenkins

Jenkins est un serveur d'intégration continue et plus encore. Il se compose d'un moteur d'automatisation et d'un écosystème de plugins qui prend en charge l'intégration continue, les tests automatisés et la livraison continue. Vous personnalisez le pipeline de livraison en fonction de vos besoins.

Il existe de nombreuses façons d'exécuter Jenkins:

  1. Téléchargez un fichier WAR et installez-le sur un conteneur de servlet sur votre ordinateur local.
  2. Configurez une machine virtuelle dans un cloud public comme AWS et hébergez Jenkins là-bas.
  3. Tirez parti d'un fournisseur de cloud Jenkins tel que CloudBees.
  4. Configurez Jenkins dans une installation de test à l'aide de Docker.

Je vais vous montrer comment configurer à la fois l'installation locale et l'installation de test Docker.

Téléchargez et installez Jenkins localement

Commencez par télécharger Jenkins et sélectionnez la version Long-Term Support (LTS) sur la page d'accueil de Jenkins. Comme je suis sur un Mac, l'installation a automatiquement téléchargé un pkgfichier, qui a placé un jenkins.wardans mon Application/Jenkinsdossier. Le fichier WAR peut être déployé sur n'importe quel conteneur de servlet.

Vous voudrez également télécharger et installer Apache Tomcat. Au moment d'écrire ces lignes, la version la plus récente de Tomcat est la 8.5.4, mais vous devriez pouvoir exécuter n'importe quelle version récente. Téléchargez le fichier zipou tar.gzet décompressez-le sur votre disque dur. Copiez le fichier jenkins.war dans le dossier de Tomcat, webappspuis exécutez le fichier bin/startup.shou bin/startup.bat. Vous pouvez tester qu'il est en cours d' exécution en ouvrant votre navigateur pour: //localhost:8080.

Pour démarrer Jenkins, ouvrez un navigateur à l'URL: // localhost: 8080 / jenkins.

Vous devriez obtenir un écran qui ressemble à la figure 1.

Steven Haines

Ensuite, Jenkins crée un mot de passe d'administration et écrit que les deux à Tomcat dans logs/catalina.outle fichier journal et le répertoire suivant: .jenkins/secrets/initialAdminPassword. Récupérez le mot de passe, entrez-le dans l'élément de formulaire de mot de passe d'administration (illustré à la Figure 1) et appuyez sur Continuer . Vous serez invité à installer les plugins suggérés ou à sélectionner les plugins à installer. Pour l'instant, je recommande d'installer les plugins suggérés.

Vous serez maintenant invité à créer un utilisateur administrateur. Entrez vos informations d'utilisateur administrateur et appuyez sur Enregistrer et terminer . Enfin, cliquez sur Commencer à utiliser Jenkins . Vous verrez maintenant la page d'accueil de Jenkins, comme le montre la figure 2.

Steven Haines

Configurer l'exemple d'application avec Maven

Avant de pouvoir utiliser Jenkins pour créer un projet Web Java avec Maven, nous devons configurer ces deux technologies. Sous le capot, Jenkins extraira le code source d'un référentiel de code source vers un répertoire local et exécutera les cibles Maven que vous spécifiez. Pour que cela fonctionne, vous devez installer une ou plusieurs versions de Maven, indiquer à Jenkins où elles sont installées et configurer la version de Maven que vous souhaitez que Jenkins utilise lors de la création de votre application.

Dans le tableau de bord Jenkins, cliquez sur Gérer Jenkins et choisissez Configuration globale de l'outil . La première chose que nous ferons est de configurer un JDK. Dans la section JDK, cliquez sur Ajouter JDK , donnez-lui un nom (le mien est "JDK8") et laissez cochée l'option Installer par défaut depuis java.sun.com . Acceptez le contrat de licence Oracle, puis cliquez sur le lien "Veuillez saisir votre nom d'utilisateur / mot de passe". Entrez votre nom d'utilisateur et votre mot de passe Oracle et appuyez sur Fermer . Un écran similaire à celui de la figure 3 vous sera présenté.

Steven Haines

Cliquez sur Appliquer pour enregistrer votre travail, puis faites défiler jusqu'à la section Maven et cliquez sur Ajouter Maven . Entrez un nom pour Maven (le mien est "Maven 3.3.9"), laissez "Installer automatiquement" et "Installer depuis Apache" cochés. Cliquez sur Enregistrer lorsque vous êtes prêt. Un écran similaire à celui de la figure 4 devrait vous être présenté.

Steven Haines

Git est préconfiguré avec Jenkins, vous devriez donc maintenant avoir tous les outils installés dont vous avez besoin pour récupérer et créer un projet Java à partir de Git avec Maven.

Installer Jenkins dans un conteneur Docker

Si vous ne souhaitez pas installer Jenkins sur votre machine locale, vous avez la possibilité de l'exécuter dans un conteneur Docker. L'image officielle de Jenkins Docker vous permet d'exécuter et de tester une installation de Jenkins sans la configurer sur une machine locale.

Installation de Docker

Voir mon introduction à Docker pour un guide du débutant sur Docker, y compris les instructions d'installation et de configuration.

En supposant que vous avez déjà la configuration de Docker dans votre environnement de développement, vous pouvez lancer Jenkins à partir de Docker en ligne de commande:

 docker run -p 8080:8080 -p 50000:50000 -v /your/home/jenkins:/var/jenkins_home -d jenkins 

Cette commande indique à Docker d'exécuter la dernière version de jenkinsavec les options suivantes:

  • -p 8080:8080: Mappe le port 8080 sur le conteneur Docker au port 8080 sur l'hôte Docker, afin que vous puissiez vous connecter à l'application Web Jenkins sur le port 8080.
  • -p 50000:50000: Mappe le port 50000 sur le conteneur Docker au port 50000 sur l'hôte Docker. Jenkins utilise ce port en interne pour permettre aux exécuteurs esclaves de construction de se connecter au serveur maître Jenkins.
  • -v /your/home/jenkins:/var/jenkins_home: Mappe le stockage de données Jenkins à votre répertoire local, afin que vous puissiez redémarrer votre conteneur Docker sans perdre vos données.
  • -d: Vous permet d'exécuter le conteneur Docker en mode détaché ou en tant que processus démon.

Ce qui suit montre la sortie pour exécuter ces commandes:

 $ docker run -p 8000:8080 -v /Users/shaines/jenkins/:/var/jenkins_home -d jenkins cc16573ce71ae424d4122e9e4afd3a294fda6606e0333838fe332fc4e11d0d53 

Étant donné que nous exécutons notre conteneur Docker en mode détaché, nous devons suivre les journaux générés par Jenkins. Vous pouvez le faire avec la docker logs -fcommande. Passez simplement les premiers nombres hexadécimaux de l'ID de conteneur, dans ce cas cc16573ce71ae424d4122e9e4afd3a294fda6606e0333838fe332fc4e11d0d53:

 $ docker logs -f cc1 Running from: /usr/share/jenkins/jenkins.war webroot: EnvVars.masterEnvVars.get("JENKINS_HOME") ... ************************************************************* ************************************************************* ************************************************************* Jenkins initial setup is required. An admin user has been created and a password generated. Please use the following password to proceed to installation: 205be6fe69c447dd933a3c9ce7420496 This may also be found at: /var/jenkins_home/secrets/initialAdminPassword ************************************************************* ************************************************************* ************************************************************* 

Configurer Jenkins CI pour une application Web Java

Ensuite, nous allons configurer un travail d'application Web Java simple dans Jenkins. Étant donné que l'application n'est pas importante pour ce didacticiel, nous utiliserons mon exemple d'application simple Hello, World Servlet, que j'ai hébergé sur GitHub.

Pour tester Jenkins, vous devez être en mesure de valider les modifications dans un référentiel de code source, vous devez donc créer ce référentiel maintenant. Sur la page d'accueil de Jenkins, cliquez sur le bouton Créer de nouvelles tâches et entrez le nom de votre projet. Vous serez invité à choisir le type de projet, comme illustré à la figure 5.

Steven Haines

Nous choisirons le type de projet Freestyle pour ce projet, mais vous devez être conscient de vos options:

  • Projet Freestyle: ce type de projet le plus courant vous permet de surveiller un référentiel de code source et d'utiliser n'importe quel système de construction, tel que Maven et Ant.
  • Pipeline: Choose this project type for complicated projects with moving parts that you need to coordinate across multiple build slaves.
  • External job: Use this to configure an automated external job that you want to track in Jenkins as part of your build.
  • Multi-configuration project: This is the job type for projects that require different configurations for different environments, such as production, staging, and test.
  • Folder: When you have a complicated build then you might want to organize things into folders, each with their own distinct namespace.
  • Multi-branch pipeline: automatically create a set of pipeline projects, based on the code branches that are defined in your source code repository

Enter a project name, in this case "hello-world-servlet", and choose "OK". Next, choose GitHub project, then enter the GitHub URL of your project: //github.com/ligado/hello-world-servlet.

Under Source Code Management, choose Git and enter the same project URL.

In the Build Triggers section, choose Build when a change is pushed to GitHub so that Jenkins will build your code anytime you push a change to GitHub.

Dans la section Construire, ajoutez une nouvelle étape de construction, choisissez Invoquer des cibles Maven de niveau supérieur , choisissez l'instance Maven que vous avez configurée précédemment (telle que «Maven 3.3.9») et entrez une installation propre dans le champ objectifs. Laissez les actions post-build vides pour le moment. Lorsque vous avez terminé, appuyez sur Enregistrer .

Lorsque vous revenez au tableau de bord, vous devriez voir un écran similaire à la figure 6.

Steven Haines

Pour tester votre configuration, appuyez sur le bouton Construire maintenant à côté du projet hello-world-servlet. Vous devriez voir une construction exécutée avec succès dans l'historique de construction sur le côté gauche de la page du projet, illustré à la figure 7.

Steven Haines

Pour voir exactement ce qui s'est passé, cliquez sur la construction, puis sur Sortie de la console , qui vous montrera toutes les étapes effectuées par Jenkins et leurs résultats. La sortie de la console est ci-dessous.