Zmienne środowiskowe Jenkins / Hudson


101

Uruchamiam Jenkins od użytkownika jenkins, który $PATHustawił coś, a kiedy wchodzę do interfejsu internetowego Jenkinsa, w oknie Właściwości systemu ( http://$host/systemInfo) widzę inny $PATH.

Zainstalowałem Jenkins na Centos z natywnym rpm z witryny Jenkins. Używam skryptu startowego dostarczonego z instalacją przy użyciusudo /etc/init.d/jenkins start

Czy ktoś może mi wyjaśnić, dlaczego tak się dzieje?


1
Jeśli logujesz się jako jenkins i echo $PATHczy zgadza się to z tym, co widzisz w jenkins?
— Upgradingdave

3
@Dave nie, to nie pasuje. nie mogę zrozumieć dlaczego
— Michael

8
Powodem, dla którego nie pasuje, jest to, że kiedy logujesz się jako użytkownik jenkins, wywołujesz powłokę logowania, podczas gdy jenkins po prostu wykonuje / bin / sh -xe {twój skrypt}, więc nie działa przez ten sam zestaw skryptów które zmieniają zmienną środowiskową PATH. W rzeczywistości zestaw skryptów różni się w zależności od konkretnego smaku * nix i / lub powłoki, którą zainstalowałeś. Testowałem na AWS Linux AMI z jenkinsem i niestety żaden z / etc / profile /etc/profile.d/xxx.sh / etc / bashrc / etc / environment ~ / .bash_profile ~ / .profile ~ / .bashrc nie był w stanie wpłynąć na PATH przekazaną do / bin / sh
— Luke

Odpowiedzi:


141

Michael,

Dwie rzeczy:

Kiedy Jenkins łączy się z komputerem, trafia do shpowłoki, a nie bashpowłoki (przynajmniej tak zauważyłem - mogę się mylić). Dlatego wszelkie zmiany wprowadzone w $ PATH w pliku bashrc nie są brane pod uwagę.

Ponadto, wszelkie zmiany, które wprowadzisz w $ PATH w swojej lokalnej powłoce (takiej, do której osobiście korzystasz z ssh) nie pojawią się w Jenkinsie.

Aby zmienić ścieżkę używaną przez Jenkins, masz dwie opcje (AFAIK):

1) Edytuj /etc/profileplik i dodaj żądane ścieżki

2) Przejdź do strony konfiguracji swojego slave'a i dodaj zmienną środowiskową PATHo wartości:$PATH:/followed-by/paths/you/want/to/add

Jeśli użyjesz drugiej opcji, Twoje Informacje o systemie nadal nie będą jej wyświetlać, ale Twoje kompilacje będą widzieć dodane ścieżki.


2
Ta odpowiedź zadziałała dla mnie, ale zauważyłem, że Jenkins jest bardzo wrażliwy na to, co piszesz na stronie konfiguracji. Nie mogłem go zmusić do pracy ze ścieżkami ze spacjami.
— miguelSantirso

Tak, ale kiedy wprowadzasz ścieżki ze spacjami w powłoce UNIX, spacja jest zwykle poprzedzana znakiem ``. Dlatego jeśli ścieżka to „/ opt / bin / My Folder Name”, możesz zamiast tego wypróbować „/ opt / bin / My \ Folder \ Name”. Pozwoli to uciec z przestrzeni i pozwoli ci z nich korzystać.
— Sagar

11
Rozwiązanie 2 jest drogą do zrobienia.
— gagarine

2
Kontynuacja: w moim systemie Ubuntu usługa jenkins jest początkiem pracy, więc modyfikowałem stary skrypt sysvinit. Złe miejsce. Kiedy poprawiam skrypt /etc/init/jenkins.conf i aktualizuję PATH przed java exec, to wydaje się działać.
— Stabledog

15
Jest mały ciemny róg: mistrz Jenkinsa buforuje zmienne środowiskowe od niewolników w celu łatania dostosowań. Więc jeśli zmienisz zmienne środowiskowe na slave (system lub użytkownik), musisz zrestartować mastera, aby zaktualizować konfigurację slave.
— Thinkeye,

36

Ciągle napotykałem ten problem, ale teraz po prostu dodaję:

source /etc/profile

