Jak ustawić zmienne środowiskowe w Jenkins?

228

Chciałbym móc zrobić coś takiego:

AOEU=$(echo aoeu)

i ustaw Jenkinsa AOEU=aoeu.

Sekcja Zmienne środowiskowe w Jenkins tego nie robi. Zamiast tego ustawia AOEU='$(echo aoeu)'.

Jak mogę zmusić Jenkinsa do oceny polecenia powłoki i przypisania danych wyjściowych do zmiennej środowiskowej?

W końcu chcę mieć możliwość przypisania modułu wykonującego zadanie do zmiennej środowiskowej, która może być przekazywana do innych skryptów lub z nich używana.

Noel Yap
źródło
2
Wtyczka EnvInject ma poważną lukę w zabezpieczeniach. Teraz Jenkins ma wbudowaną obsługę tego stackoverflow.com/a/53430757/1753177
lambodar
@lambodar link po prostu przechodzi do pytania
Z. Cochrane
@ Z.Cochrane, jest to link do odpowiedzi, która została usunięta przez autora.
Noel Yap

Odpowiedzi:

217

Można to zrobić za pomocą wtyczki EnvInject w następujący sposób:

  1. Utwórz krok kompilacji „Wykonaj powłokę”, który działa:

    echo AOEU=$(echo aoeu) > propsfile
    
  2. Utwórz krok kompilacji zmiennych środowiskowych Inject i ustaw „Ścieżkę pliku właściwości” na propsfile.

Uwaga : Ta wtyczka jest (przeważnie) niezgodna z wtyczką Pipeline.

malenkiy_scot
źródło
4
EnvInject nie radzi sobie z sytuacją, którą podałem powyżej: [EnvInject] - Wstrzykiwanie jako zmienne środowiskowe zawartość właściwości AOEU = $ (echo aoeu) [EnvInject] - Zmienne wstrzyknięte pomyślnie. [EnvInject] - Unset nierozwiązana zmienna „AOEU”.
Noel Yap
1
To rozwiązanie wykorzystuje składnię powłoki Unix i nie będzie działać w systemie Windows.
fbmd 16.04.15
2
@fbmd Używam go w systemie Windows. Musisz tylko upewnić się, że masz shna ścieżce.
Custodio
2
EnvInject nie działa, jeśli „wykonanie powłoki” kończy się z błędem, ponieważ kompilacja nie przechodzi do części wstrzykiwania.
Chadi
1
@ Vitim.us, foozostanie wyeksportowany w tej konkretnej akcji powłoki, ale nie w innych akcjach.
Noel Yap
109

Najprostszy sposób

Wtyczki EnvInject można używać do wstrzykiwania zmiennych środowiskowych podczas uruchamiania kompilacji. Na przykład:

Dodaj klucz = wartość (bash OK!) W sekcji „Środowisko kompilacji” -> „Wstaw zmienne środowiskowe do procesu budowania” -> „Zawartość właściwości”

Skąd wiesz, że to działa

EnvInject - zmienne wstrzyknięte pomyślnie

kenny_k
źródło
5
Spróbuj ustawić wartość na podstawie danych wyjściowych polecenia powłoki.
Noel Yap
1
@NoelYap też działa, o ile na końcu linia ocenia key=value. W moim przypadku użycia cat app/build.gradle | grep "def majorVersion" | python -c 'import sys,re,os; print("VERSION_NUMBER="+re.findall(r"[\d+\.]+", sys.stdin.read())[0]+os.environ["BUILD_NUMBER"])'
generuję
@ theFunkyEngineer jakiej wersji EnvInject używasz? W wersji 1.91.3 polecenie takie jak twoje jest interpretowane jako „cat = app ...”. Byłoby wspaniale, gdyby ta funkcja była obsługiwana, ale mam wrażenie, że to mogło zadziałać dla ciebie przez przypadek.
killthrush
1
próbuje przypisać wartość do wyjścia polecenia powłoki nie działa na mnie albo: BUILD_DATE=date "+%Y-%m-%d-%H_%M_%S"i BUILD_DATE=$(date "+%Y-%m-%d-%H_%M_%S"), a BUILD_DATE=`date "+%Y-%m-%d-%H_%M_%S"`nie dla mnie
scottysseus
1
@ scottyseus Skończyło się na tym wiki.jenkins-ci.org/display/JENKINS/Environment+Script+Plugin działało jak urok. stackoverflow.com/a/38286383/1240268
Andy Hayden
56

W moim przypadku musiałem dodać JMETER_HOMEzmienną środowiskową, aby była dostępna za pośrednictwem skryptów kompilacji Ant we wszystkich projektach na moim serwerze Jenkins (Linux), w sposób, który nie kolidowałby z moim lokalnym środowiskiem kompilacji (Windows i Mac) w build.xmlskrypcie . Ustawianie zmiennej środowiskowej za pomocą Zarządzaj Jenkins - Konfiguruj system - Właściwości globalne było najłatwiejszym i najmniej inwazyjnym sposobem na osiągnięcie tego. Nie są wymagane żadne wtyczki.

