Introduction
Jenkins est un serveur d’automatisation open source destiné à automatiser les tâches techniques répétitives impliquées dans l’intégration continue et la livraison de logiciels. Avec un écosystème robuste de plugins et un support étendu, Jenkins peut gérer un ensemble diversifié de charges de travail pour construire, tester et déployer des applications.
Dans les guides précédents, nous avons installé Jenkins sur un serveur Ubuntu 22.04 et configuré Jenkins avec SSL en utilisant un proxy inverse Nginx. Dans ce guide, nous allons démontrer comment configurer Jenkins pour tester automatiquement une application lorsque des changements sont poussés vers un dépôt.
Pour ce tutoriel, nous allons intégrer Jenkins avec GitHub afin que Jenkins soit notifié lorsque du nouveau code est poussé vers le dépôt. Lorsque Jenkins est notifié, il va récupérer le code puis le tester à l’intérieur de conteneurs Docker pour isoler l’environnement de test de la machine hôte Jenkins. Nous utiliserons une application Node.js d’exemple pour montrer comment définir le processus CI/CD pour un projet.
Prérequis
Pour suivre ce guide, vous aurez besoin d’un serveur Ubuntu 22.04 avec au moins 1 Go de RAM configuré avec une installation sécurisée de Jenkins. Pour sécuriser correctement l’interface web, vous devrez attribuer un nom de domaine au serveur Jenkins. Suivez ces guides pour apprendre comment configurer Jenkins dans le format attendu :
- Comment installer Jenkins sur Ubuntu 22.04
- Comment installer Nginx sur Ubuntu 22.04
- Comment sécuriser Nginx avec Let’s Encrypt sur Ubuntu 22.04
- Comment configurer Jenkins avec SSL en utilisant un proxy inverse Nginx
Pour mieux contrôler notre environnement de test, nous exécuterons les tests de notre application dans des conteneurs Docker. Après avoir installé et configuré Jenkins, installez Docker sur le serveur en suivant les étapes un et deux de ce guide :
Une fois que vous avez terminé les guides ci-dessus, vous pouvez continuer avec cet article.
Ajoutez l’utilisateur Jenkins au groupe Docker
Après avoir suivi les prérequis, Jenkins et Docker sont tous deux installés sur votre serveur. Cependant, par défaut, l’utilisateur Linux responsable de l’exécution du processus Jenkins ne peut pas accéder à Docker.
Pour remédier à cela, nous devons ajouter l’utilisateur jenkins
au groupe docker
en utilisant la commande usermod
:
Vous pouvez lister les membres du groupe docker
pour confirmer que l’utilisateur jenkins
a été ajouté avec succès:
Outputdocker:x:999:sammy,jenkins
Pour que Jenkins utilise son nouvel appartenance, vous devez redémarrer le processus:
Si vous avez installé Jenkins avec les plugins par défaut, vous devrez peut-être vérifier que les plugins docker
et docker-pipeline
sont également activés. Pour ce faire, cliquez sur Gérer Jenkins dans la barre latérale, puis sur Gérer les plugins dans le menu suivant. Cliquez sur l’onglet Disponible du menu des plugins pour rechercher de nouveaux plugins, et tapez docker
dans la barre de recherche. Si à la fois Docker Pipeline
et Plugin Docker
sont proposés comme options, et qu’ils ne sont pas sélectionnés, sélectionnez-les tous les deux, et lorsque vous y êtes invité, autorisez Jenkins à redémarrer avec les nouveaux plugins activés.
Cela devrait prendre environ une minute et la page se rafraîchira par la suite.
Créez un jeton d’accès personnel dans GitHub
Pour que Jenkins puisse surveiller vos projets GitHub, vous devrez créer un jeton d’accès personnel dans votre compte GitHub.
Commencez par visiter GitHub et connectez-vous à votre compte si ce n’est pas déjà fait. Ensuite, cliquez sur votre icône d’utilisateur dans le coin supérieur droit et sélectionnez Paramètres dans le menu déroulant :
Sur la page qui suit, repérez la section Paramètres du développeur dans le menu de gauche et cliquez sur Jetons d’accès personnels :
Cliquez sur le bouton Générer un nouveau jeton sur la page suivante :
Vous serez dirigé vers une page où vous pourrez définir la portée de votre nouveau jeton.
Dans la zone Description du jeton, ajoutez une description qui vous permettra de le reconnaître ultérieurement :
Dans la section Sélectionner des scopes, cochez les cases repo:status, repo:public_repo et admin:org_hook. Cela permettra à Jenkins de mettre à jour les statuts des commits et de créer des webhooks pour le projet. Si vous utilisez un dépôt privé, vous devrez sélectionner l’autorisation générale repo au lieu des sous-éléments repo :
Lorsque vous avez terminé, cliquez sur Générer le jeton en bas.
Vous serez redirigé vers la page d’index des jetons d’accès personnels et votre nouveau jeton sera affiché :
Copiez le jeton maintenant afin que nous puissions y faire référence ultérieurement. Comme l’indique le message, il n’y a aucun moyen de récupérer le jeton une fois que vous quittez cette page.
Remarque : Comme mentionné dans la capture d’écran ci-dessus, pour des raisons de sécurité, il n’y a aucun moyen de réafficher le jeton une fois que vous quittez cette page. Si vous perdez votre jeton, supprimez le jeton actuel de votre compte GitHub, puis créez-en un nouveau.
Maintenant que vous avez un jeton d’accès personnel pour votre compte GitHub, nous pouvons configurer Jenkins pour surveiller le référentiel de votre projet.
Ajouter le jeton d’accès personnel GitHub à Jenkins
Maintenant que nous avons un jeton, nous devons l’ajouter à notre serveur Jenkins afin qu’il puisse configurer automatiquement des webhooks. Connectez-vous à l’interface web de Jenkins en utilisant le compte administratif que vous avez configuré lors de l’installation.
Cliquez sur votre nom d’utilisateur dans le coin supérieur droit pour accéder à vos paramètres utilisateur, puis cliquez sur Identifiants dans le menu de gauche :
Sur la page suivante, cliquez sur la flèche à côté de (global) dans la portée de Jenkins. Dans la boîte qui apparaît, cliquez sur Ajouter des identifiants :
Vous serez dirigé vers un formulaire pour ajouter de nouveaux identifiants.
Sous le menu déroulant Type, sélectionnez Texte secret. Dans le champ Secret, collez votre jeton d’accès personnel GitHub. Remplissez le champ Description afin de pouvoir identifier cette entrée ultérieurement. Vous pouvez laisser la Portée comme globale et laisser le champ ID vide :
Cliquez sur le bouton OK lorsque vous avez terminé.
Vous pourrez désormais faire référence à ces identifiants à partir d’autres parties de Jenkins pour aider à la configuration.
Configurer l’accès de Jenkins à GitHub
De retour dans le tableau de bord principal de Jenkins, cliquez sur Gérer Jenkins dans le menu de gauche :
Dans la liste des liens sur la page suivante, cliquez sur Configurer le système :
Parcourez les options de la page suivante jusqu’à trouver la section GitHub. Cliquez sur le bouton Ajouter un serveur GitHub puis sélectionnez Serveur GitHub :
La section s’ouvrira pour vous demander des informations supplémentaires. Dans le menu déroulant Identifiants, sélectionnez votre jeton d’accès personnel GitHub que vous avez ajouté dans la dernière section :
Cliquez sur le bouton Tester la connexion. Jenkins effectuera un appel API de test à votre compte et vérifiera la connectivité :
Lorsque vous avez terminé, cliquez sur le bouton Enregistrer pour implémenter vos modifications.
Configurer l’application de démonstration dans votre compte GitHub
Pour démontrer comment utiliser Jenkins pour tester une application, nous utiliserons un programme “hello world” créé avec Hapi.js. Parce que nous configurons Jenkins pour réagir aux poussées vers le dépôt, vous devez avoir votre propre copie du code de démonstration.
Rendez-vous sur le dépôt du projet et cliquez sur le bouton Fork dans le coin supérieur droit pour faire une copie du dépôt dans votre compte :
A copy of the repository will be added to your account.
Le dépôt contient un fichier package.json
qui définit les dépendances d’exécution et de développement, ainsi que la manière d’exécuter la suite de tests incluse. Les dépendances peuvent être installées en exécutant npm install
et les tests peuvent être exécutés à l’aide de npm test
.
Nous avons également ajouté un Jenkinsfile
au dépôt. Jenkins lit ce fichier pour déterminer les actions à exécuter contre le dépôt pour construire, tester ou déployer. Il est écrit en utilisant la version déclarative du DSL de pipeline Jenkins .
Le Jenkinsfile
inclus dans le dépôt hello-hapi
ressemble à ceci :
#!/usr/bin/env groovy
pipeline {
agent {
docker {
image 'node'
args '-u root'
}
}
stages {
stage('Build') {
steps {
echo 'Building...'
sh 'npm install'
}
}
stage('Test') {
steps {
echo 'Testing...'
sh 'npm test'
}
}
}
}
Le pipeline
contient l’ensemble de la définition que Jenkins évaluera. À l’intérieur, nous avons une section agent
qui spécifie où les actions dans le pipeline s’exécuteront. Pour isoler nos environnements du système hôte, nous testerons dans des conteneurs Docker, spécifiés par l’agent docker
.
Étant donné que Hapi.js est un framework pour Node.js, nous utiliserons l’image Docker node
comme base. Nous spécifions l’utilisateur root
dans le conteneur afin que l’utilisateur puisse écrire simultanément à la fois dans le volume attaché contenant le code extrait et dans le volume vers lequel le script écrit sa sortie.
Ensuite, le fichier définit deux étapes, c’est-à-dire des divisions logiques du travail. Nous avons nommé la première “Build” et la deuxième “Test”. L’étape de build imprime un message de diagnostic puis exécute npm install
pour obtenir les dépendances requises. L’étape de test imprime un autre message puis exécute les tests tels que définis dans le fichier package.json
.
Maintenant que vous avez un référentiel avec un Jenkinsfile
valide, nous pouvons configurer Jenkins pour surveiller ce référentiel et exécuter le fichier lorsque des modifications sont introduites.
Créez un nouveau pipeline dans Jenkins
Ensuite, nous pouvons configurer Jenkins pour utiliser le jeton d’accès personnel GitHub pour surveiller notre référentiel.
De retour dans le tableau de bord principal de Jenkins, cliquez sur Nouvel élément dans le menu de gauche :
Entrez un nom pour votre nouveau pipeline dans le champ Entrez un nom d’élément. Ensuite, sélectionnez Pipeline comme type d’élément :
Cliquez sur le bouton OK en bas pour continuer.
À l’écran suivant, cochez la case Projet GitHub. Dans le champ URL du projet qui apparaît, saisissez l’URL du dépôt GitHub de votre projet.
Remarque : Assurez-vous de pointer vers votre fork de l’application Hello Hapi afin que Jenkins ait la permission de configurer des webhooks.
Ensuite, dans la section Déclencheurs de build, cochez la case Déclencheur de crochet GitHub pour le sondage GITScm :
Dans la section Pipeline, nous devons indiquer à Jenkins d’exécuter le pipeline défini dans le fichier Jenkinsfile
de notre dépôt. Changez le type de Définition en Script de pipeline à partir de SCM.
Dans la nouvelle section qui apparaît, choisissez Git dans le menu SCM. Dans le champ URL du dépôt qui apparaît, saisissez à nouveau l’URL de votre fork du dépôt :
Remarque : Encore une fois, assurez-vous de pointer vers votre fork de l’application Hello Hapi.
Remarque : Notre exemple fait référence à un Jenkinsfile
disponible dans un dépôt public. Si votre projet n’est pas accessible publiquement, vous devrez utiliser le bouton ajouter des identifiants pour ajouter un accès supplémentaire au dépôt. Vous pouvez ajouter un jeton d’accès personnel comme nous l’avons fait avec la configuration des crochets précédemment.
Lorsque vous avez terminé, cliquez sur le bouton Enregistrer en bas de la page.
Effectuer une première construction et configurer les webhooks
Jenkins ne configure pas automatiquement les webhooks lorsque vous définissez le pipeline pour le référentiel dans l’interface. Pour déclencher la configuration des hooks appropriés par Jenkins, nous devons effectuer une construction manuelle la première fois.
Sur la page principale de votre pipeline, cliquez sur Construire maintenant dans le menu de gauche :
A new build will be scheduled. In the Build History box in the lower left corner, a new build should appear in a moment. Additionally, a Stage View will begin to be drawn in the main area of the interface. This will track the progress of your testing run as the different stages are completed:
Dans la boîte Historique de construction, cliquez sur le numéro associé à la construction pour accéder à la page de détails de la construction. De là, vous pouvez cliquer sur le bouton Sortie de la console dans le menu de gauche pour voir les détails des étapes qui ont été exécutées :
Cliquez sur l’élément Retour au projet dans le menu de gauche lorsque vous avez terminé afin de revenir à la vue principale du pipeline.
Maintenant que nous avons construit le projet une fois, nous pouvons demander à Jenkins de créer les webhooks pour notre projet. Cliquez sur Configurer dans le menu de gauche du pipeline :
Aucun changement n’est nécessaire sur cette page, il vous suffit de cliquer sur le bouton Enregistrer en bas. Maintenant que Jenkins dispose des informations sur le projet issues du processus de construction initial, il enregistrera un webhook avec notre projet GitHub lorsque vous enregistrerez la page.
Vous pouvez vérifier cela en allant dans votre dépôt GitHub et en cliquant sur le bouton Paramètres. Sur la page suivante, cliquez sur Webhooks dans le menu latéral. Vous devriez voir le webhook de votre serveur Jenkins dans l’interface principale :
Si pour une raison quelconque Jenkins n’a pas réussi à enregistrer le hook (par exemple, en raison de modifications d’API amont ou de pannes entre Jenkins et GitHub), vous pouvez rapidement en ajouter un vous-même en cliquant sur Ajouter un webhook et en vous assurant que l’URL de payload est définie sur https://mon-serveur-jenkins:8080/github-webhook
et que le type de contenu est défini sur application/json
, puis en cliquant à nouveau sur Ajouter un webhook en bas de la fenêtre contextuelle.
Maintenant, lorsque vous poussez de nouveaux changements vers votre dépôt, Jenkins en sera notifié. Il tirera ensuite le nouveau code et le retestera en utilisant la même procédure.
Pour approximer ceci, dans la page de notre dépôt sur GitHub, vous pouvez cliquer sur le bouton Créer un nouveau fichier à gauche du bouton vert Cloner ou télécharger :
Sur la page suivante, choisissez un nom de fichier et un contenu factice :
Cliquez sur le bouton Commit new file en bas lorsque vous avez terminé.
Si vous retournez sur votre interface Jenkins, vous verrez un nouveau build démarrer automatiquement :
Vous pouvez déclencher des builds supplémentaires en effectuant des commits sur une copie locale du dépôt et en la repoussant vers GitHub.
Conclusion
Dans ce guide, nous avons configuré Jenkins pour surveiller un projet GitHub et tester automatiquement les nouveaux changements qui sont validés. Jenkins extrait le code du référentiel, puis exécute les procédures de construction et de test à partir de conteneurs Docker isolés. Le code résultant peut être déployé ou stocké en ajoutant des instructions supplémentaires au même Jenkinsfile
.
Pour en savoir plus sur les actions GitHub, consultez la documentation de GitHub.