Jako pierwszy krok w procesie tworzenia. Teraz wszystkie moje kolejne reguły są załadowane, aby Jenkins działał płynnie.


6
Co? Szczegółowo proszę ... dodać gdzie? w jaki sposób? kiedy? Czy to działa w systemie Windows?
— HX_unbanned

Zakładam, że w ramach kompilacji uruchamiasz polecenie powłoki. Umieść source /etc/profilejako pierwsze polecenie w tym obszarze Build> Execute Shell> Command textarea.
— bryan kennedy

2
Działa na Macu, również znalazłem ścieżki takie jak /usr/local/binsą określone w /etc/pathsi /etc/pathssą używane przez /usr/libexec/path_helper, a path_helper jest wykonywany w /etc/profile.
— Hiroshi

1
uratowałeś mi dzień :)
— RameshVel

Sourcing / etc / profile pokazuje ścieżkę podczas dodawania debugowania `` echo $ PATH '' w zadaniu, ale jeśli spojrzę na zmienne środowiskowe dla zadania, to nie jest to samo.
— Elijah Lynn

23

Możesz także edytować /etc/sysconfig/jenkinsplik, aby wprowadzić zmiany w zmiennych środowiskowych, itp. Po prostu dodałem source /etc/profilena końcu pliku. /etc/profilema wszystkie odpowiednie PATHustawienia zmiennych. Kiedy to zrobisz, upewnij się, że uruchomiłeś ponownie Jenkins

/etc/init.d/jenkins restart

Używamy ZendServer CE, który instaluje pear, phing itp. W innej ścieżce, więc to było pomocne. Ponadto nie otrzymujemy LD_LIBRARY_PATHbłędów, które otrzymaliśmy w przypadku klienta Oracle i Jenkins.


To jest kluczowy komentarz lub zrestartuj jenkins z {jenkins-url} / restart lub {jenkins-url} / safeRestart. Waliłem głowę, dlaczego zmiany ścieżki nie zostały odebrane, edytując nawet / etc / environment na hoście ubuntu - RESTART to naprawi, co zweryfikował {jenkins-url} /
— systemInfo

Wszystkie inne zawiodły, to jedyny, który zadziałał! Chciałbym, żeby było to bardziej rozpowszechnione, więc nie zmarnowałbym ostatnich kilku godzin!
— Brad Bonkoski

15

Próbowałem /etc/profile, ~/.profilei ~/.bash_profilei żaden z tych pracował. Okazało się, że edycja ~/.bashrckonta jenkins slave tak.


3
to dlatego, że powłoka niezalogowana nie czyta /etc/profileani~/.profile
— Vincenzo

9

Informacje w tej odpowiedzi są nieaktualne. Musisz przejść do Konfiguruj Jenkins> Następnie możesz kliknąć, aby dodać stamtąd parę klucz-wartość zmiennej środowiskowej.

np .: export MYVAR=testwould be MYVARjest kluczem i testjest wartością.


5

Na mojej nowszej instancji EC2 po prostu dodanie nowej wartości do PATH użytkownika .profile użytkownika Jenkinsa, a następnie ponowne uruchomienie tomcata działało.

W starszej instancji, gdzie konfiguracja jest inna, użycie numeru 2 z odpowiedzi Sagara było jedyną rzeczą, która działała (tj. .Profile, .bash * nie działało).


4

Znalazłem do tego dwie wtyczki. Jeden ładuje wartości z pliku, a drugi umożliwia konfigurację wartości na ekranie konfiguracji zadania.

Wtyczka Envfile - ta wtyczka umożliwia ustawienie zmiennych środowiskowych za pośrednictwem pliku. Format pliku musi być standardowym formatem pliku właściwości Java.

Wtyczka EnvInject - ta wtyczka umożliwia dodawanie zmiennych środowiskowych i wykonywanie skryptu instalacyjnego w celu skonfigurowania środowiska dla zadania.


4

Nie mógłbyś po prostu dodać go jako zmiennej środowiskowej w ustawieniach Jenkinsa:

Zarządzaj Jenkins -> Właściwości globalne> Zmienne środowiskowe: a następnie kliknij „Dodaj”, aby dodać ścieżkę właściwości i jej wartość do tego, czego potrzebujesz.


