Ich verwende Jenkins vom Benutzer jenkins
das hat $PATH
auf etwas gesetzt, und wenn ich in die Jenkins-Weboberfläche gehe, sehe ich im System Properties window (http://$Host/systemInfo
) einen anderen $PATH
.
Ich habe Jenkins auf Centos mit der nativen Drehzahl von Jenkins Website installiert. Ich verwende das mit der Installation gelieferte Startskript mit Sudo /etc/init.d/jenkins start
Kann mir bitte jemand erklären, warum das passiert?
Michael,
Zwei Dinge:
Wenn Jenkins eine Verbindung zu einem Computer herstellt, geht es zur sh
-Shell und nicht zur bash
-Shell (zumindest habe ich dies bemerkt - ich kann mich irren). Änderungen, die Sie an $ PATH in Ihrer bashrc-Datei vornehmen, werden daher nicht berücksichtigt.
Außerdem werden alle Änderungen, die Sie an $ PATH in Ihrer lokalen Shell vornehmen (in die Sie persönlich ssh einsteigen), nicht in Jenkins angezeigt.
Um den von Jenkins verwendeten Pfad zu ändern, haben Sie zwei Möglichkeiten (AFAIK):
1) Bearbeiten Sie Ihre /etc/profile
-Datei und fügen Sie die gewünschten Pfade hinzu
2) Gehen Sie auf die Konfigurationsseite Ihres Slaves und fügen Sie die Umgebungsvariable PATH
mit dem Wert: $PATH:/followed-by/paths/you/want/to/add
hinzu.
Wenn Sie die zweite Option verwenden, werden sie in den Systeminformationen immer noch nicht angezeigt, aber Ihre Builds sehen die hinzugefügten Pfade.
Ich bin immer wieder auf dieses Problem gestoßen, aber jetzt füge ich nur hinzu:
source /etc/profile
Als ersten Schritt in meinem Build-Prozess. Jetzt sind alle meine nachfolgenden Regeln geladen, damit Jenkins reibungslos funktionieren kann.
Sie können die /etc/sysconfig/jenkins
-Datei auch bearbeiten, um Änderungen an den Umgebungsvariablen usw. vorzunehmen. Ich habe einfach source /etc/profile
am Ende der Datei hinzugefügt. /etc/profile
verfügt über alle richtigen PATH
-Variablen. Stellen Sie dabei sicher, dass Sie Jenkins neu starten
/etc/init.d/jenkins restart
Wir führen ZendServer CE aus, der Birne, Phing usw. in einem anderen Pfad installiert, so dass dies hilfreich war. Außerdem erhalten wir nicht die LD_LIBRARY_PATH
-Fehler, die wir bei Oracle-Clients und Jenkins verwendet haben.
Ich habe /etc/profile
, ~/.profile
und ~/.bash_profile
ausprobiert und keiner davon hat funktioniert. Ich fand, dass das Bearbeiten von ~/.bashrc
für den Jenkins-Sklaven-Account durchgeführt wurde.
Die Informationen zu dieser Antwort sind veraltet. Sie müssen zu Jenkins konfigurieren> gehen. Anschließend können Sie auf klicken, um ein Umgebungsvariablen-Schlüsselwertpaar hinzuzufügen.
beispiel: export MYVAR=test
wäre MYVAR
der Schlüssel und test
der Wert.
In meiner neueren EC2-Instanz fügte ich einfach den neuen Wert zum PATH des Jenkins-Benutzers .profil hinzu und starte dann einen Neustart von Tomcat für mich.
In einer älteren Instanz, in der die Konfiguration anders ist, war die Verwendung von # 2 aus Sagars Antwort das einzige, was funktionierte (d. H. .Profile, .bash * funktionierte nicht).
Könnten Sie es nicht einfach als Umgebungsvariable in den Jenkins-Einstellungen hinzufügen:
Verwalten Sie Jenkins -> Globale Eigenschaften> Umgebungsvariablen: Klicken Sie anschließend auf "Hinzufügen", um eine Eigenschaft PATH und deren Wert dem gewünschten Wert hinzuzufügen.
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 - Dieses Plugin ermöglicht es, Umgebungsvariablen hinzuzufügen und ein Setup-Skript auszuführen, um eine Umgebung für den Job einzurichten.
So habe ich dieses nervige Problem gelöst:
Ich änderte die Variable PATH
, als @sagar in seiner zweiten Option vorschlug, aber ich erhielt immer noch einen anderen PATH
-Wert als ich erwartet hatte.
Schließlich fand ich heraus, dass das EnvInject
-Plugin meine PATH
-Variable ersetzte!
Ich könnte also entweder EnvInject
deinstallieren oder einfach die PATH-Variable einfügen.
Da viele unserer Jenkins-Jobs dieses Plugin verwenden, wollte ich es nicht deinstallieren ...
Also habe ich eine Datei erstellt: environment_variables.properties
in meinem Jenkins Home-Verzeichnis.
Diese Datei enthielt den Pfadumgebungswert, den ich brauchte: PATH=$PATH:/usr/local/git/bin/
.
Von der Jenkins-Weboberfläche aus: Manage Jenkins -> Configure System
. In diesem Bildschirm habe ich die Option Prepare jobs environment
markiert und im Feld Properties File Path
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.properties
-Datei stecke.
Ich hatte in dieser Frage nur Fortschritte nach einem "/etc/init.d/jenkins force-reload". Ich empfehle, das vor allem anderen zu versuchen und es zu verwenden, anstatt es neu zu starten.
Jenkins unterstützt auch das Format PATH+<name>
zum Voranstellen an jede Variable, nicht nur PATH:
Globale Umgebungsvariablen oder Knoten Umgebungsvariablen:
Dies wird auch im Pipeline-Schritt withEnv
unterstützt:
node {
withEnv(['PATH+Java=/path/to/Java/bin']) {
...
}
}
Man beachte nur, dass sie der Variablen vorangeht. Wenn es angehängt werden muss, müssen Sie tun, was die anderen Antworten zeigen.
Siehe das Dokument Pipeline-Schritte hier .
Sie können auch die Syntax PATH + WHATEVER =/etwas verwenden, um/etwas vor $ PATH zu stellen
Oder die Java-Dokumente zu EnvVars hier .
Bei meinem Ubuntu 13.04 habe ich einige Verbesserungen vorgenommen, bevor ich damit Erfolg hatte:
export PATH = $ PATH:/einige/neue/Pfad/bin
Hinzufügen
/usr/bin/bash
beim
Jenkins -> Jenkins verwalten -> System konfigurieren -> Shell -> Shell ausführbar
Jenkins verwendet das Sh, so dass auch/etc/profile für mich nicht funktioniert. Wenn ich das hier hinzufüge, habe ich alle env.
source ~/.bashrc
Ich habe zum ersten Mal überprüft, dass Jenkins BASH ausgeführt hat, mit echo $Shell
und echo $BASH
(Hinweis: Ich lege explizit #!/bin/bash
auf den Textbereich in Jenkins. Ich bin nicht sicher, ob dies eine Voraussetzung ist, um BASH zu erhalten). source
ing /etc/profile
wie von anderen vorgeschlagen, funktionierte nicht.
Ich habe /etc/profile
gesucht
if [ "$PS1" ]; then
...
und das Überprüfen von "$ PS1" ergab null. Ich habe es mit Spoofing $PS1
versucht, ohne Erfolg
export PS1=1
bash -c 'echo $PATH'
dies führte jedoch nicht zum gewünschten Ergebnis (fügen Sie den Rest des $PATH
hinzu, den ich erwarte). Aber wenn ich bash sage, interaktiv zu sein
export PS1=1
bash -ci 'echo $PATH'
der $PATH
wurde wie erwartet geändert.
Ich habe versucht herauszufinden, wie man eine interaktive Shell richtig fälscht, um /etc/bash.bashrc
zum Laden zu bekommen. Es stellt sich jedoch heraus, dass alles, was ich brauchte, in ~/.bashrc
war, also löste es einfach source
ing das Problem.
Ich habe alle Dinge von oben aus probiert - bei mir funktionierte das nicht.
Ich habe zwei Lösungen gefunden (beide für SSH-Slave)
Gehen Sie zu den Slave-Einstellungen
Fügen Sie eine neue Umgebungsvariable hinzu
Der "$ {HOME}" - Teil ist wichtig. Damit ist der zusätzliche PATH absolut . Relativer 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"
}
}
}
}
}
Ich habe Jenkins 1.639 auf SLES 11 SP3 über Zypper (Paketmanager) installiert. Die Installation von Jenkins wurde als Dienst konfiguriert
# service jenkins
Usage: /etc/init.d/jenkins {start|stop|status|try-restart|restart|force-reload|reload|probe}
Obwohl /etc/init.d/jenkins
sources /etc/sysconfig/jenkins
, werden dort festgelegte env-Variablen nicht vom jenkins-Prozess geerbt, da er in einer separaten Login-Shell mit einer neuen Umgebung wie dieser gestartet wird:
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
Wie ich es geschafft habe, env vars für den jenkins-Prozess festzulegen, ist .bashrc
in seinem Home-Verzeichnis - /var/lib/jenkins
. Ich musste /var/lib/jenkins/.bashrc
erstellen, da es vorher nicht existierte.
Die Ausführung des Befehls mit Umgebungsvariablen ist ebenfalls wirksam. Natürlich müssen Sie dies für jeden Befehl tun, den Sie ausführen. Wahrscheinlich verfügen Sie jedoch über ein Jobskript, sodass Sie wahrscheinlich nur einen Befehl pro Build haben. Mein Jobskript ist ein Python-Skript, das die Umgebung verwendet, um zu entscheiden, welcher Python verwendet werden soll. Daher musste ich /usr/local/bin/python2.7 in seinen Pfad einfügen:
PATH=/usr/local/bin <my-command>
Unter Ubuntu bearbeite ich einfach/etc/default/jenkins und füge am Ende source/etc/profile hinzu, und es funktioniert für mich.
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 erneut an.
Trotz der Systeminformationen hat es funktioniert.