Jenkins / Hudson-Umgebungsvariablen


101

Ich jenkinsführe Jenkins von einem Benutzer aus $PATH, der auf etwas eingestellt ist, und wenn ich in die Jenkins-Weboberfläche gehe, sehe ich im Fenster Systemeigenschaften ( http://$host/systemInfo) einen anderen $PATH.

Ich habe Jenkins auf Centos mit der nativen Drehzahl von der Jenkins-Website installiert. Ich verwende das mit der Installation gelieferte Startskript mitsudo /etc/init.d/jenkins start

Kann mir bitte jemand erklären, warum das passiert?


1
Wenn Sie sich als Jenkins anmelden und echo $PATH, stimmt es mit dem überein, was Sie in Jenkins sehen?
Upgradingdave

3
@ Dave nein, es stimmt nicht überein. kann nicht verstehen warum
Michael

8
Der Grund, warum es nicht übereinstimmt, ist, dass Sie beim Anmelden als Jenkins-Benutzer eine Login-Shell aufrufen, während Jenkins nur / bin / sh -xe {Ihr Skript} ausführt, sodass es nicht denselben Skriptsatz durchläuft die die Umgebungsvariable PATH ändern. Tatsächlich variiert der Satz von Skripten je nach der von Ihnen installierten Version von * nix und / oder Shell. Ich habe unter AWS Linux AMI mit Jenkins getestet und leider war keine von / etc / profile /etc/profile.d/xxx.sh / etc / bashrc / etc / environment ~ / .bash_profile ~ / .profile ~ / .bashrc in der Lage um den Pfad zu beeinflussen, der an / bin / sh übergeben wurde
Luke

Antworten:


141

Michael,

Zwei Dinge:

Wenn Jenkins eine Verbindung zu einem Computer herstellt, geht es zur shShell und nicht zur bashShell (zumindest ist mir dies aufgefallen - ich kann mich irren). Änderungen, die Sie an $ PATH in Ihrer bashrc-Datei vornehmen, werden daher nicht berücksichtigt.

Änderungen, die Sie an $ PATH in Ihrer lokalen Shell vornehmen (eine, in die Sie persönlich ssh), werden in Jenkins nicht angezeigt.

Um den von Jenkins verwendeten Pfad zu ändern, haben Sie zwei Möglichkeiten (AFAIK):

1) Bearbeiten Sie Ihre /etc/profileDatei und fügen Sie dort die gewünschten Pfade hinzu

2) Gehen Sie zur Konfigurationsseite Ihres Slaves und fügen Sie eine Umgebungsvariable PATHmit dem Wert hinzu:$PATH:/followed-by/paths/you/want/to/add

Wenn Sie die zweite Option verwenden, werden sie in Ihren Systeminformationen immer noch nicht angezeigt, in Ihren Builds werden jedoch die hinzugefügten Pfade angezeigt.


2
Diese Antwort hat bei mir funktioniert, aber ich habe festgestellt, dass Jenkins sehr sensibel ist, was Sie auf die Konfigurationsseite schreiben. Ich konnte es nicht dazu bringen, mit Pfaden mit Leerzeichen zu arbeiten.
Miguel Santirso

Ja, aber wenn Sie Pfade mit Leerzeichen in einer UNIX-Shell eingeben, wird das Leerzeichen normalerweise mit einem `` Zeichen maskiert. Wenn Ihr Pfad "/ opt / bin / Mein Ordnername" lautet, können Sie stattdessen "/ opt / bin / Mein \ Ordner \ Name" versuchen. Dadurch werden die Leerzeichen entfernt und Sie können sie verwenden.
Sagar

11
Die Lösung 2 ist der richtige Weg.
Gagarine

2
Follow-up: Auf meinem Ubuntu-System ist der Jenkins-Dienst ein Startjob, daher habe ich das alte Sysvinit-Stub-Skript geändert. Falscher Ort. Wenn ich das Skript /etc/init/jenkins.conf optimiere und den PATH vor dem Java von exec aktualisiere, scheint das zu funktionieren.
Stabledog

15
Es gibt eine kleine dunkle Ecke: Der Jenkins-Master speichert die Umgebungsvariablen von Slaves zwischen, um die Anpassungen zu patchen. Wenn Sie also Umgebungsvariablen auf einem Slave (System oder Benutzer) ändern, müssen Sie den Master neu starten, um die Slave-Konfiguration zu aktualisieren.
Thinkeye

36

Ich bin immer wieder auf dieses Problem gestoßen, aber jetzt füge ich hinzu:

