Variables d'environnement Jenkins / Hudson

101

J'exécute Jenkins à partir de l'utilisateur qui jenkinsa $PATHdéfini quelque chose et quand je vais dans l'interface Web de Jenkins, dans la fenêtre Propriétés système ( http://$host/systemInfo), je vois un autre $PATH.

J'ai installé Jenkins sur Centos avec le rpm natif du site Web de Jenkins. J'utilise le script de démarrage fourni avec l'installation en utilisantsudo /etc/init.d/jenkins start

Quelqu'un peut-il m'expliquer pourquoi cela se produit?

Michael
la source
1
Si vous vous connectez en tant que jenkins et echo $PATH, est-ce que cela correspond à ce que vous voyez dans jenkins?
Upgradingdave
3
@Dave non, ça ne correspond pas. Je ne comprends pas pourquoi
Michael
8
La raison pour laquelle il ne correspond pas est que lorsque vous vous connectez en tant qu'utilisateur jenkins, vous invoquez un shell de connexion, alors que jenkins exécute simplement / bin / sh -xe {votre script} afin qu'il ne s'exécute pas via le même ensemble de scripts qui modifient la variable d'environnement PATH. En fait, l'ensemble des scripts varie en fonction de la saveur particulière de * nix et / ou du shell que vous avez installé. J'ai testé sur AWS Linux AMI avec jenkins et malheureusement, aucun des fichiers / etc / profile /etc/profile.d/xxx.sh / etc / bashrc / etc / environment ~ / .bash_profile ~ / .profile ~ / .bashrc n'a pu pour affecter le PATH passé à / bin / sh
Luke

Réponses:

141

Michael,

Deux choses:

Lorsque Jenkins se connecte à un ordinateur, il va au shshell, et non au bashshell (du moins c'est ce que j'ai remarqué - je me trompe peut-être). Ainsi, toutes les modifications que vous apportez à $ PATH dans votre fichier bashrc ne sont pas prises en compte.

De plus, toutes les modifications que vous apportez à $ PATH dans votre shell local (dans lequel vous vous connectez personnellement) n'apparaîtront pas dans Jenkins.

Pour changer le chemin utilisé par Jenkins, vous avez deux options (AFAIK):

1) Modifiez votre /etc/profilefichier et ajoutez-y les chemins que vous souhaitez

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 les afficheront toujours pas, mais vos builds verront les chemins ajoutés.

Sagar
la source
2
Cette réponse a fonctionné pour moi, mais j'ai remarqué que Jenkins est très sensible à ce que vous écrivez dans la page de configuration. Je ne pouvais pas le faire fonctionner avec des chemins avec des espaces.
miguelSantirso
Oui, mais lorsque vous entrez des chemins avec des espaces dans un shell UNIX, l'espace est normalement échappé avec un caractère ``. Par conséquent, si votre chemin est "/ opt / bin / My Folder Name", vous pouvez essayer "/ opt / bin / My \ Folder \ Name" à la place. Cela échappera aux espaces et vous permettra de les utiliser.
Sagar
11
La solution 2 est la voie à suivre.
gagarine
2
Suivi: sur mon système Ubuntu, le service jenkins est un travail de démarrage, donc je modifiais l'ancien script stub sysvinit. Mauvais endroit. Quand je peaufine le script /etc/init/jenkins.conf et que je mets à jour le PATH avant qu'il n'exécute java, cela semble fonctionner.
Stabledog
15
Il y a un petit coin sombre: le maître jenkins met en cache les variables d'environnement des esclaves afin de patcher les personnalisations. Ainsi, si vous modifiez des variables d'environnement sur un esclave (système ou utilisateur), vous devez redémarrer le maître pour mettre à jour la configuration des esclaves.
Thinkeye
36

J'ai continué à rencontrer ce problème, mais maintenant j'ajoute simplement:

source /etc/profile

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

Bryan Kennedy
la source
6
Hein? En détail, s'il vous plaît ... vous ajoutez où? Comment? quand? Fonctionne-t-il sous Windows?
HX_unbanned
Je suppose que vous exécutez une commande shell dans le cadre de votre build. Mettez en source /etc/profiletant que première commande dans cette zone de texte Build> Execute Shell> Command.
bryan kennedy
2
Cela fonctionne sur Mac, j'ai également trouvé des chemins comme /usr/local/binspécifié dans /etc/paths, et /etc/pathsest utilisé par /usr/libexec/path_helper, et path_helper est exécuté dans /etc/profile.
hiroshi
1
vous avez sauvé ma journée :)
RameshVel
Le sourcing / etc / profile affiche le chemin lors de l'ajout d'un débogage de 'echo $ PATH' dans le travail, mais si je regarde les variables d'environnement pour le travail, ce n'est pas la même chose.
Elijah Lynn
23

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