Zarządzaj Jenkins Global Properties


Zmienna środowiskowa jest następnie dostępna w Ant za pośrednictwem:

<property environment="env" />
<property name="jmeter.home" value="${env.JMETER_HOME}" />

Można to zweryfikować, dodając:

<echo message="JMeter Home: ${jmeter.home}"/>

Który produkuje:

JMeter Home: ~ / .jmeter

vallismortis
źródło
To jest własność globalna. Wpłynie na WSZYSTKIE zadania w Jenkins. Przypuszczam, że chcę tylko tę właściwość do jednego zadania?
IgorGanapolsky
Dodałem do Manage Jenkins - Konfiguruj system - Właściwości globalne, następujące: git /path/to/my/giti PATH+git /path/to/my/git. Jednakże, jeśli usiłuję dostępu gitz A Jenkins pipeline script, otrzymuję: /bin/sh: git: command not found.
octavian
1
Musiałem tylko skonfigurować zmienną środowiskową JAVA_HOME i ta odpowiedź była tą, która mi pomogła.
Sandoval0992
19

Wtyczki Injector można używać do ustawiania zmiennych środowiskowych w Jenkins na poziomie zadania i węzła. Poniżej pokażę, jak ustawić je na poziomie pracy.

  1. Z interfejsu internetowego Jenkins przejdź do strony Manage Jenkins > Manage Pluginsi zainstaluj wtyczkę.

Wtyczka wtyczki środowiska

  1. Przejdź do Configureekranu swojej pracy
  2. Znajdź Add build stepw Buildsekcji i wybierzInject environment variables
  3. Ustaw żądaną zmienną środowiskową jako wzorzec VARIABLE_NAME = VALUE. W moim przypadku zmieniłem wartość zmiennej USERPROFILE

wprowadź opis zdjęcia tutaj

Jeśli musisz zdefiniować nową zmienną środowiskową w zależności od niektórych warunków (np. Parametrów zadania), możesz odnieść się do tej odpowiedzi .

Ayaz Alifov
źródło
16

Możesz spróbować czegoś takiego

stages {
        stage('Build') {
            environment { 
                    AOEU= sh (returnStdout: true, script: 'echo aoeu').trim()
                }
            steps {
                sh 'env'
                sh 'echo $AOEU'
            }
        }
    }
JSixface
źródło
To nie analizuje.
rjurney
2
Ten format jest przeznaczony dla projektu potoku Jenkinsfile. W jakim typie pracy używasz tego fragmentu?
JSixface
1
Działa to idealnie w Jenkinsfileprzypadku potoku (nie zadania)! To niesamowite, dzięki za to!
mathielo
14

EnvInject Plugin aka ( Environment Injector Plugin ) daje kilka opcji ustawiania zmiennych środowiskowych z konfiguracji Jenkins.

Wybierając Inject environment variables to the build processotrzymasz:

  • Properties File Path
  • Properties Content
  • Script File Path

  • Script Content

  • i wreszcie Evaluated Groovy script.


Evaluated Groovy scriptdaje możliwość ustawienia zmiennej środowiskowej na podstawie wyniku wykonanego polecenia :

  • z executemetodą:
    return [HOSTNAME_SHELL: 'hostname'.execute().text, 
        DATE_SHELL: 'date'.execute().text,
        ECHO_SHELL: 'echo hello world!'.execute().text
    ]
  • lub z wyraźnym Groovykodem:
    return [HOSTNAME_GROOVY: java.net.InetAddress.getLocalHost().getHostName(),
        DATE_GROOVY: new Date()
    ] 

(Więcej szczegółów na temat każdej metody można znaleźć w pomocy do wbudowania (?))


Niestety nie możesz zrobić tego samego, Script Contentjak to stwierdza:

Uruchom plik skryptu, którego celem jest ustawienie środowiska, takiego jak tworzenie folderów, kopiowanie plików itp. Podaj treść pliku skryptu. Możesz użyć powyższych zmiennych właściwości. Jednak dodawanie lub zastępowanie zmiennych środowiskowych w skrypcie nie ma wpływu na zadanie kompilacji .

luka5z
źródło
12

Istnieje Build Env Propagator Plugin, który pozwala dodawać nowe zmienne środowiskowe kompilacji, np

Kompilacja Jenkins - Propaguj zmienne środowiskowe kompilacji

Każdy kolejny krok Propagate kompilacji zmiennych środowiskowych zastąpi wcześniej zdefiniowane wartości zmiennych środowiskowych.

kenorb
źródło
Dziękuję Ci! Kompilacja Env Propagator Plugin działał, kiedy go wypróbowałem, i wspaniale jest mieć możliwość ustawiania zmiennych środowiskowych podczas kroków Kompilacji!
twasbrillig
10

W moim przypadku skonfigurowałem zmienne środowiskowe przy użyciu następującej opcji i zadziałało-

Manage Jenkins -> Configure System -> Global Properties -> Environment Variables -> Add
nik
źródło
To najlepszy sposób
Long Nguyen
7