source /etc/profile

Als erster Schritt in meinem Build-Prozess. Jetzt werden alle meine nachfolgenden Regeln geladen, damit Jenkins reibungslos funktioniert.


6
Huh? Im Detail bitte ... fügen Sie hinzu, wo? Wie? wann? Funktioniert es unter Windows?
HX_unbanned

Ich gehe davon aus, dass Sie einen Shell-Befehl als Teil Ihres Builds ausführen. Geben Sie source /etc/profileals ersten Befehl in den Textbereich Build> Shell ausführen> Befehl ein.
Bryan Kennedy

2
Es funktioniert auf dem Mac, außerdem habe ich Pfade gefunden, wie sie /usr/local/binin angegeben /etc/pathssind und von /etc/pathsverwendet werden/usr/libexec/path_helper , und path_helper wird in ausgeführt /etc/profile.
Hiroshi

1
Du hast meinen Tag gerettet :)
RameshVel

Sourcing / etc / profile zeigt den Pfad an, wenn ein Debug von 'echo $ PATH' in den Job eingefügt wird, aber wenn ich mir die Umgebungsvariablen für den Job ansehe, ist dies nicht der gleiche.
Elijah Lynn

23

Sie können die /etc/sysconfig/jenkinsDatei auch bearbeiten , um Änderungen an den Umgebungsvariablen usw. vorzunehmen. Ich habe sie einfach source /etc/profileam Ende der Datei hinzugefügt . /etc/profilehat alle richtigen PATHVariablen eingerichtet. Stellen Sie dabei sicher, dass Sie Jenkins neu starten

/etc/init.d/jenkins restart

Wir führen ZendServer CE aus, das Birne, Phing usw. auf einem anderen Pfad installiert. Dies war also hilfreich. Außerdem erhalten wir nicht die LD_LIBRARY_PATHFehler, die wir mit Oracle-Client und Jenkins verwendet haben.


Dies ist ein wichtiger Kommentar, oder starten Sie Jenkins von {jenkins-url} / restart oder {jenkins-url} / safeRestart neu. Ich habe mir Gedanken darüber gemacht, warum Pfadänderungen nicht erfasst wurden, indem ich sogar / etc / environment auf dem Ubuntu-Host bearbeitet habe - RESTART wird das Problem beheben, wie durch {jenkins-url} / systemInfo
kert

Alle anderen sind gescheitert, dies ist der einzige, der funktioniert hat! Ich wünschte, es wäre häufiger, also hätte ich die letzten Stunden nicht verschwendet!
Brad Bonkoski

15

Ich habe versucht /etc/profile, ~/.profileund , ~/.bash_profileund keiner von denen gearbeitet. Ich fand, dass die Bearbeitung ~/.bashrcfür das Jenkins-Sklavenkonto funktioniert hat.


3
Das liegt daran, dass Nicht-Login-Shell weder /etc/profilenoch liest~/.profile
Vincenzo

9

Die Informationen zu dieser Antwort sind veraltet. Sie müssen zu Jenkins konfigurieren> gehen und dann klicken, um von dort aus ein Schlüssel-Wert-Paar für Umgebungsvariablen hinzuzufügen.

zB: export MYVAR=testwäre MYVARder Schlüssel und testder Wert.


5

In meiner neueren EC2-Instanz hat es für mich funktioniert, einfach den neuen Wert zum PATH-Pfad des Jenkins-Benutzers hinzuzufügen und dann Tomcat neu zu starten.

In einer älteren Instanz, in der sich die Konfiguration unterscheidet, funktionierte nur die Verwendung von # 2 aus Sagars Antwort (dh .profile, .bash * funktionierte nicht).


4

Ich habe zwei Plugins dafür gefunden. Einer lädt die Werte aus einer Datei und der andere ermöglicht es Ihnen, die Werte im Jobkonfigurationsbildschirm zu konfigurieren.

Envfile Plugin - Mit diesem Plugin können Sie Umgebungsvariablen über eine Datei festlegen. Das Dateiformat muss das Standard-Java-Eigenschaftendateiformat sein.

EnvInject Plugin - Mit diesem Plugin können Umgebungsvariablen hinzugefügt und ein Setup-Skript ausgeführt werden, um eine Umgebung für den Job einzurichten.


4

Könnten Sie es nicht einfach als Umgebungsvariable in den Jenkins-Einstellungen hinzufügen:

Jenkins verwalten -> Globale Eigenschaften> Umgebungsvariablen: Klicken Sie anschließend auf "Hinzufügen", um einen Eigenschaftspfad und dessen Wert zu Ihren Anforderungen hinzuzufügen.


