it-swarm.com.de

Jenkins/Hudson-Umgebungsvariablen

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?

93
Michael

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. 

131
Sagar

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.

34
bryan kennedy

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.

19
dbiehl

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.

13
mmacvicar

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.

9
TJ Biddle

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).

5
Rob Barreca

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.

5

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.

4
Vicro

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.

4
ofirbt

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.

2
Rene Wooller

Jenkins unterstützt auch das Format PATH+<name> zum Voranstellen an jede Variable, nicht nur PATH:

Globale Umgebungsvariablen oder Knoten Umgebungsvariablen:

 Jenkins variable + notation

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 .

2
The Badger

Bei meinem Ubuntu 13.04 habe ich einige Verbesserungen vorgenommen, 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:/einige/neue/Pfad/bin

2
Stabledog

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.

1
sumang_87

Lösung, die für mich funktioniert hat

source ~/.bashrc

Erläuterung

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). sourceing /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 sourceing das Problem.

1
quickshiftin

Ich habe alle Dinge von oben aus probiert - bei mir funktionierte das nicht.

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 "$ {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"
                }
            }
        }
    }
}
0
Mike Mitterer

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.

0
Peter Dotchev

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>
0

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

0
Arx Cruz

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.

0
Matt