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?

Michael
źródło
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.

Sagar
źródło
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.

bryan kennedy
źródło
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.

dbiehl
źródło
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.

mmacvicar
źródło
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ą.

TJ Biddle
źródło
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).

Rob Barreca
źródł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.

Vicro
źródło
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.

Kiarash Zamanifar
źródło
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.

ofirbt
źródło
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 .

CJCombrink
źródło
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.

Rene Wooller
źródło
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

Stabledog
źródło
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.

sumang_87
źródło
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.

quickshiftin
źródło
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"
                }
            }
        }
    }
}
Mike Mitterer
źródło
0

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

Arx Cruz
źródło
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>
Joshua Richardson
źródło
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.

Matt
źródł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.

Peter Dotchev
źródł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.

Juge
źródło
-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>
Fadid
źródło