1
Scheint in Version 1.620 "Jenkins verwalten -> System konfigurieren -> Umgebungsvariablen" zu sein.
Akaihola

4

So habe ich dieses nervige Problem gelöst:

Ich habe die PATHVariable geändert , wie @sagar in seiner zweiten Option vorgeschlagen hat, aber trotzdem habe ich einen anderen PATHWert als erwartet.

Schließlich fand ich heraus, dass es das EnvInjectPlugin war, das meine PATHVariable ersetzte !

Ich könnte es also entweder deinstallieren EnvInjectoder einfach zum Einfügen der PATH-Variablen verwenden.

Da viele unserer Jenkins-Jobs dieses Plugin verwenden, wollte ich es nicht deinstallieren ...

Also habe ich eine Datei erstellt: environment_variables.propertiesunter meinem Jenkins-Ausgangsverzeichnis.

Diese Datei enthielt den Pfadumgebungswert, den ich brauchte : PATH=$PATH:/usr/local/git/bin/.

Über die Jenkins-Weboberfläche : Manage Jenkins -> Configure System. In diesem Bildschirm habe ich die Prepare jobs environmentOption angekreuzt und in das Properties File PathFeld den Pfad zu meiner Datei eingegeben : /var/lib/jenkins/environment_variables.properties.

Auf diese Weise erhalten wir bei jedem Jenkins-Job alle Variablen, die ich in diese environment_variables.propertiesDatei eingefügt habe.


1
Dies sollte die richtige Antwort sein. Wie bereits erwähnt, ist das Aktualisieren von / etc / profile unter OSX keine praktikable Lösung, da die Datei schreibgeschützt ist und das Herumspielen mit Berechtigungen erfordert. Diese Lösung scheint die sauberste zu sein und verwendet bereits vorhandene Plugins auf Jenkins. Denken Sie daran, Jenkins neu zu starten, sobald Sie Ihre Eigenschaftendatei erstellt und auf Jenkins
Voke Ransom Anighoro

3

Jenkins unterstützt auch das Format PATH+<name> , um jeder Variablen vorangestellt zu werden, nicht nur PATH:

Globale Umgebungsvariablen oder Knoten Umgebungsvariablen:

Jenkins Variable + Notation

Dies wird auch im Pipeline-Schritt unterstützt withEnv:

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

Beachten Sie einfach, dass es der Variablen vorangestellt wird. Wenn es angehängt werden muss, müssen Sie tun, was die anderen Antworten zeigen.

Siehe das Dokument mit den Pipeline-Schritten hier .

Sie können auch die Syntax PATH + WHATEVER = / etwas verwenden, um $ PATH / etwas voranzustellen

Oder die Java-Dokumente auf EnvVars hier .


2

Ich hatte erst nach einem "/etc/init.d/jenkins Force-Reload" Fortschritte in diesem Bereich. Ich empfehle, dies vor allem anderen zu versuchen und es zu verwenden, anstatt es neu zu starten.


1
Und wo haben Sie das PATH-Element hinzugefügt? Ich habe jeden Ort ausprobiert, den ich mir vorstellen kann.
Stabledog

2

Auf meinem Ubuntu 13.04 habe ich einige Optimierungen versucht, bevor ich damit Erfolg hatte:

  1. Bearbeiten Sie /etc/init/jenkins.conf
  2. Suchen Sie die Stelle, an der "exec start-stop-server ..." beginnt
  3. Fügen Sie das Umgebungsupdate unmittelbar davor ein, d. H.

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


2

Hinzufügen

/usr/bin/bash

beim

Jenkins -> Jenkins verwalten -> System konfigurieren -> Shell-> Shell ausführbar

Jenkins verwendet das sh, damit selbst / etc / profile bei mir nicht funktioniert. Wenn ich das hinzufüge, habe ich die gesamte Umgebung.


Welche Version von Jenkins hat das für Sie @ sumang_87 funktioniert? Es konnte mir auf Jenkins 2.9
hamx0r

1

Lösung, die für mich funktioniert hat

source ~/.bashrc

Erläuterung