Zwykle można skonfigurować zmienne środowiskowe we właściwościach globalnych w Konfiguruj system .

Jednak w przypadku zmiennych dynamicznych z podstawieniem powłoki może być konieczne utworzenie pliku skryptu w katalogu Jenkins HOME i wykonanie go podczas kompilacji. Wymagany jest dostęp SSH. Na przykład.

  1. Zaloguj się jako Jenkins: sudo su - jenkinslubsudo su - jenkins -s /bin/bash
  2. Utwórz skrypt powłoki, np .:

    echo 'export VM_NAME="$JOB_NAME"' > ~/load_env.sh
    echo "export AOEU=$(echo aoeu)" >> ~/load_env.sh
    chmod 750 ~/load_env.sh
    
  3. W Jenkins Build ( Wykonaj powłokę ) wywołaj skrypt i jego zmienne zanim cokolwiek innego, np

    source ~/load_env.sh
    
kenorb
źródło
niestety nie działało dla mnie. po sudo su - jenkins, wciąż echo $USERmi daje root.
prayagupd
@prayagupd Musisz zasymulować pełne logowanie, więc użyj su -ldo tego parametru, w przeciwnym razie zadaj osobne pytanie.
kenorb
@kenorb po wywołaniu skryptu, jak ponownie odczytać zmienną env? na przykład to nie działa sh "" "źródło ~ / load_env.sh echo" VM_NAME: $ VM_NAME "echo" VM_NAME: $ {VM_NAME} "" ""
aung
7

To jest fragment kodu do przechowywania zmiennej środowiskowej i uzyskiwania do niej dostępu.

node {
   withEnv(["ENABLE_TESTS=true", "DISABLE_SQL=false"]) {
      stage('Select Jenkinsfile') {
          echo "Enable test?: ${env.DEVOPS_SKIP_TESTS}
          customStep script: this
      }
   }
}

Uwaga: Wartość zmiennej środowiskowej nadchodzi jako ciąg. Jeśli chcesz użyć go jako wartości logicznej, musisz go przeanalizować za pomocą Boolean.parse (env.DISABLE_SQL).

barotdeep
źródło
4

Wypróbuj wtyczkę środowiska Script ( GitHub ), która jest bardzo podobna do EnvInject . Pozwala na uruchomienie skryptu przed kompilacją (po sprawdzeniu SCM), który generuje dla niego zmienne środowiskowe. Na przykład

Jenkins Build - Regularna praca - Build Environment

a w skrypcie możesz wydrukować np. FOO=barna standardowe wyjście, aby ustawić tę zmienną.

Przykład dołączenia do istniejącej PATHzmiennej-style:

echo PATH+unique_identifier=/usr/local/bin

Możesz więc robić wszystko, czego potrzebujesz w skrypcie - albo catplik, albo uruchomić skrypt w innym języku z drzewa źródłowego projektu itp.

kenorb
źródło
1

Możesz użyć jednego z następujących sposobów wymienionych poniżej:

  1. Użyj Env Inject Plugin do tworzenia zmiennych środowiskowych. Postępuj zgodnie z instrukcją użytkowania i szczegółami https://github.com/jenkinsci/envinject-plugin
    1. Przejdź poniżej i możesz dodać

Zarządzaj Jenkins -> Konfiguruj system -> Właściwości globalne -> Zmienne środowiskowe -> Dodaj

wprowadź opis zdjęcia tutaj

Sumit
źródło
0

Z jakiegoś powodu sudo su - jenkinsnie loguje mnie do jenkins użytkownika , skończyło się na innym podejściu.

Udało mi się ustawić globalne zmienne env przy użyciu Jenkins config.xmlat/var/lib/jenkins/config.xml (zainstalowane w Linux / RHEL) - bez użycia zewnętrznych wtyczek.

Po prostu musiałem zatrzymać dodawanie Jenkinsa, potem dodawanie globalNodeProperties, a następnie restartowanie.

Przykład, mam definiowania zmiennych APPLICATION_ENVIRONMENTi SPRING_PROFILES_ACTIVEdo continious_integrationdołu,

<?xml version='1.0' encoding='UTF-8'?>
<hudson>

  <globalNodeProperties>
    <hudson.slaves.EnvironmentVariablesNodeProperty>
      <envVars serialization="custom">
        <unserializable-parents/>
        <tree-map>
          <default>
            <comparator class="hudson.util.CaseInsensitiveComparator"/>
          </default>
          <int>2</int>
          <string>APPLICATION_ENVIRONMENT</string>
          <string>continious_integration</string>
          <string>SPRING_PROFILES_ACTIVE</string>
          <string>continious_integration</string>
        </tree-map>
      </envVars>
    </hudson.slaves.EnvironmentVariablesNodeProperty>
  </globalNodeProperties>
</hudson>
prayagupd
źródło
-3

Używamy groovy file job:

description('')
steps {
    environmentVariables {
        envs(PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true)
    }
}
techguy2000
źródło