Variabili d'ambiente Jenkins / Hudson


101

Sto eseguendo Jenkins da un utente che jenkinsha $PATHimpostato qualcosa e quando entro nell'interfaccia web di Jenkins, nella finestra Proprietà del sistema ( http://$host/systemInfo) vedo un file $PATH.

Ho installato Jenkins su Centos con l'RPM nativo dal sito Web di Jenkins. Sto usando lo script di avvio fornito con l'installazione usandosudo /etc/init.d/jenkins start

Qualcuno può spiegarmi perché ciò accade?


1
Se accedi come jenkins e echo $PATH, corrisponde a ciò che vedi in jenkins?
Aggiornamento dal

3
@ Dave no, non corrisponde. non riesco a capire perché
Michael

8
Il motivo per cui non corrisponde è perché quando accedi come utente jenkins stai invocando una shell di accesso, mentre jenkins esegue solo / bin / sh -xe {tuo script} quindi non viene eseguito attraverso lo stesso set di script che alterano la variabile d'ambiente PATH. In effetti, il set di script varia in base al gusto particolare di * nix e / o shell che hai installato. Ho testato l'AMI AWS Linux con jenkins e purtroppo nessuno di / etc / profile /etc/profile.d/xxx.sh / etc / bashrc / etc / environment ~ / .bash_profile ~ / .profile ~ / .bashrc è stato in grado di per influenzare il PERCORSO passato a / bin / sh
Luca

Risposte:


141

Michael,

Due cose:

Quando Jenkins si connette a un computer, va alla shshell e non alla bashshell (almeno questo è quello che ho notato - potrei sbagliarmi). Quindi qualsiasi modifica apportata a $ PATH nel file bashrc non viene considerata.

Inoltre, tutte le modifiche apportate a $ PATH nella shell locale (una in cui si utilizza personalmente ssh) non verranno visualizzate in Jenkins.

Per modificare il percorso utilizzato da Jenkins, hai due opzioni (AFAIK):

1) Modifica il tuo /etc/profilefile e aggiungi i percorsi che desideri lì

2) Vai alla pagina di configurazione del tuo slave e aggiungi la variabile d'ambiente PATH, con valore:$PATH:/followed-by/paths/you/want/to/add

Se usi la seconda opzione, le informazioni di sistema non le mostreranno ancora, ma le tue build vedranno i percorsi aggiunti.


2
Questa risposta ha funzionato per me, ma ho notato che Jenkins è molto sensibile a ciò che scrivi nella pagina di configurazione. Non riuscivo a farlo funzionare con percorsi con spazi.
miguelSantirso

Sì, lo è, ma quando si immettono percorsi con spazi in una shell UNIX, lo spazio viene normalmente eliminato con un carattere ``. Quindi, se il tuo percorso è "/ opt / bin / My Folder Name", potresti provare "/ opt / bin / My \ Folder \ Name". Questo sfuggirà agli spazi e ti permetterà di usarli.
Sagar

11
La soluzione 2 è la strada da percorrere.
gagarine

2
Seguito: sul mio sistema Ubuntu, il servizio jenkins è un lavoro nuovo, quindi stavo modificando il vecchio script stub sysvinit. Posto sbagliato. Quando modifico lo script /etc/init/jenkins.conf e aggiorno il PERCORSO prima che sia java dell'esecutivo, sembra che funzioni.
Stabledog

15
C'è un piccolo angolo oscuro: il master jenkins memorizza nella cache le variabili d'ambiente dagli slave per correggere le personalizzazioni. Quindi, se si modificano le variabili di ambiente su uno slave (sistema o utente), è necessario riavviare il master per aggiornare la configurazione degli slave.
Thinkeye

36

Ho continuato a riscontrare questo problema, ma ora aggiungo solo:

source /etc/profile

Come primo passo nel mio processo di costruzione. Ora tutte le mie regole successive sono state caricate affinché Jenkins funzioni senza problemi.


