# Jenkins

Jenkins est un outil d'intégration continue, open source en Java. 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
### IHM

L'application Web Jenkins permet de créer des jobs et des vues regroupant plusieurs jobs.
* /cli/ : commandes shell de paramétrage

## Mise à jour

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 :

## Plugins

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.

# Jobs

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

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

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

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

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

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.

## Déploiement multi-dépôt

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

## Déploiement de test à chaque PR

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

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

## Vues

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
## Timeout systématique lors d'un build

Augmenter la durée du timeout :

## Un job qui doit se lancer à chaque PR ne se lance pas

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"

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
### ERROR: Couldn't find any revision to build

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

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

### IOError: [Errno 11] Resource temporarily unavailable

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

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.

### pending - Jenkins job is waiting for next available executor

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

Si la branche Git sélectionnée n'est pas celle déployée, c'est une fuite de mémoire.
Il faut mettre à jour Jenkins.

### reference is not a tree

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 :

### There’s no agent/cloud that matches this assignment

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

* ↑ 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

## Voir aussi

* GitLab CI/CD
Cette page constitue un livre entier.