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

modifier

L'application Web Jenkins permet de créer des jobs et des vues regroupant plusieurs jobs.

  • /cli/ : commandes shell de paramétrage

Mise à jour

modifier

L'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

modifier

Le 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].
 

On 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

modifier

L'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 :

  •   : Pas d'échec récent,
  •  ,
  •  ,
  •   : Pas de succès récent.

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

modifier

Cliquer 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

modifier

Dans 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

modifier

Sur 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

modifier

Sur 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

modifier

https://stackoverflow.com/questions/56676885/configuring-2-repos-with-jenkins-git-parameter-plugin

Déploiement de test à chaque PR

modifier

Dans 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

modifier

Un pipeline est un enchainement de tâches parallélisables réalisé par Jenkins.

/root/jobs/jobs/Mon_groupe/jobs/Mon_flux/config.xml


Pour 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

modifier

Timeout systématique lors d'un build

modifier

Augmenter 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

modifier

Vé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"

modifier

On 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

modifier

502 Bad Gateway

modifier
service jenkins restart

ERROR: Couldn't find any revision to build

modifier

Parfois 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

modifier

Inutile de cliquer sur "se déconnecter", il faut supprimer dans son navigateur, les cookies et le localStorage.

IOError: [Errno 11] Resource temporarily unavailable

modifier

Quand 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

modifier

L'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

modifier

En 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

modifier

Si 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

modifier

Si 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

modifier

Lors 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

Voir aussi

modifier
Cette page constitue un livre entier. 

Cette page constitue un livre entier.