Ich habe zuerst überprüft, ob Jenkins BASH mit echo $SHELLund ausführt echo $BASH(ich stelle nicht explizit fest, #!/bin/bashob dies eine Voraussetzung ist, um BASH zu erhalten). sourceing /etc/profileals andere vorgeschlagen funktionierte nicht.

Beim Anschauen /etc/profilefand ich

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

und Inspektion von "$ PS1" fand es null. Ich habe versucht $PS1, so vergeblich zu fälschen

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

Dies führte jedoch nicht zum gewünschten Ergebnis (fügen Sie den Rest der $PATHerwarteten Ergebnisse hinzu ). Aber wenn ich bash sage, dass es interaktiv sein soll

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

Das $PATHwurde wie erwartet geändert.

Ich habe versucht herauszufinden, wie man eine interaktive Shell richtig fälscht, um /etc/bash.bashrczum Laden zu gelangen , aber es stellte sich heraus, dass alles, was ich brauchte, unten war ~/.bashrc, also sourcelöste es einfach das Problem.


Stellen Sie sicher, dass #!/bin/bash -elSie bash anweisen, als Login-Shell zu starten. Das sollte Bash veranlassen, die notwendigen .rc-Dateien zu beschaffen
Brandon

1

Ich habe alles von oben ausprobiert - hat bei mir nicht funktioniert.

Ich habe zwei Lösungen gefunden (beide für SSH-Slave)

  1. Gehen Sie zu den Slave-Einstellungen

  2. Fügen Sie eine neue Umgebungsvariable hinzu

  3. PFAD
  4. $ {PATH}: $ {HOME} /. Pub-Cache / bin: $ {HOME} /. Local / bin

Der Teil "$ {HOME}" ist wichtig. Dies macht den zusätzlichen Pfad absolut. Der relative Pfad hat bei mir nicht funktioniert.

Option II (Pipeline-Skript)

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

0

Unter Ubuntu bearbeite ich einfach / etc / default / jenkins und füge am Ende die Quelle / etc / profile hinzu, und es funktioniert für mich.


0

Das Ausführen des Befehls mit gesetztem Umgebungsvariablen ist ebenfalls effektiv. Natürlich müssen Sie dies für jeden Befehl tun, den Sie ausführen, aber Sie haben wahrscheinlich ein Jobskript, sodass Sie wahrscheinlich nur einen Befehl pro Build haben. Mein Jobskript ist ein Python-Skript, das anhand der Umgebung entscheidet, welches Python verwendet werden soll. Daher musste ich /usr/local/bin/python2.7 noch in seinen Pfad einfügen:

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

0

Was für mich funktionierte, war das Überschreiben der PATH-Umgebung für den Sklaven.

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

Trennen Sie dann den Slave und schließen Sie ihn wieder an.

Ungeachtet dessen, was die Systeminformationen zeigten, funktionierte es.


0

Ich habe Jenkins 1.639 über zypper (den Paketmanager) auf SLES 11 SP3 installiert. Installation konfiguriert Jenkins als Service

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

Obwohl es sich um /etc/init.d/jenkinsQuellen handelt /etc/sysconfig/jenkins, werden dort festgelegte env-Variablen nicht vom Jenkins-Prozess geerbt, da sie in einer separaten Anmeldeshell mit einer neuen Umgebung wie der folgenden gestartet werden:

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

Die Art und Weise, wie ich env vars für den jenkins-Prozess festlegen konnte, erfolgt über .bashrcdas Home-Verzeichnis - /var/lib/jenkins. Ich musste schaffen, /var/lib/jenkins/.bashrcwie es vorher nicht existierte.


0

Hier ist, was ich auf Ubuntu 18.04 LTS mit Jenkins 2.176.2 gemacht habe

Ich habe die Datei .bash_aliases erstellt und dort Pfad, Proxy-Variablen usw. hinzugefügt.

Zu Beginn von .bashrc wurde dies definiert.

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

Es wird also überprüft, ob wir hier nichts tun, wenn wir eine nicht interaktive Shell starten.

Am unteren Rand der .bashrc befand sich include für .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

Also habe ich .bash_aliases verschoben und zuerst bei .bashrc direkt über der nicht interaktiven Prüfung geladen.

Dies hat zuerst nicht funktioniert, aber dann habe ich den Slave getrennt und wieder verbunden, damit die Variablen wieder geladen werden. Sie müssen nicht ganze Jenkins neu starten, wenn Sie Slave-Variablen ändern. Einfach trennen und wieder verbinden.


-1

1- Fügen Sie Ihrer Profildatei die Datei ".bash_profile" hinzu

Es befindet sich im Ordner "/ home / your_user /"

vi .bash_profile

hinzufügen:

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

==> es ist der e jenkins Arbeitsbereich

2- Wenn Sie einen Steg verwenden: Gehen Sie zur Datei jenkins.xml

und hinzufügen:

<Arg>/apps/data/jenkins</Arg>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.