wiki/HowtoJenkins.md

304 lines
9.5 KiB
Markdown
Raw Permalink Normal View History

2017-05-09 22:53:41 +02:00
---
categories: dev
title: Howto Jenkins
...
2016-12-29 11:25:39 +01:00
2017-05-09 22:53:58 +02:00
* Documentation : <https://jenkins.io/doc/>
* Ansible : <https://gitea.evolix.org/evolix/ansible-roles/src/branch/stable/jenkins>
* Statut de cette page : test / bookworm
2017-05-09 22:53:58 +02:00
2022-04-05 10:17:04 +02:00
[Jenkins](https://www.jenkins.io/) est un outil open source d'intégration continue écrit
en Java. Jenkins peut fonctionner dans un conteneur de servlets tel
2017-05-09 22:53:58 +02:00
quApache Tomcat, ou en mode autonome avec son propre serveur Web
embarqué.
2016-12-29 11:25:39 +01:00
2022-04-05 10:17:04 +02:00
## Compatibilité des versions
On recommande en :
2022-04-05 10:17:04 +02:00
* Debian 8 avec du Java 7 et une version inférieure à 2.54 de Jenkins
* Debian 9 avec du Java 8 et une version supérieure à 2.54 de Jenkins
* Debian 10 avec du Java 11 et une version supérieure à 2.164.1 de Jenkins
2022-04-05 10:17:04 +02:00
* Debian 11 avec du Java 11 et une version supérieure à 2.332.1 de Jenkins
* Debian 12 avec du Java 17 et une version supérieure à 2.361.1 de Jenkins
2022-04-29 11:57:13 +02:00
Notons qu'il n'est pas compatible avec Java 9 et 10.
2022-04-05 10:17:04 +02:00
## Installation
2016-12-29 11:25:39 +01:00
2022-04-04 15:24:17 +02:00
Jenkins nest pas disponible dans les dépôts Debian, il faut donc ajouter le dépôt comme suit :
2016-12-29 11:25:39 +01:00
~~~
2022-03-22 15:28:46 +01:00
# curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.key | tee \
/etc/apt/keyrings/jenkins-keyring.asc > /dev/null
2022-03-22 15:28:46 +01:00
# echo deb [signed-by=/etc/apt/keyrings/jenkins-keyring.asc] \
2022-03-22 15:28:46 +01:00
https://pkg.jenkins.io/debian-stable binary/ | tee \
/etc/apt/sources.list.d/jenkins.list > /dev/null
2016-12-29 11:25:39 +01:00
~~~
Ensuite on procède à linstallation:
~~~
2017-01-14 00:06:38 +01:00
# apt update
# apt install fontconfig openjdk-17-jre
2022-03-22 15:28:46 +01:00
# apt install jenkins
2016-12-29 11:25:39 +01:00
~~~
2022-04-05 10:17:04 +02:00
## Configuration
2016-12-29 11:25:39 +01:00
2022-04-04 15:24:17 +02:00
Par défaut Jenkins utilise le port 8080, pour modifier cela, il faut modifier le fichier /etc/default/jenkins et modifier la ligne suivante :
2016-12-29 11:25:39 +01:00
~~~
HTTP_PORT=8080
~~~
2022-04-04 15:24:17 +02:00
Le */home* de jenkins se trouve dans :
2016-12-29 11:25:39 +01:00
~~~
/var/lib/jenkins/
~~~
2022-08-26 16:43:14 +02:00
Il faut créer par exemple la clé SSH de jenkins dans ce répertoire, en se connectant avec l'utilisateur jenkins.
2016-12-29 11:25:39 +01:00
~~~
su - jenkins
~~~
Puis générer la clé SSH.
2022-08-26 16:43:14 +02:00
~~~
ssh-keygen -t ed25519
~~~
2022-04-05 10:17:04 +02:00
### Modifier le répertoire temporaire de Jenkins
Souvent la partition /tmp est en noexec, ce qui pose des problèmes a Jenkins lors d'un clonage de dépôt où il y a besoin dexécuter un script sh
On peut modifier le dossier tmp dans */var/lib/jenkins/tmp* et bien donner comme propriétaire *jenkins:jenkins* au dossier *tmp*
2022-04-04 15:24:17 +02:00
Il faut ensuite mettre la configuration suivant dans */etc/default/jenkins* :
~~~
# use a different tmpdir for jenkins
JAVA_ARGS="$JAVA_ARGS -Djava.io.tmpdir=/var/lib/jenkins/tmp/"
~~~
2022-04-04 15:24:17 +02:00
Pour le que dossier *tmp* soit vidé au redémarrage de la machine, comme un vrai dossier /tmp, il faut le monter en *tmpfs* dans */etc/fstab* :
~~~
tmpfs /var/lib/jenkins/tmp tmpfs defaults,nosuid,nodev,size=1024m 0 0
~~~
2022-04-05 10:17:04 +02:00
### Configuration Reverse proxy Apache en HTTPS
Voici une configuration d'un VirtualHost Apache pour proxyfier Jenkins en HTTPS (nécessite dactiver les modules ``proxy`` et ``proxy_http`` dApache) :
2022-04-04 15:24:17 +02:00
~~~ apache
<VirtualHost *:80>
2019-01-08 10:20:44 +01:00
ServerName jenkins.domaine.com
Redirect permanent / https://jenkins.domaine.com/
</VirtualHost>
<VirtualHost *:443>
2019-01-08 10:20:44 +01:00
ServerName jenkins.domaine.com
ServerAdmin webmaster@localhost
<Directory proxy:http://localhost:8080/*>
Require all granted
</Directory>
ProxyRequests Off
ProxyPreserveHost On
AllowEncodedSlashes NoDecode
<Location />
ProxyPass http://localhost:8080/ nocanon retry=0
ProxyPassReverse http://localhost:8080/
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
</Location>
CustomLog /var/log/apache2/access_jenkins.log combined
ErrorLog /var/log/apache2/error_jenkins.log
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCertificateFile /etc/ssl/certs/foo.crt
SSLCertificateKeyFile /etc/ssl/private/bar.key
SSLCertificateChainFile /etc/ssl/certs/DigiCertCA.crt
</VirtualHost>
~~~
2022-04-05 10:17:04 +02:00
## Dépannage
### Problème de configuration de Reverse Proxy
2019-01-08 10:20:44 +01:00
Si sur la page d'administration de Jenkins l'erreur suivante apparaîtra :
~~~
La configuration de votre proxy inverse n'est pas bonne
~~~
2019-01-08 10:20:44 +01:00
Il faut configurer le ProxyPass avec l'option _nocanon_ comme ceci :
2022-07-13 09:59:58 +02:00
~~~ apache
<Location />
ProxyPass http://localhost:8080/ nocanon
ProxyPassReverse http://localhost:8080/
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
</Location>
~~~
2022-04-28 18:20:11 +02:00
Si une réponse 403 est renvoyée lors de lenvoi dun formulaire, activer
loption de compatibilité (« Enable proxy compatibility ») de protection
CSRF dans « Manage Jenkins > Security > Configure Global Security > CSRF
Protection » (ou « Administrer Jenkins -> Sécurité -> Configurer la
sécurité globale -> CSRF Protection -> Activer la compatibilité proxy »)
peut aider.
2022-04-28 18:20:11 +02:00
## Agents
Lexécution des tests ne devrait pas être réalisée sur le nœud intégré,
il faut donc paramétrer des agents, qui seront connectés au contrôleur
dont linstallation vient dêtre décrite.
Cest sur ces nœuds que sexécuterons effectivement les tests.
### Installation
Daprès le [projet amont](https://www.jenkins.io/doc/book/using/using-agents/#environment),
Java est nécessaire pour faire fonctionner les agents (mais il y a moyen
de sen passer comme décrit par
2022-04-29 11:57:13 +02:00
[Debian](https://salsa.debian.org/qa/jenkins.debian.net/-/blob/master/INSTALL)).
2022-04-28 18:20:11 +02:00
2022-04-29 11:57:13 +02:00
Docker est pratique aussi pour certaines constructions. Cela nécessite
linstallation des plugins
[Docker](https://plugins.jenkins.io/docker-plugin/) et
[Docker Pipeline](https://plugins.jenkins.io/docker-workflow/) sur le
contrôleur.
2022-04-28 18:20:11 +02:00
~~~
# apt install default-jre-headless docker.io
~~~
### Configuration
Création de lutilisateur que linstance principale contactera pour
exécuter les tests.
~~~
# adduser --disabled-password jenkins
2023-11-17 10:16:42 +01:00
# adduser jenkins docker
2022-04-28 18:20:11 +02:00
~~~
Ajouter la partie publique de la clef configurée précédemment à
`~jenkins/.ssh/authorized_key`. Il peut être intéressant de vérifier
que lon arrive bien à se connecter depuis le contrôleur à lagent
par SSH dès maintenant.
#### Déclarer lagent dans le contrôleur
Le nœud peut maintenant être ajouté depuis linterface web de Jenkins.
~~~
Build Executor Status (en bas à gauche)
> New node (en haut à gauche)
> Node name (configurer un nom explicite, par exemple celui de la machine)
> Type > Permanent Agent
> Create
> Remote root directory > /home/jenkins
> Launch method > Launch agents via SSH
> Host > nom de la machine (FQDN)
> Crédentials > Add
> Kind > SSH Username with private key
> Username > jenkins
> Private key > Enter directly > Add > La clef privée déjà créé sur la machine
> Save
~~~
2022-04-29 11:57:13 +02:00
## Lien avec une forge
Maintenant que lagent est connecté, il est possible de configurer une
forge contenant les dépôts que lon souhaite tester.
Pour se connecte à Gitea (par exemple), linstallation dun
[plugin Gitea](https://plugins.jenkins.io/gitea/) est
2022-04-29 11:57:13 +02:00
nécessaire. Cela peut être réalisé dans linterface web de Jenkins.
~~~
Manage Jenkins
> Manage Plugins
> Available
> Search > Gitea
> Gitea Plugin (cocher la case de la colonne « Install » initiale)
> Install without restart
> Restart Jenkins when installation is complete and no jobs are running
~~~
Dans Gitea, il faut créer un utilisateur (par exemple « jenkins ») et
lui donner accès aux organisations et dépôts que lon souhait tester
(par exemple en lajoutant aux équipes existantes, ou en créant une
nouvelle équipe, par exemple « ci »).
Une fois connecté en tant que ce nouvel utilisateur dans Gitea, il faut
créer un jeton.
~~~
Profiles and Settings… (tout en haut à droite)
> Settings
> Applications
> Manage Access Tokens > Generate Token (noter le jeton)
~~~
Dans Jenkins, lorganisation correspondante peut être créée et associée.
~~~
New Item
> Enter an item name (par exemple lURL de la forge)
> Organisation Folder
> OK
> Projects
> Repository Sources
> Add
> Gitea Organization
> Credentials
> Add
> Kind
> Gitea Personnal Access Token
> Token (choisir le jeton qui vient dêtre défini)
2022-04-29 11:57:13 +02:00
> Add
> Owner (indiquer le nom dutilisateur correspondant à lespace qui sera surveillé, exécuté…)
2022-04-29 11:57:13 +02:00
> Save
~~~
Dans Jenkins, tous les dépôts de lutilisateur précédent peuvent être surveillés, et tout ceux contenant un fichier `.Jenkinsfile` (`Jenkinsfile` par défaut, le choix ici est de rendre le fichier caché comme dans de nombreux autres outils de CI) seront automatiquement testés. Il faut préalablement sélectionner lorganisation précédente.
[Basic Branch Build
Strategies](https://plugins.jenkins.io/basic-branch-build-strategies/)
permet de déclencher les constructions à base de tags.
~~~
Configure
> Projects
> Repository Sources
> Gitea Organization
> Behaviours > Add > Discover Tags
> Project Recognizers > Pipeline Jenkinsfile > Script Path > .Jenkinsfile
> Build strategies > Add > Tags
> Build strategies > Add > Regular branches (sinon on ne construit plus grand chose…)
~~~
Si nécessaire (par exemple si les évènements capturés sont insuffisant), il est possible daugmenter la fréquence de de découverte des dépôts, branches et fichiers `.Jenkinsfile` dans le même menu.
~~~
Configure
> Scan Gitea Organization Triggers
> 5 minutes
> Child Scan Triggers
> 5 minutes
~~~