/etc/init.d/jenkins restart

Nous exécutons ZendServer CE qui installe pear, phing, etc. dans un chemin différent, donc cela a été utile. De plus, nous n'obtenons pas les LD_LIBRARY_PATHerreurs que nous avions l'habitude d'obtenir avec le client Oracle et Jenkins.

dbiehl
la source
Ceci est un commentaire clé, ou redémarrez jenkins depuis {jenkins-url} / restart ou {jenkins-url} / safeRestart. Je me cognais la tête sur les raisons pour lesquelles les changements de chemin n'étaient pas pris en compte, en éditant même / etc / environment sur l'hôte ubuntu - RESTART le corrigera, comme vérifié par {jenkins-url} / systemInfo
kert
Tous les autres ont échoué, c'est le seul qui a fonctionné! J'aurais aimé que ce soit plus fréquent pour ne pas avoir perdu les dernières heures!
Brad Bonkoski
15

J'ai essayé /etc/profile, ~/.profileet ~/.bash_profileet aucun de ceux travaillé. J'ai trouvé que l'édition ~/.bashrcpour le compte esclave jenkins l'a fait.

mmacvicar
la source
3
c'est parce que le shell non-login ne lit ni /etc/profileni~/.profile
Vincenzo
9

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

par exemple: export MYVAR=testserait MYVARest la clé et testest la valeur.

TJ Biddle
la source
5

Sur ma nouvelle instance EC2, ajouter simplement la nouvelle valeur au PATH de l'utilisateur .profile de Jenkins, puis redémarrer tomcat a fonctionné pour moi.

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

Rob Barreca
la source
4

J'ai trouvé deux plugins pour ça. 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.

Vicro
la source
4

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: puis cliquez sur "Ajouter" pour ajouter une propriété PATH et sa valeur à ce dont vous avez besoin.

Kiarash Zamanifar
la source
1
Semble être "Gérer Jenkins -> Configurer le système -> Variables d'environnement" dans la version 1.620.
akaihola
4

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

J'ai changé la PATHvariable comme @sagar l'a suggéré dans sa deuxième option, mais j'ai quand même une PATHvaleur différente de ce à quoi je m'attendais.

Finalement, j'ai découvert que c'était le EnvInjectplugin qui avait remplacé ma PATHvariable!

Je pourrais donc désinstaller EnvInjectou simplement l'utiliser pour injecter la variable PATH.

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

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

Ce fichier contient la valeur de l' environnement de chemin que je avais besoin: PATH=$PATH:/usr/local/git/bin/.

Depuis l'interface Web Jenkins: Manage Jenkins -> Configure System. Dans cet écran - je coché la case Prepare jobs environmentoption, dans le Properties File Pathchamp je suis entré dans le chemin de mon dossier: /var/lib/jenkins/environment_variables.properties.

De cette façon, chaque travail Jenkins que nous avons reçoit toutes les variables que j'ai placées dans ce environment_variables.propertiesfichier.

ofirbt
la source
1
Cela devrait être la bonne réponse. Comme indiqué, la mise à jour de / etc / profile n'est pas une solution réalisable sous OSX car le fichier est en lecture seule et nécessite de jouer avec les autorisations. Cette solution semble la plus propre et utilise des plugins déjà existants sur Jenkins. N'oubliez pas de redémarrer jenkins une fois que vous avez créé votre fichier de propriétés et que vous l'avez défini sur Jenkins
Voke Ransom Anighoro
3

Jenkins prend également en charge le format PATH+<name>à ajouter à n'importe quelle variable, pas seulement PATH:

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

Variable Jenkins + notation

Ceci est également pris en charge dans l'étape du pipeline withEnv:

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

Prenez juste note, il précède la variable. S'il doit être ajouté, vous devez faire ce que montrent les autres réponses.

Consultez le document des étapes du pipeline ici .

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

Ou les documents java sur EnvVars ici .

CJCombrink
la source
2

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

René Wooller
la source
1
Et où avez-vous réellement ajouté l'élément PATH? J'ai essayé tous les endroits que je peux imaginer.
Stabledog
2

Sur mon Ubuntu 13.04, j'ai essayé pas mal d'ajustements avant de réussir avec ceci:

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

