Jenkins
Jenkins est un outil d'intégration continue, open source en Java[1]. Il peut servir par exemple à lancer des pipelines automatiquement ou manuellement, déployer du code sur des serveurs ou exécuter des tâches planifiées.
Installation
modifierIHM
modifierL'application Web Jenkins permet de créer des jobs et des vues regroupant plusieurs jobs.
- /cli/ : commandes shell de paramétrage
Mise à jour
modifierL'IHM affiche les mises à jour disponibles dans "Administrer Jenkins" (/manage). En cliquant dessus, on télécharge un .war qu'il suffit de déposer à la place de l'ancien[2] :
mv /usr/lib/jenkins/jenkins.old.war
mv /downloads/jenkins.war /usr/lib/jenkins/
systemctl stop jenkins
systemctl start jenkins
systemctl status jenkins
Plugins
modifierLe menu "Plugin Manager" (/pluginManager) répertorie les versions des plugins installées et disponibles.
- Git : récupération des branches à déployer en cliquant dessus. shallow clone
- ConfigHistory : versioning des jobs[3].
Jobs
modifierOn distingue plusieurs types de jobs : ceux qui se lancent périodiquement et ceux qui sont déclenchés par un évènement extérieur. Parmi ces dernier, on trouve des lancements manuels ou des hooks de forge logicielle (ex : création de pull request, merge, etc.).
Tableau de bord
modifierL'interface web liste les jobs configurés avec le nom du job, l'état de sa dernière exécution, le temps depuis celle-ci selon son état (temps depuis dernier succès et temps depuis dernier échec), la durée de la dernière exécution, et la tendance de réussite.
La tendance d'exécution indique l'état (succès ou échec) des dernières exécution avec une image météorologique :
Cela indique si le job est stable, ou si l'exécution est instable, pouvant aboutir à un succès ou un échec de manière incertaine.
La dernière colonne contient également un bouton par job permettant de le lancer manuellement. Durant l'exécution d'un job, sa progression est indiquée graphiquement, basée sur la durée de la précédente exécution.
Hello World
modifierCliquer sur Nouveau Item et tout en bas dans le paragraphe Build, rubrique Exécuter un script shell, taper "echo Hello World!". Sauvegarder et lancer le build.
Quand on sauvegarde un item avec une erreur de syntaxe, Jenkins le refuse sans rien sauvegarder (et on ne peut pas retrouver ses modifications en retournant en arrière).
Déploiement simple
modifierDans un nouvel item, renseigner les identifiants de sa forge logicielle dans Gestion de code source.
On peut ensuite renseigner la branche que le système de gestion de versions va cloner. Par exemple si c'est Git, Jenkins lancera automatiquement un git clone
à chaque lancement du job. On peut sélectionner la branche à cloner à chaque lancement, en cochant Ce build a des paramètres, Parameter Type = "branch".
Vers Linux
modifierSur Linux cela peut être fait en SSH ou SCP. Ajouter les commandes à jouer Dans le paragraphe "Build" du job, "Exécuter un script shell".
Vers Windows
modifierSur Windows il faut préalablement lancer un service slave Jenkins (appelé "agent") sur la machine cible, qui acceptera le déploiement en passant par un nœud.
- Sur le serveur Jenkins, dans /computer, créer un nœud.
- Sur la machine cible, deux solutions :
- Si Jenkins slave ne doit pas se lancer à chaque redémarrage, exécuter la commande décrite dans /computer (en y téléchargeant le .jar et le .jnlp.
- Télécharger les .exe depuis http://repo.jenkins-ci.org/releases/com/sun/winsw/winsw/ pour installer un service qui se lancera automatiquement à chaque reboot[4].
Déploiement multi-dépôt
modifierhttps://stackoverflow.com/questions/56676885/configuring-2-repos-with-jenkins-git-parameter-plugin
Déploiement de test à chaque PR
modifierDans le paragraphe Ce qui déclenche le build, cocher votre forge logicielle (ex : GitHub ou Stash).
Le job se lancera ensuite selon les actions déterminées dans le paragraphe, par exemple une création de PR et une commande dans la PR "deploy".
Pour qu'il se lance lors d'un merge, ...
Pipeline
modifierUn pipeline est un enchainement de tâches parallélisables réalisé par Jenkins.
Backup
modifier/root/jobs/jobs/Mon_groupe/jobs/Mon_flux/config.xml
Vues
modifierPour superviser un groupe de jobs (et éviter de trop utiliser le moteur de recherche), ils peuvent être listés dans des vues. Pour ce faire, une fois la vue créée, lui ajouter chaque job (en cochant de les rechercher dans les sous-répertoires).
Cela peut aussi être réalisé par une expression régulière.
Problèmes connus
modifierTimeout systématique lors d'un build
modifierAugmenter la durée du timeout :
vim /etc/default/jenkins
JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT --sessionTimeout=1440 --sessionEviction=43200"
Un job qui doit se lancer à chaque PR ne se lance pas
modifierVérifier que le compte utilisé par Jenkins dans le job ait bien les droits de lecture dans le dépôt sur la forge.
Un job se lance régulièrement avec "Started by SCM change"
modifierOn peut définir des branches Git par défaut inexistantes, pour éviter que ce bug écrase des déploiements manuels.
Mais il est dû dans le menu /configure, au champ Nombre de tentatives de checkout SCM > 0.
Messages d'erreur
modifier502 Bad Gateway
modifierservice jenkins restart
ERROR: Couldn't find any revision to build
modifierParfois Jenkins ne communique pas bien avec la forge Git. Il suffit alors de relancer le build.
Si ça ne marche toujours pas, le compte de Jenkins est peut-être verrouillé dans la forge, ou il y a eu un commit --amend
qui est mal passé.
HTTP ERROR 403 No valid crumb was included in the request
modifierInutile de cliquer sur "se déconnecter", il faut supprimer dans son navigateur, les cookies et le localStorage.
IOError: [Errno 11] Resource temporarily unavailable
modifierQuand Jenkins lance un script Python, son buffer d'affichage en console sature à un millier de lignes environ (pour chaque commande). Il faut donc exécuter les commandes concernées en mode moins verbeux.
Failing to obtain https://mon_jenkins.example.com/computer/mon_server/slave-agent.jnlp?encrypt=true java.net.ConnectException: Connection timed out: connect
modifierL'agent Jenkins slave sur Windows (JNLP) ne parvient pas à se connecter à Jenkins. Cela peut être dû à un port bloqué dans le pare-feu Windows, dans le réseau, ou s'il y a un load balancer ou un ha-proxy il faut lancer Jenkins en ha mode ou les éviter en passant par un tunnel[5].
pending - Jenkins job is waiting for next available executor
modifierEn français "En attente du prochain exécuteur disponible".
Aller dans "Administrer Jenkins", "Configurer le système", et augmenter le nombre d'exécuteurs.
Sinon, mettre à jour les plugins et patienter (jusqu'à une heure).
possible memory leak due to Git plugin usage
modifierSi la branche Git sélectionnée n'est pas celle déployée, c'est une fuite de mémoire[6].
Il faut mettre à jour Jenkins.
reference is not a tree
modifierSi un job qui marchait ne marche plus soudainement et renvoie cette erreur, c'est que le plugin Git qui communique avec la forge logicielle se perd dans la sélection du commit à checkouter et tente d'en prendre un autre.
Dans "Avancé", renseigner la case "Refspec" avec :
+refs/heads/*:refs/remotes/mon_projet/*
There’s no agent/cloud that matches this assignment
modifierLors de la création d'un build, le champ "Restreindre où le projet peut être exécuter" ne correspond pas à un serveur connu dans la page /computer/.
Références
modifier- ↑ https://github.com/jenkinsci/jenkins
- ↑ https://www.thegeekstuff.com/2016/06/upgrade-jenkins-and-plugins/
- ↑ https://wiki.jenkins.io/display/JENKINS/JobConfigHistory+Plugin
- ↑ https://hayato-iriumi.net/2019/05/23/how-to-install-jenkins-slave-as-windows-service/
- ↑ https://support.cloudbees.com/hc/en-us/articles/218097237-dedicated-JNLP-agents-formerly-slaves-are-not-able-to-connect
- ↑ https://wiki.jenkins.io/display/JENKINS/Remove+Git+Plugin+BuildsByBranch+BuildData