Emplacement Home Jenkins

De EjnTricks

Jenkins utilise un répertoire de travail pour stocker l'ensemble des configurations et fichiers liés à l'instance. Par défaut, ce répertoire se situe dans le répertoire .jenkins dans le répertoire d'exécution.

Cet article présente une façon de paramétrer l'emplacement pour une installation sous Ubuntu et Tomcat.


Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


Study icon.png Analyse

Lors de la montée de version 17.10 Ubuntu, l'instance de Jenkins ne démarrait plus avec le message d'erreur suivant.

Unable to create the home directory ‘/var/lib/tomcat8/.jenkins’. This is most likely a permission problem.

To change the home directory, use JENKINS_HOME environment variable or set the JENKINS_HOME system property. See Container-specific documentation for more details of how to do this.

Des modifications sur les variables d'environnement de Tomcat ont été réalisées, changeant l'emplacement d'exécution de Tomcat. Il a donc été nécessaire de modifier l'emplacement dans le script setenv.sh de Tomcat, comme décrit ici.


Icon-Configuration-Settings.png Déclaration emplacement

Afin de spécifier l'emplacement, il suffit de positionner la variable d'environnement JENKINS_HOME en modifiant le script ainsi.

#!/bin/sh

export CATALINA_OPTS="-Xms256m -Xmx512m"

export MAVEN_OPTS="-Xmx512m"

export JAVA_OPTS="$JAVA_OPTS -DJENKINS_HOME=$CATALINA_HOME/.jenkins"

A noter l'utilisation de la variable CATALINA_HOME qui correspond à /usr/share/tomcat8.


Warning-icon.png Mise jour Ubuntu 17.10

Suite à la mise à jour de Ubuntu 17.10, les variables d'environnement CATALINA_BASE et CATALINA_HOME ont été mises à jour. Cela a eu pour impact une modification de l'emplacement home de Jenkins , passant de /usr/share/tomcat8/.jenkins vers /var/lib/tomcat8/.jenkins.

Un premier essai a consisté à modifier l'emplacement du home en positionnant la variable d'environnement JENKINS_HOME dans le script de démarrage de Tomcat, pour conserver le précédent emplacement, soit /usr/share/tomcat8/.jenkins. Mais certains plugins ne semblent pas utiliser correctement cette configuration, comme l'ateste la trace suivante.

[workspace] $ java -Dcobertura.report.format=xml -cp /usr/share/tomcat8/.jenkins/plugins/maven-plugin/WEB-INF/lib/maven33-agent-1.12-alpha-1.jar:
/var/opt/maven/boot/plexus-classworlds-2.5.2.jar:/var/opt/maven/conf/logging jenkins.maven3.agent.Maven33Main /var/opt/maven 
/var/lib/tomcat8/webapps/jenkins/WEB-INF/lib/remoting-3.13.jar /usr/share/tomcat8/.jenkins/plugins/maven-plugin/WEB-INF/lib/maven33-interceptor-1.12-alpha-1.jar 
/usr/share/tomcat8/.jenkins/plugins/maven-plugin/WEB-INF/lib/maven3-interceptor-commons-1.12-alpha-1.jar 45235
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at jenkins.maven3.agent.Maven33Main.main(Maven33Main.java:135)
at jenkins.maven3.agent.Maven33Main.main(Maven33Main.java:64)
Caused by: java.io.IOException: Failed to initialize the default JAR Cache location
at hudson.remoting.JarCache.getDefault(JarCache.java:41)
at hudson.remoting.ChannelBuilder.withJarCacheOrDefault(ChannelBuilder.java:216)
at hudson.remoting.Launcher.main(Launcher.java:735)
at hudson.remoting.Launcher.main(Launcher.java:723)
at hudson.remoting.Launcher.main(Launcher.java:714)
at hudson.remoting.Launcher.main(Launcher.java:710)
... 6 more
Caused by: java.lang.IllegalArgumentException: Root directory not writable: /var/lib/tomcat8/.jenkins/cache/jars
at hudson.remoting.FileSystemJarCache.<init>(FileSystemJarCache.java:58)
at hudson.remoting.JarCache.getDefault(JarCache.java:39)
... 11 more
Caused by: java.nio.file.AccessDeniedException: /var/lib/tomcat8/.jenkins
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:384)
at java.nio.file.Files.createDirectory(Files.java:674)
at java.nio.file.Files.createAndCheckIsDirectory(Files.java:781)
at java.nio.file.Files.createDirectories(Files.java:767)
at hudson.remoting.Util.mkdirs(Util.java:231)
at hudson.remoting.FileSystemJarCache.<init>(FileSystemJarCache.java:56)
... 12 more

Pour y palier, un lien a été mis en place sous /var/lib/tomcat8.

#sudo ln -s /usr/share/tomcat8/.jenkins /var/lib/tomcat8/.jenkins
#sudo chown -h tomcat8:tomcat8 /var/lib/tomcat8/.jenkins

Une seconde solution serait de déplacer le répertoire .jenkins vers /var/lib/tomcat afin de respecter les attentes. Cependant, les emplacements sont parfois mis en dur dans les fichiers de configuration, comme indiqué lors de l'étude du déplacement d'instance.

Dans un premier temps, le répertoire est copié, permettant d'avoir une sauvegarde, vers la cible. A noter la suppression préalable, car un lien avait été mis en place sur l'ancien emplacement.

#sudo rm /var/lib/tomcat8/.jenkins
#sudo cp -pR /usr/share/tomcat8/.jenkins /var/lib/tomcat8/.jenkins

Puis la variable d'environnement JENKINS_HOME est modifiée dans le script setenv.sh de Tomcat.

#!/bin/sh

export CATALINA_OPTS="-Xms256m -Xmx512m"

export MAVEN_OPTS="-Xmx512m"

export JAVA_OPTS="$JAVA_OPTS -DJENKINS_HOME=$CATALINA_BASE/.jenkins"

Enfin, il faut mettre à jour les différents fichiers de paramétrage, de l'instance ou des jobs, pour spécifier le nouvel emplacement. Pour cela, les commandes find et sed seront combinées.

#sudo find /var/lib/tomcat8/.jenkins/ -name '*.xml' -exec sed -i 's/\/usr\/share\/tomcat8\/.jenkins/\/var\/lib\/tomcat8\/.jenkins/g' {} \;