6
Eh? In dettaglio, per favore ... aggiungi dove? Come? quando? Funziona su Windows?
HX_unbanned

Presumo che tu stia eseguendo un comando di shell come parte della tua build. Metti source /etc/profilecome primo comando in quella Build> Execute Shell> Command textarea.
bryan kennedy

2
Funziona su Mac, inoltre ho trovato percorsi come /usr/local/binè specificato in /etc/paths, ed /etc/pathsè usato da /usr/libexec/path_helper, e path_helper viene eseguito in /etc/profile.
Hiroshi

1
mi hai salvato la giornata :)
RameshVel

Il sourcing / etc / profile mostra il percorso quando si aggiunge un debug di 'echo $ PATH' nel lavoro, ma se guardo le variabili d'ambiente per il lavoro non è lo stesso.
Elijah Lynn

23

Puoi anche modificare il /etc/sysconfig/jenkinsfile per apportare modifiche alle variabili d'ambiente, ecc. Ho semplicemente aggiunto source /etc/profilealla fine del file. /etc/profileha tutte le PATHimpostazioni corrette delle variabili. Quando lo fai, assicurati di riavviare Jenkins

/etc/init.d/jenkins restart

Stiamo eseguendo ZendServer CE che installa pear, phing, ecc. In un percorso diverso, quindi è stato utile. Inoltre, non otteniamo gli LD_LIBRARY_PATHerrori che abbiamo usato per ottenere con il client Oracle e Jenkins.


Questo è un commento chiave, oppure riavvia jenkins da {jenkins-url} / restart o {jenkins-url} / safeRestart. Mi è stato sbattere la testa sul perché i cambiamenti di percorso non sono stati presi, modificando anche / etc / environment su un host Ubuntu - RESTART lo risolverà, come verificato da {Jenkins-url} / Systeminfo
Kert

Tutti gli altri hanno fallito, questo è l'unico che ha funzionato! Vorrei che fosse più diffuso così non avrei sprecato le ultime ore!
Brad Bonkoski

15

Ho provato /etc/profile, ~/.profilee ~/.bash_profilee nessuno di coloro che ha funzionato. Ho scoperto che la modifica ~/.bashrcper l'account schiavo di jenkins funzionava.


3
questo perché la shell non di login non legge né /etc/profile~/.profile
Vincenzo

9

Le informazioni su questa risposta non sono aggiornate. Devi andare a Configura Jenkins> E puoi quindi fare clic per aggiungere una coppia chiave-valore di variabile d'ambiente da lì.

es: export MYVAR=testsarebbe MYVARè la chiave ed testè il valore.


5

Sulla mia nuova istanza EC2, la semplice aggiunta del nuovo valore al PERCORSO .profile dell'utente di Jenkins e quindi il riavvio di Tomcat ha funzionato per me.

In un'istanza precedente in cui la configurazione è diversa, l'utilizzo del n. 2 dalla risposta di Sagar era l'unica cosa che funzionava (ad es. .Profile, .bash * non funzionava).


4

Ho trovato due plugin per questo. Uno carica i valori da un file e l'altro consente di configurare i valori nella schermata di configurazione del lavoro.

Plugin Envfile - Questo plugin consente di impostare le variabili d'ambiente tramite un file. Il formato del file deve essere il formato file delle proprietà Java standard.

Plugin EnvInject : questo plugin consente di aggiungere variabili di ambiente ed eseguire uno script di configurazione per configurare un ambiente per il lavoro.


4

Non potresti semplicemente aggiungerlo come variabile di ambiente nelle impostazioni di Jenkins:

Gestisci Jenkins -> Proprietà globali> Variabili d'ambiente: quindi fai clic su "Aggiungi" per aggiungere una proprietà PATH e il suo valore a ciò di cui hai bisogno.


1
Sembra essere "Gestisci Jenkins -> Configura sistema -> Variabili d'ambiente" nella versione 1.620.
Akaihola

