web-dev-qa-db-fra.com

Variables d'environnement Jenkins/Hudson

J'exécute Jenkins à partir de l'utilisateur jenkins qui a $PATH défini sur quelque chose et lorsque je vais dans l'interface Web Jenkins, dans Propriétés système window (http://$Host/systemInfo), je vois un $PATH différent.

J'ai installé Jenkins sur Centos avec le site natif de Jenkins. J'utilise le script de démarrage fourni avec l'installation à l'aide de Sudo /etc/init.d/jenkins start

Quelqu'un peut-il m'expliquer s'il vous plaît pourquoi cela se produit?

93
Michael

Michael,

Deux choses:

Lorsque Jenkins se connecte à un ordinateur, il passe dans le shell sh et non pas le shell bash (du moins, c'est ce que j'ai remarqué - je peux me tromper). Ainsi, les modifications que vous apportez à $ PATH dans votre fichier bashrc ne sont pas prises en compte.

En outre, toutes les modifications que vous apportez à $ PATH dans votre shell local (celui dans lequel vous êtes personnellement introduit) n'apparaîtront pas dans Jenkins.

Pour changer le chemin utilisé par Jenkins, vous avez deux options (autant que je sache):

1) Editez votre fichier /etc/profile et ajoutez les chemins que vous voulez y

2) Accédez à la page de configuration de votre esclave et ajoutez la variable d'environnement PATH, avec la valeur: $PATH:/followed-by/paths/you/want/to/add

Si vous utilisez la deuxième option, vos informations système ne seront toujours pas affichées, mais vos versions verront les chemins ajoutés. 

131
Sagar

J'ai continué à rencontrer ce problème, mais maintenant je viens d'ajouter:

source /etc/profile

En tant que première étape de mon processus de construction. Maintenant, toutes mes règles suivantes sont chargées pour que Jenkins puisse fonctionner correctement.

34
bryan kennedy

Vous pouvez également éditer le fichier /etc/sysconfig/jenkins pour apporter des modifications aux variables d'environnement, etc. J'ai simplement ajouté source /etc/profile à la fin du fichier. /etc/profile a toutes les variables PATH appropriées. Lorsque vous faites cela, assurez-vous de redémarrer Jenkins

/etc/init.d/jenkins restart

Nous utilisons ZendServer CE, qui installe pear, phing, etc. dans un chemin différent, ce qui nous a été utile. De plus, nous n'obtenons pas les erreurs LD_LIBRARY_PATH que nous obtenions auparavant avec le client Oracle et Jenkins.

19
dbiehl

J'ai essayé /etc/profile, ~/.profile et ~/.bash_profile et aucun de ceux qui ont fonctionné. J'ai trouvé l'édition ~/.bashrc pour le compte esclave Jenkins.

13
mmacvicar

Les informations sur cette réponse sont obsolètes. Vous devez aller dans Configurer Jenkins>. Vous pouvez ensuite cliquer pour ajouter une paire clé de valeur de variable d’environnement à partir de là.

exemple: export MYVAR=test serait MYVAR est la clé et test est la valeur.

9
TJ Biddle

Sur ma nouvelle instance EC2, ajouter simplement la nouvelle valeur au chemin d'accès du fichier .profile de l'utilisateur Jenkins, puis redémarrer Tomcat a fonctionné pour moi.

Sur une instance plus ancienne où la configuration est différente, utiliser # 2 dans la réponse de Sagar était la seule chose qui fonctionnait (c'est-à-dire .profile, .bash * ne fonctionnait pas).

5
Rob Barreca

Ne pourriez-vous pas simplement l'ajouter en tant que variable d'environnement dans les paramètres Jenkins:

Gérer Jenkins -> Propriétés globales> Variables d’environnement: .__ Et cliquez ensuite sur "Ajouter" pour ajouter une propriété PATH et sa valeur à vos besoins.

5
Kiarash Zamanifar

J'ai trouvé deux plugins pour cela . L'un charge les valeurs d'un fichier et l'autre vous permet de configurer les valeurs dans l'écran de configuration du travail.

Plugin Envfile - Ce plugin vous permet de définir des variables d'environnement via un fichier. Le format du fichier doit être le format de fichier de propriétés Java standard. 

Plugin EnvInject - Ce plugin permet d'ajouter des variables d'environnement et d'exécuter un script de configuration afin de configurer un environnement pour le Job.

4
Vicro

Voici comment j'ai résolu ce problème ennuyeux:

J'ai changé la variable PATH comme l'a suggéré @sagar dans sa deuxième option, mais j'ai quand même eu une valeur PATH différente de celle à laquelle je m'attendais.

Finalement, j'ai découvert que c'était le plugin EnvInject qui remplaçait ma variable PATH!

Je pourrais donc désinstaller EnvInject ou simplement l’utiliser pour injecter la variable PATH.

Comme beaucoup de nos travaux Jenkins utilisent ce plugin, je ne voulais pas le désinstaller ...

J'ai donc créé un fichier: environment_variables.properties sous mon répertoire personnel Jenkins.

Ce fichier contenait la valeur de l’environnement du chemin dont j’avais besoin: PATH=$PATH:/usr/local/git/bin/.

À partir de l'interface Web Jenkins: Manage Jenkins -> Configure System. Dans cet écran, j'ai coché l'option Prepare jobs environment et, dans le champ Properties File Path, le chemin de mon fichier: /var/lib/jenkins/environment_variables.properties.

Ainsi, chaque travail Jenkins que nous avons reçoit toutes les variables que je mets dans ce fichier environment_variables.properties.

4
ofirbt

Je n'ai eu des progrès sur cette question qu'après "/etc/init.d/jenkins force-reload". Je recommande d'essayer cela avant toute chose, et de l'utiliser plutôt que de redémarrer.