export PATH = $ PATH: / certains / nouveau / chemin / bin

Stabledog
la source
2

Ajouter

/usr/bin/bash

à

Jenkins -> Gérer Jenkins -> configurer le système -> Shell-> Shell exécutable

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

sumang_87
la source
Quelle version de Jenkins a fonctionné pour vous @ sumang_87? Il n'a pas réussi à m'aider sur Jenkins 2.9
hamx0r
1

Solution qui a fonctionné pour moi

source ~/.bashrc

Explication

J'ai d'abord vérifié que Jenkins exécutait BASH, avec echo $SHELLet echo $BASH(notez que je mets explicitement #!/bin/bashau sommet de la zone de texte dans Jenkins, je ne suis pas sûr que ce soit une condition pour obtenir BASH). sourceing /etc/profileque d' autres proposées ne fonctionnait pas.

En regardant /etc/profilej'ai trouvé

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

et l'inspection de "$ PS1" l'a trouvé nul. J'ai essayé usurpation d' identité $PS1en vain comme si

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

cependant cela n'a pas produit le résultat souhaité (ajoutez le reste de ce $PATHque j'attends de voir). Mais si je dis à bash d'être interactif

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

le a $PATHété modifié comme je m'y attendais.

J'essayais de comprendre comment usurper correctement un shell interactif /etc/bash.bashrcpour le charger, mais il s'est avéré que tout ce dont j'avais besoin était en panne ~/.bashrc, donc cela a simplement sourcerésolu le problème.

quickshiftin
la source
Assurez-vous d'utiliser #!/bin/bash -elpour dire à bash de démarrer en tant que shell de connexion. Cela devrait amener bash à trouver les fichiers .rc nécessaires
Brandon
1

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

J'ai trouvé deux solutions (à la fois pour SSH-Slave)

  1. Accédez aux paramètres 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 PATH supplémentaire absolu. Le chemin relatif n'a pas fonctionné pour moi.

Option II (pipeline-script)

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

Sur Ubuntu, je viens de modifier / etc / default / jenkins et d'ajouter la source / etc / profile à la fin et cela fonctionne pour moi.

Arx Cruz
la source
0

L'exécution de la commande avec un jeu de variables d'environnement 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 seule commande par construction. Mon script de travail est un script python qui utilise l'environnement pour décider quel python utiliser, donc j'avais encore besoin de mettre /usr/local/bin/python2.7 dans son chemin:

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

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

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

Ensuite, déconnectez et reconnectez l'esclave.

Malgré ce que les informations système montraient, cela fonctionnait.

Mat
la source
0

J'ai Jenkins 1.639 installé sur SLES 11 SP3 via zypper (le gestionnaire de paquets). Installation configurée de 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/jenkinssources /etc/sysconfig/jenkins, toutes les variables d'environnement définies là-bas 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 des variables d'environnement pour le processus jenkins est via .bashrcdans son répertoire personnel - /var/lib/jenkins. J'ai dû créer /var/lib/jenkins/.bashrccar cela n'existait pas auparavant.

Peter Dotchev
la source
0

Voici ce que j'ai fait sur ubuntu 18.04 LTS avec Jenkins 2.176.2

J'ai créé le fichier .bash_aliases et y ai ajouté un chemin, des variables proxy, etc.

Au début de .bashrc, c'était défini.

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

Donc, il vérifie que si nous démarrons un shell non interactif, nous ne faisons rien ici.

en bas du .bashrc il y avait des inclus pour .bash_aliases

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

j'ai donc déplacé .bash_aliases en chargeant d'abord à .bashrc juste au-dessus de la vérification non interactive.

Cela n'a pas fonctionné en premier, mais j'ai ensuite déconnecté l'esclave et l'ai reconnecté pour qu'il charge à nouveau les variables. Vous n'avez pas besoin de redémarrer tout jenkins si vous modifiez des variables esclaves. déconnectez et reconnectez.

Juge
la source
-1

1- ajouter à votre fichier profil fichier ".bash_profile"

il se trouve dans le dossier "/ home / votre_utilisateur /"

vi .bash_profile

ajouter:

export JENKINS_HOME=/apps/data/jenkins  
export PATH=$PATH:$JENKINS_HOME

==> c'est l'espace de travail e jenkins

2- Si vous utilisez jetty: allez dans le fichier jenkins.xml

et ajouter :

<Arg>/apps/data/jenkins</Arg>
Fadid
la source