4

Ecco come ho risolto questo fastidioso problema:

Ho cambiato la PATHvariabile come suggerito da @sagar nella sua seconda opzione, ma ho comunque ottenuto un PATHvalore diverso da quello che mi aspettavo.

Alla fine ho scoperto che era il EnvInjectplugin che ha sostituito la mia PATHvariabile!

Quindi potrei disinstallarlo EnvInjecto semplicemente usarlo per iniettare la variabile PATH.

Dato che molti dei nostri lavori Jenkins utilizzano quel plugin, non volevo disinstallarlo ...

Quindi ho creato un file: environment_variables.propertiesnella mia home directory di Jenkins.

Questo file contiene il valore di ambiente percorso che avevo bisogno: PATH=$PATH:/usr/local/git/bin/.

Dall'interfaccia web Jenkins: Manage Jenkins -> Configure System. In quello schermo - ho spuntato l' Prepare jobs environmentopzione e nel Properties File Pathcampo sono entrato nel percorso al mio file: /var/lib/jenkins/environment_variables.properties.

In questo modo ogni lavoro Jenkins che abbiamo riceve tutte le variabili che ho inserito in questo environment_variables.propertiesfile.


1
Questa dovrebbe essere la risposta corretta. Come affermato, l'aggiornamento di / etc / profile non è una soluzione fattibile su OSX poiché il file è di sola lettura e richiede la manipolazione delle autorizzazioni. Questa soluzione sembra la più pulita e utilizza plugin già esistenti su Jenkins. Ricordati di riavviare jenkins una volta creato il file delle proprietà e impostato su Jenkins
Voke Ransom Anighoro

3

Jenkins supporta anche il formato PATH+<name>per anteporre a qualsiasi variabile, non solo PATH:

Variabili di ambiente globali o variabili di ambiente del nodo:

Variabile di Jenkins + notazione

Questo è supportato anche nel passaggio della pipeline withEnv:

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

Prendi nota, antepone alla variabile. Se deve essere aggiunto, devi fare ciò che mostrano le altre risposte.

Vedi il documento sui passaggi della pipeline qui .

Puoi anche usare la sintassi PATH + WHATEVER = / qualcosa per anteporre / qualcosa a $ PATH

O i documenti java su EnvVars qui .


2

Ho avuto progressi su questo problema solo dopo un "/etc/init.d/jenkins force-reload". Consiglio di provarlo prima di ogni altra cosa e di usarlo piuttosto che riavviare.


1
E dove hai effettivamente aggiunto l'elemento PATH? Ho provato ogni posto che posso immaginare.
Stabledog

2

Sul mio Ubuntu 13.04, ho provato alcune modifiche prima di riuscire con questo:

  1. Modifica /etc/init/jenkins.conf
  2. Individua il punto in cui inizia "exec start-stop-server ..."
  3. Inserisci l'aggiornamento dell'ambiente appena prima, ad es

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


2

Inserisci

/usr/bin/bash

a

Jenkins -> Gestisci Jenkins -> configura sistema -> Shell-> eseguibile Shell

Jenkins usa sh in modo che anche / etc / profile non funzioni per me Quando aggiungo questo, ho tutto l'env.


Quale versione di Jenkins ha funzionato per te @ sumang_87? Non è riuscito ad aiutarmi su Jenkins 2.9
hamx0r

1

Soluzione che ha funzionato per me

source ~/.bashrc

Spiegazione