2
Rene Wooller

Jenkins prend également en charge le format PATH+<name> pour ajouter une variable à une variable, pas seulement PATH:

Variables d'environnement global ou noeud Variables d'environnement:

 Jenkins variable + notation

Ceci est également pris en charge dans l’étape de pipeline withEnv:

node {
  withEnv(['PATH+Java=/path/to/Java/bin']) {
    ...
  }
}

Il suffit de prendre note, il prédomine à la variable. Si cela doit être ajouté, vous devez faire ce que les autres réponses montrent. 

Voir le document sur les étapes du pipeline ici .

Vous pouvez également utiliser la syntaxe PATH + WHATEVER =/quelque chose à ajouter/quelque chose à $ PATH

Ou la documentation Java sur EnvVars ici .

2
The Badger

Sur mon Ubuntu 13.04, j’ai essayé quelques petites modifications avant de réussir:

  1. Éditez /etc/init/jenkins.conf
  2. Localisez l'endroit où "exec start-stop-server ..." commence
  3. Insérez la mise à jour de l’environnement juste avant cela, c’est-à-dire.

export PATH = $ PATH:/some/new/path/bin

2
Stabledog

Ajouter 

/usr/bin/bash

à 

Jenkins -> Manage Jenkins -> configure System -> Shell-> Shell exécutable

Jenkins utilise le sh pour que même/etc/profile ne fonctionne pas pour moi Quand j'ajoute cela, j'ai tout l'env.

1
sumang_87

Solution qui a fonctionné pour moi

source ~/.bashrc

Explication

J'ai d'abord vérifié que Jenkins utilisait BASH, avec echo $Shell et echo $BASH (remarque: je place explicitement #!/bin/bash au sommet de la zone de texte de Jenkins, je ne suis pas sûr que ce soit nécessaire pour obtenir BASH). sourceing /etc/profile comme d'autres l'ont suggéré ne fonctionnait pas.

En regardant /etc/profile j'ai trouvé

if [ "$PS1" ]; then
...

et inspectant "$ PS1" le trouva null. J'ai essayé d'usurper $PS1 en vain comme

export PS1=1
bash -c 'echo $PATH'

cependant, cela n'a pas produit le résultat souhaité (ajoutez le reste du $PATH que je m'attends à voir). Mais si je dis à bash d'être interactif

export PS1=1
bash -ci 'echo $PATH'

le $PATH a été modifié comme prévu.

J'essayais de comprendre comment usurper correctement un shell interactif pour obtenir le chargement de /etc/bash.bashrc. Cependant, il s'avère que tout ce dont j'avais besoin était dans ~/.bashrc, si simplement sourceing résolvait le problème.

1
quickshiftin

J'ai essayé toutes les choses d'en haut - cela n'a pas fonctionné pour moi.

J'ai trouvé deux solutions (les deux pour SSH-Slave)

  1. Aller aux réglages de l'esclave

  2. Ajouter une nouvelle variable d'environnement

  3. CHEMIN
  4. $ {PATH}: $ {HOME} /. Pub-cache/bin: $ {HOME} /. Local/bin

La partie "$ {HOME}" est importante. Cela rend le chemin supplémentaire absolu . Le chemin relatif ne fonctionnait pas pour moi.

Option II (script de pipeline)

pipeline {
    agent {
        label 'your-slave'
    }
    environment {
        PATH = "/home/jenkins/.pub-cache/bin:$PATH"
    }
    stages {
        stage('Test') {
            steps {
                ansiColor('xterm') {
                    echo "PATH is: $PATH"
                }
            }
        }
    }
}
0
Mike Mitterer

Jenkins 1.639 est installé sur SLES 11 SP3 via zypper (le gestionnaire de paquets) . L'installation a configuré jenkins en tant que service

 # service jenkins
 Usage: /etc/init.d/jenkins {start|stop|status|try-restart|restart|force-reload|reload|probe}

Bien que /etc/init.d/jenkins sources /etc/sysconfig/jenkins, les variables env. Définies ici ne sont pas héritées par le processus jenkins car il est démarré dans un shell de connexion séparé avec un nouvel environnement comme celui-ci:

startproc -n 0 -s -e -l /var/log/jenkins.rc -p /var/run/jenkins.pid -t 1 /bin/su -l -s /bin/bash -c '/usr/Java/default/bin/Java -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --javaHome=/usr/Java/default --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --httpPort=8080 --ajp13Port=8009 --debug=9 --handlerCountMax=100 --handlerCountMaxIdle=20 &' jenkins

La façon dont j'ai réussi à définir env vars pour le processus jenkins est via .bashrc dans son répertoire personnel - /var/lib/jenkins. Je devais créer /var/lib/jenkins/.bashrc car il n'existait pas auparavant.

0
Peter Dotchev

L'exécution de la commande avec la variable d'environnement définie est également efficace. Bien sûr, vous devez le faire pour chaque commande que vous exécutez, mais vous avez probablement un script de travail, vous n'avez donc probablement qu'une commande par construction. Mon script de travail est un script python qui utilise l'environnement pour décider du python à utiliser. Il me restait donc à mettre /usr/local/bin/python2.7 dans son chemin:

PATH=/usr/local/bin <my-command>
0
Joshua Richardson

Sur Ubuntu, je viens de modifier/etc/default/jenkins et d’ajouter le fichier source/etc/profile à la fin, ce qui fonctionne pour moi.

0
Arx Cruz

Ce qui a fonctionné pour moi a été de surcharger l'environnement PATH pour l'esclave.

Set:   PATH 
To:    $PATH:/usr/local/bin

Ensuite, déconnectez et reconnectez l'esclave.

En dépit de ce que les informations système montraient, cela fonctionnait.

0
Matt