Login Logout

Howto Jenkins

Jenkins est un outil open source d’intégration continue qui est écrit en Java, Jenkins peut fonctionner dans un conteneur de servlets tel qu’Apache Tomcat, ou en mode autonome avec son propre serveur Web embarqué.

Installation

Jenkins n’est pas disponible dans les dépôts Debian, il faut donc ajouter le dépôt comme suit:

wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'

Ensuite on procède à l’installation:

# apt update
apt install jenkins

Configuration

Par défaut Jenkins utilise le port 8080, pour modifier cela, il faut modifier le fichier /etc/default/jenkins et modifier la ligne suivante:

HTTP_PORT=8080

Le /home de jenkins se trouve dans:

/var/lib/jenkins/

Il faut créer par exemple la clé ssh de jenkins dans ce répertoire, en se connectant avec l’utilisateur jenkins en faisant:

su - jenkins

Puis générer la clé SSH.

Modifier le repertoire 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 d’exé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

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/"

Pour le que dossier tmp soit vider 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

Configuration Reverse proxy Apache en https

Voici une configuration d’un VirtualHost Apache pour proxyfié Jenkins en https :

<VirtualHost *:80>
    ServerName jenkins.domaine.com
    Redirect permanent / https://jenkins.domaine.com/
</VirtualHost>
<VirtualHost *:443>
    ServerName jenkins.domaine.com
    ServerAdmin webmaster@localhost

    <Directory proxy:http://localhost:8080/*>
        Order deny,allow
        Allow from all
    </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/cert/foo.crt
    SSLCertificateKeyFile /etc/ssl/private/bar.key
    SSLCertificateChainFile /etc/ssl/cert/DigiCertCA.crt

</VirtualHost>

Générer un “Crumb” pour la protection CSRF (Cross Site Request Forgery) de Jenkins

Depuis Jenkins 2.X la protection CSRF est activé par défaut. Si on administre Jenkins en passant par un reverse proxy Apache ou Nginx, on doit générer un Crumb avec l’utilisateur admin de Jenkins comme ceci :

Avec une requête curl :

# curl -u "admin_user:password" 'http://localhost:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'

Avec une requête wget :

# wget --user=admin_user --password=password --auth-no-challenge -q --output-document - 'http://localhost:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'

Si on passe par un reverse proxy, il ne faut pas oublier de cocher l’option sur l’interface web dans Administrer Jenkins -> Configurer la sécurité globale -> CSRF Protection -> Activer la compatibilité proxy

Problème de configuration de Reverse Proxy

Si sur la page d’administration de Jenkins l’erreur suivante apparaîtra :

La configuration de votre proxy inverse n'est pas bonne

Il faut configurer le ProxyPass avec l’option nocanon comme ceci :

<Location />
        ProxyPass http://localhost:8080/ nocanon
        ProxyPassReverse http://localhost:8080/
        RequestHeader set X-Forwarded-Proto "https"
        RequestHeader set X-Forwarded-Port "443"
 </Location>