Per prima cosa ho verificato che Jenkins stesse eseguendo BASH, con echo $SHELLe echo $BASH(nota che sto inserendo esplicitamente #!/bin/bashla textarea in Jenkins, non sono sicuro che sia un requisito per ottenere BASH). sourceing /etc/profilecome altri suggerivano non funzionava.

Guardando /etc/profileho trovato

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

e ispezionando "$ PS1" lo trovai nullo. Ho provato a fare lo spoofing $PS1inutilmente in questo modo

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

tuttavia questo non ha prodotto il risultato desiderato (aggiungete il resto che $PATHmi aspetto di vedere). Ma se dico a bash di essere interattivo

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

il è $PATHstato modificato come mi aspettavo.

Stavo cercando di capire come falsificare correttamente una shell interattiva /etc/bash.bashrcper caricarla, tuttavia è risultato che tutto ciò di cui avevo bisogno era giù ~/.bashrc, quindi è stato semplicemente sourcerisolto il problema.


Assicurati di usare #!/bin/bash -elper dire a bash di avviarsi come shell di login. Ciò dovrebbe indurre bash a reperire i file .rc necessari
Brandon

1

Ho provato tutte le cose dall'alto - non ha funzionato per me.

Ho trovato due soluzioni (entrambe per SSH-Slave)

  1. Vai alle impostazioni slave

  2. Aggiungi una nuova variabile d'ambiente

  3. SENTIERO
  4. $ {PATH}: $ {HOME} / pub-cache / bin:.. $ {HOME} / local / bin

La parte "$ {HOME}" è importante. Ciò rende assoluto il PERCORSO aggiuntivo. Il percorso relativo non ha funzionato per me.

Opzione 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"
                }
            }
        }
    }
}

0

Su Ubuntu modifico solo / etc / default / jenkins e aggiungo source / etc / profile alla fine e per me funziona.


0

Anche l'esecuzione del comando con la variabile di ambiente impostata è efficace. Ovviamente, devi farlo per ogni comando che esegui, ma probabilmente hai uno script di lavoro, quindi probabilmente hai solo un comando per build. Il mio script di lavoro è uno script python che utilizza l'ambiente per decidere quale python utilizzare, quindi avevo ancora bisogno di inserire /usr/local/bin/python2.7 nel suo percorso:

PATH=/usr/local/bin <my-command>

0

Ciò che ha funzionato per me è stato l'override dell'ambiente PATH per lo slave.

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

Quindi scollegare e ricollegare lo slave.

Nonostante quello che mostravano le informazioni di sistema, funzionava.


0

Ho Jenkins 1.639 installato su SLES 11 SP3 tramite zypper (il gestore dei pacchetti). L'installazione ha configurato jenkins come servizio

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

Sebbene siano /etc/init.d/jenkinssorgenti /etc/sysconfig/jenkins, tutte le variabili env impostate non vengono ereditate dal processo jenkins perché viene avviato in una shell di login separata con un nuovo ambiente come questo:

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

Il modo in cui sono riuscito a impostare env vars per il processo jenkins è tramite .bashrcnella sua home directory - /var/lib/jenkins. Ho dovuto creare /var/lib/jenkins/.bashrcperché prima non esisteva.


0

Ecco cosa ho fatto su Ubuntu 18.04 LTS con Jenkins 2.176.2

Ho creato il file .bash_aliases e aggiunto il percorso, le variabili proxy e così via.

All'inizio di .bashrc c'era questa definizione.

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

Quindi sta controllando che se stiamo avviando una shell non interattiva, non facciamo nulla qui.

in fondo al .bashrc c'era l'inclusione per .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

quindi ho spostato .bash_aliases caricando prima su .bashrc appena sopra il controllo non interattivo.

Questo non ha funzionato prima, ma poi ho scollegato lo slave e l'ho ricollegato in modo da caricare nuovamente le variabili. Non è necessario riavviare interi jenkins se si stanno modificando le variabili slave. disconnettersi e ricollegarsi.


-1

1- aggiungi al tuo file di profilo il file ".bash_profile"

è nella cartella "/ home / tuo_utente /"

vi .bash_profile

Inserisci:

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

==> è lo spazio di lavoro di e jenkins

2- Se usi jetty: vai al file jenkins.xml

e aggiungi :

<Arg>/apps/data/jenkins</Arg>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.