1
Wydaje się, że jest to „Zarządzaj Jenkins -> Konfiguruj system -> Zmienne środowiskowe” w wersji 1.620.
— akaihola

4

Oto jak rozwiązałem ten irytujący problem:

Zmieniłem PATHzmienną, jak zasugerował @sagar w swojej drugiej opcji, ale nadal otrzymałem inną PATHwartość niż się spodziewałem.

W końcu dowiedziałem się, że to EnvInjectwtyczka zastąpiła moją PATHzmienną!

Mogłem więc odinstalować EnvInjectlub po prostu użyć go do wstrzyknięcia zmiennej PATH.

Ponieważ wiele naszych zadań Jenkinsa korzysta z tej wtyczki, nie chciałem jej odinstalowywać ...

Więc utworzyłem plik: environment_variables.properties w moim katalogu domowym Jenkins.

Ten plik zawierał wartość środowiska ścieżki, której potrzebowałem: PATH=$PATH:/usr/local/git/bin/ .

Z interfejsu WWW Jenkins: Manage Jenkins -> Configure System. Na tym ekranie - zaznaczyłem Prepare jobs environmentopcję, aw Properties File Pathpolu wpisałem ścieżkę do mojego pliku:/var/lib/jenkins/environment_variables.properties .

W ten sposób każde zadanie Jenkinsa, które otrzymujemy, otrzymuje zmienne, które umieściłem w tym environment_variables.propertiespliku.


1
To powinna być prawidłowa odpowiedź. Jak wspomniano, aktualizacja / etc / profile nie jest wykonalnym rozwiązaniem w systemie OSX, ponieważ plik jest tylko do odczytu i wymaga bałaganu z uprawnieniami. To rozwiązanie wydaje się najczystsze i wykorzystuje już istniejące wtyczki na Jenkins. Pamiętaj, aby zrestartować jenkins po utworzeniu pliku właściwości i ustawieniu go na Jenkins
— Voke Ransom Anighoro

3

Jenkins obsługuje również format PATH+<name>dołączania przed każdą zmienną, nie tylko PATH:

Globalne zmienne środowiskowe lub węzeł Zmienne środowiskowe:

Zmienna Jenkinsa + notacja

Jest to również obsługiwane w kroku potoku withEnv:

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

Zwróć uwagę, że poprzedza zmienną. Jeśli trzeba go dołączyć, musisz zrobić to, co pokazują inne odpowiedzi.

Zobacz dokument opisujący kroki rurociągu tutaj .

Możesz również użyć składni PATH + WHATEVER = / coś do dodania / coś do $ PATH

Lub dokumentacja java na EnvVars tutaj .


2

Osiągnąłem postęp w tej sprawie dopiero po "/etc/init.d/jenkins force-reload". Zalecam wypróbowanie tego przed czymkolwiek innym i używanie tego zamiast ponownego uruchamiania.


1
A gdzie właściwie dodałeś element PATH? Próbowałem każdego miejsca, jakie mogę sobie wyobrazić
— Stabledog

2

Na moim Ubuntu 13.04 wypróbowałem kilka poprawek, zanim udało mi się to:

  1. Edytuj /etc/init/jenkins.conf
  2. Znajdź miejsce, w którym zaczyna się polecenie „exec start-stop-server ...”
  3. Wstaw aktualizację środowiska tuż przed tym, tj

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


2

Dodaj

/usr/bin/bash

w

Jenkins -> Zarządzaj Jenkins -> skonfiguruj system -> Powłoka-> Plik wykonywalny powłoki

Jenkins używa sh, więc nawet / etc / profile nie działa dla mnie. Kiedy to dodam, mam wszystkie env.


Jaka wersja Jenkinsa pracowała dla Ciebie @ sumang_87? Nie pomogło mi na Jenkins 2.9
— hamx0r

1

Rozwiązanie, które zadziałało dla mnie

source ~/.bashrc

Wyjaśnienie

Po raz pierwszy zweryfikowałem, że Jenkins działa w BASH, z echo $SHELLi echo $BASH(uwaga, wyraźnie umieszczam #!/bin/bashna wierzchu obszaru tekstowego w Jenkinsie, nie jestem pewien, czy jest to wymóg uzyskania BASH). sourceing, /etc/profilejak sugerowali inni, nie działało.

Patrząc na /etc/profileznalazłem

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

a sprawdzenie „$ PS1” wykazało, że jest pusty. Próbowałem podszywać $PS1się bez skutku

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

jednak nie przyniosło to pożądanego rezultatu (dodaj resztę tego, $PATHco spodziewam się zobaczyć). Ale jeśli powiem bashowi, aby był interaktywny

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

$PATHzmieniono tak jak oczekiwano.

Próbowałem wymyślić, jak poprawnie sfałszować interaktywną powłokę, aby się /etc/bash.bashrczaładować, ale okazało się, że wszystko, czego potrzebowałem, było w dół ~/.bashrc, więc po prostu sourcerozwiązałem problem.


Upewnij się, że użyjesz polecenia, #!/bin/bash -elaby bash uruchomił się jako powłoka logowania. To powinno spowodować, że bash pozyska niezbędne pliki .rc
— Brandon

1

Próbowałem wszystkich rzeczy z góry - nie działały dla mnie.

Znalazłem dwa rozwiązania (oba dla SSH-Slave)

  1. Przejdź do ustawień slave

  2. Dodaj nową zmienną środowiskową

  3. ŚCIEŻKA
  4. $ {ŚCIEŻKA}: $ {HOME} /. Pub-cache / bin: $ {HOME} /. Local / bin

Część „$ {HOME}” jest ważna. To sprawia, że ​​dodatkowa PATH jest absolutna. Względna ścieżka mi nie odpowiada.

Opcja 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

W Ubuntu po prostu edytuję / etc / default / jenkins i na końcu dodaję źródło / etc / profile i to działa.


0

Skuteczne jest również uruchomienie polecenia z ustawioną zmienną środowiskową. Oczywiście musisz to zrobić dla każdego uruchamianego polecenia, ale prawdopodobnie masz skrypt zadania, więc prawdopodobnie masz tylko jedno polecenie na kompilację. Mój skrypt zadania to skrypt w języku Python, który używa środowiska, aby zdecydować, którego Pythona użyć, więc nadal musiałem umieścić /usr/local/bin/python2.7 w jego ścieżce:

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

0

U mnie zadziałało nadpisanie środowiska PATH dla niewolnika.

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

Następnie odłącz i ponownie podłącz slave.

Pomimo tego, co pokazywały informacje o systemie, zadziałało.


0

Mam Jenkins 1.639 zainstalowany na SLES 11 SP3 przez zypper (menedżer pakietów). Instalacja skonfigurowała jenkins jako usługę

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

Chociaż /etc/init.d/jenkinsźródła /etc/sysconfig/jenkins, wszelkie ustawione tam zmienne env nie są dziedziczone przez proces jenkins, ponieważ jest uruchamiany w oddzielnej powłoce logowania z nowym środowiskiem, takim jak to:

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

Sposób, w jaki udało mi się ustawić zmienne env dla procesu jenkinsa, znajduje się .bashrcw jego katalogu domowym - /var/lib/jenkins. Musiałem tworzyć, /var/lib/jenkins/.bashrcbo wcześniej tego nie było.


0

Oto, co zrobiłem na Ubuntu 18.04 LTS z Jenkins 2.176.2

Stworzyłem plik .bash_aliases i dodałem tam ścieżkę, zmienne proxy i tak dalej.

Na początku .bashrc było to zdefiniowane.

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

Sprawdza więc, czy jeśli uruchomimy powłokę nieinteraktywną, to nic tutaj nie robimy.

na dole .bashrc było dołączone dla .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

więc przeniosłem .bash_aliases ładując najpierw na .bashrc tuż nad nieinteraktywnym sprawdzaniem.

To nie zadziałało najpierw, ale potem odłączyłem slave i ponownie go podłączyłem, więc ponownie ładuje zmienne. Nie musisz restartować całych jenkinsów, jeśli modyfikujesz zmienne slave. po prostu odłącz i ponownie podłącz.


-1

1- Dodaj do swojego profilu plik ".bash_profile"

znajduje się w folderze „/ home / your_user /”

vi .bash_profile

Dodaj:

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

==> to obszar roboczy e jenkins

2- Jeśli używasz jetty: przejdź do pliku jenkins.xml

i dodaj :

<Arg>/apps/data/jenkins</Arg>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.