Wie setze ich Umgebungsvariablen in Jenkins?

228

Ich möchte in der Lage sein, etwas zu tun wie:

AOEU=$(echo aoeu)

und habe Jenkins eingestellt AOEU=aoeu.

Der Abschnitt Umgebungsvariablen in Jenkins macht das nicht. Stattdessen setzt es AOEU='$(echo aoeu)'.

Wie kann ich Jenkins dazu bringen, einen Shell-Befehl auszuwerten und die Ausgabe einer Umgebungsvariablen zuzuweisen?

Schließlich möchte ich in der Lage sein, den Executor eines Jobs einer Umgebungsvariablen zuzuweisen, die an andere Skripte übergeben oder von diesen verwendet werden kann.

Noel Yap
quelle
2
Das EnvInject-Plugin weist eine schwerwiegende Sicherheitslücke auf. Jetzt hat Jenkins eingebaute Unterstützung für diesen stackoverflow.com/a/53430757/1753177
Lambodar
@lambodar der Link geht nur auf die Frage
Z. Cochrane
@ Z.Cochrane, es ist ein Link zu einer Antwort, die vom Autor gelöscht wurde.
Noel Yap

Antworten:

217

Dies kann über das EnvInject-Plugin folgendermaßen erfolgen:

  1. Erstellen Sie einen Build-Schritt "Shell ausführen", der ausgeführt wird:

    echo AOEU=$(echo aoeu) > propsfile
    
  2. Erstellen Sie einen Erstellungsschritt für Inject-Umgebungsvariablen und setzen Sie "Properties File Path" auf propsfile.

Hinweis : Dieses Plugin ist (meistens) nicht mit dem Pipeline-Plugin kompatibel.

malenkiy_scot
quelle
4
EnvInject behandelt die oben angegebene Situation nicht: [EnvInject] - Injizieren des Umgebungsinhalts als Umgebungsvariablen AOEU = $ (echo aoeu) [EnvInject] - Variablen erfolgreich injiziert. [EnvInject] - Nicht aufgelöste nicht aufgelöste 'AOEU'-Variable.
Noel Yap
1
Diese Lösung verwendet die Unix-Shell-Syntax und funktioniert unter Windows nicht.
fbmd
2
@fbmd Ich führe es unter Windows aus. Sie müssen nur sicherstellen, dass Sie shauf dem Weg sind.
Custodio
2
EnvInject funktioniert nicht, wenn die "Execute Shell" mit einem Fehler beendet wird, da der Build nicht zum Injektionsteil übergeht.
Chadi
1
@ Vitim.us foowird in dieser bestimmten Shell-Aktion exportiert, jedoch nicht in andere Aktionen.
Noel Yap
109

Der einfachste Weg

Sie können das EnvInject-Plugin verwenden, um Umgebungsvariablen beim Start des Builds einzufügen . Beispielsweise:

Fügen Sie key = value (bash OK!) Unter 'Build Environment' -> 'Injizieren von Umgebungsvariablen in den Build-Prozess' -> 'Properties Content' hinzu.

Woher weißt du, dass es funktioniert?

EnvInject - Variablen erfolgreich injiziert

kenny_k
quelle
5
Versuchen Sie, den Wert basierend auf der Ausgabe eines Shell-Befehls festzulegen.
Noel Yap
1
@NoelYap Funktioniert auch, solange am Ende die Zeile ausgewertet wird key=value. In meinem Anwendungsfall generiere ich die Zeile vollständig: 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"])'
kenny_k
@theFunkyEngineer Welche Version von EnvInject verwenden Sie? Mit 1.91.3 wird ein Befehl wie der Ihre als "cat = app ..." interpretiert. Wäre toll, wenn diese Funktion unterstützt würde, aber ich habe das Gefühl, dass dies versehentlich für Sie funktioniert hat.
Killthrush
1
Sie versuchen, einen Wert an die Ausgabe eines Shell - Befehl zuweisen arbeiten ist für mich auch nicht: BUILD_DATE=date "+%Y-%m-%d-%H_%M_%S"und BUILD_DATE=$(date "+%Y-%m-%d-%H_%M_%S")und BUILD_DATE=`date "+%Y-%m-%d-%H_%M_%S"`nicht für mich arbeiten
scottysseus
1
@scottyseus Am Ende habe ich dieses wiki.jenkins-ci.org/display/JENKINS/Environment+Script+Plugin benutzt, das wie ein Zauber funktioniert hat. stackoverflow.com/a/38286383/1240268
Andy Hayden
56

In meinem Fall musste ich die JMETER_HOMEUmgebungsvariable hinzufügen, die über meine Ant-Build-Skripte in allen Projekten auf meinem Jenkins-Server (Linux) verfügbar sein soll, so dass meine lokale Build-Umgebung (Windows und Mac) im build.xmlSkript nicht beeinträchtigt wird . Das Festlegen der Umgebungsvariablen über Jenkins verwalten - System konfigurieren - Globale Eigenschaften war der einfachste und am wenigsten aufdringliche Weg, dies zu erreichen. Es sind keine Plug-Ins erforderlich.

Verwalten Sie die globalen Eigenschaften von Jenkins


Die Umgebungsvariable ist dann in Ant verfügbar über:

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

Dies kann überprüft werden, indem Folgendes hinzugefügt wird:

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

Welches produziert:

JMeter Home: ~ / .jmeter

vallismortis
quelle
Das ist eine globale Eigenschaft. Es werden ALLE Jobs auf Jenkins ausgeführt. Angenommen, ich möchte diese Eigenschaft nur für einen Job?
Igor Ganapolsky
Ich habe zu Jenkins verwalten - System konfigurieren - Globale Eigenschaften Folgendes hinzugefügt: git /path/to/my/gitund PATH+git /path/to/my/git. Wenn ich jedoch versuche, gitüber das a darauf zuzugreifen Jenkins pipeline script, erhalte ich : /bin/sh: git: command not found.
Oktavian
1
Ich musste nur die Umgebungsvariable JAVA_HOME einrichten, und diese Antwort hat mir geholfen.
Sandoval0992
19

Mit dem Environment Injector Plugin können Sie Umgebungsvariablen in Jenkins auf Job- und Knotenebene festlegen. Im Folgenden werde ich zeigen, wie sie auf Jobebene eingestellt werden.

  1. Gehen Sie über die Jenkins-Weboberfläche zu Manage Jenkins > Manage Pluginsund installieren Sie das Plugin.

Umgebungsinjektor-Plugin

  1. Gehen Sie zu Ihrem ConfigureJobbildschirm
  2. Suchen Sie Add build stepim BuildAbschnitt und wählen SieInject environment variables
  3. Legen Sie die gewünschte Umgebungsvariable als VARIABLE_NAME = VALUE-Muster fest. In meinem Fall habe ich den Wert der Variablen USERPROFILE geändert

Geben Sie hier die Bildbeschreibung ein

Wenn Sie abhängig von bestimmten Bedingungen (z. B. Jobparametern) eine neue Umgebungsvariable definieren müssen, können Sie auf diese Antwort verweisen .

Ayaz Alifov
quelle
16

Sie können so etwas versuchen

stages {
        stage('Build') {
            environment { 
                    AOEU= sh (returnStdout: true, script: 'echo aoeu').trim()
                }
            steps {
                sh 'env'
                sh 'echo $AOEU'
            }
        }
    }
JSixface
quelle
Dies wird nicht analysiert.
rjurney
2
Dieses Format ist für das Jenkinsfile-Pipeline-Projekt vorgesehen. In welchem ​​Jobtyp verwenden Sie dieses Snippet?
JSixface
1
Dies funktioniert perfekt in einer JenkinsfilePipeline (kein Job)! Das ist großartig, danke dafür!
Mathielo
14

Das EnvInject Plugin aka ( Environment Injector Plugin ) bietet Ihnen verschiedene Optionen zum Festlegen von Umgebungsvariablen aus der Jenkins-Konfiguration.

Durch Auswahl erhalten Inject environment variables to the build processSie:

  • Properties File Path
  • Properties Content
  • Script File Path

  • Script Content

  • und schließlich Evaluated Groovy script.


Evaluated Groovy scriptgibt Ihnen die Möglichkeit, Umgebungsvariablen basierend auf dem Ergebnis des ausgeführten Befehls festzulegen :

  • mit executeMethode:
    return [HOSTNAME_SHELL: 'hostname'.execute().text, 
        DATE_SHELL: 'date'.execute().text,
        ECHO_SHELL: 'echo hello world!'.execute().text
    ]
  • oder mit explizitem GroovyCode:
    return [HOSTNAME_GROOVY: java.net.InetAddress.getLocalHost().getHostName(),
        DATE_GROOVY: new Date()
    ] 

(Weitere Details zu den einzelnen Methoden finden Sie in der integrierten Hilfe (?).)


Leider können Sie nicht das Gleiche tun, Script Contentwie es heißt:

Führen Sie eine Skriptdatei aus, um eine Umgebung festzulegen, z. B. das Erstellen von Ordnern, das Kopieren von Dateien usw. Geben Sie den Inhalt der Skriptdatei an. Sie können die obigen Eigenschaftsvariablen verwenden. Das Hinzufügen oder Überschreiben von Umgebungsvariablen im Skript hat jedoch keine Auswirkungen auf den Erstellungsjob .

luka5z
quelle
12

Es gibt das Build Env Propagator Plugin, mit dem Sie neue Build-Umgebungsvariablen hinzufügen können, z

Jenkins Build - Propagiert Build-Umgebungsvariablen

Jeder nachfolgende Schritt zum Erstellen von Umgebungsvariablen überschreibt zuvor definierte Umgebungsvariablenwerte.

Kenorb
quelle
Danke dir! Das Build Env Propagator Plugin hat funktioniert, als ich es ausprobiert habe, und es ist großartig, Umgebungsvariablen während der Build-Schritte festlegen zu können!
Twasbrillig
10

In meinem Fall hatte ich Umgebungsvariablen mit der folgenden Option konfiguriert und es funktionierte:

Manage Jenkins -> Configure System -> Global Properties -> Environment Variables -> Add
nik
quelle
Dies ist der beste Weg
Long Nguyen
7

Normalerweise können Sie Umgebungsvariablen in den globalen Eigenschaften in System konfigurieren konfigurieren .

Bei dynamischen Variablen mit Shell-Ersetzung möchten Sie möglicherweise eine Skriptdatei im Jenkins HOME-Verzeichnis erstellen und während des Builds ausführen. Der SSH-Zugriff ist erforderlich. Beispielsweise.

  1. Melden Sie sich als Jenkins an: sudo su - jenkinsodersudo su - jenkins -s /bin/bash
  2. Erstellen Sie ein Shell-Skript, z.

    echo 'export VM_NAME="$JOB_NAME"' > ~/load_env.sh
    echo "export AOEU=$(echo aoeu)" >> ~/load_env.sh
    chmod 750 ~/load_env.sh
    
  3. Rufen Sie in Jenkins Build ( Execute Shell ) das Skript und seine Variablen vor allem anderen auf, z

    source ~/load_env.sh
    
Kenorb
quelle
hat bei mir leider nicht funktioniert. nach sudo su - jenkins, noch echo $USERgibt mir root.
Prayagupd
@prayagupd Sie müssen eine vollständige Anmeldung simulieren. Verwenden Sie dazu den su -lParameter, andernfalls stellen Sie eine separate Frage.
Kenorb
@kenorb Wie lese ich nach dem Aufrufen des Skripts die env-Variable erneut? Dies funktioniert beispielsweise nicht. sh "" "source ~ / load_env.sh echo" VM_NAME: $ VM_NAME "echo" VM_NAME: $ {VM_NAME} "" "
aung
6

Dies ist das Snippet zum Speichern der Umgebungsvariablen und zum Zugriff darauf.

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

Hinweis: Der Wert der Umgebungsvariablen wird als Zeichenfolge geliefert. Wenn Sie es als Booleschen Wert verwenden möchten, müssen Sie es mit Boolean.parse (env.DISABLE_SQL) analysieren.

Barotdeep
quelle
4

Probieren Sie das Environment Script Plugin ( GitHub ) aus, das EnvInject sehr ähnlich ist . Sie können vor dem Build (nach dem SCM-Checkout) ein Skript ausführen, das Umgebungsvariablen dafür generiert. Z.B

Jenkins Build - Regulärer Job - Build-Umgebung

und in Ihrem Skript können Sie zB FOO=barauf die Standardausgabe drucken , um diese Variable festzulegen.

Beispiel zum Anhängen an eine vorhandene PATHVariable im Stil:

echo PATH+unique_identifier=/usr/local/bin

Sie können also alles tun, was Sie im Skript benötigen - entweder cateine Datei oder ein Skript in einer anderen Sprache aus dem Quellbaum Ihres Projekts usw. ausführen.

Kenorb
quelle
1

Sie können eine der folgenden Möglichkeiten verwenden:

  1. Verwenden Sie das Env Inject Plugin zum Erstellen von Umgebungsvariablen. Befolgen Sie diese für die Verwendung und weitere Details https://github.com/jenkinsci/envinject-plugin
    1. Navigieren Sie unten und können hinzufügen

Jenkins verwalten -> System konfigurieren -> Globale Eigenschaften -> Umgebungsvariablen -> Hinzufügen

Geben Sie hier die Bildbeschreibung ein

Sumit
quelle
0

Aus irgendeinem Grund sudo su - jenkinswird ich nicht beim jenkins Benutzer angemeldet, sondern habe einen anderen Ansatz gewählt.

Es ist mir gelungen, die globalen env-Variablen mithilfe von Jenkins config.xmlunter /var/lib/jenkins/config.xml(installiert unter Linux / RHEL) festzulegen - ohne externe Plugins zu verwenden.

Ich musste einfach aufhören, Jenkins hinzuzufügen, dann hinzuzufügen globalNodePropertiesund dann neu zu starten.

Beispiel, ich bin Definition von Variablen APPLICATION_ENVIRONMENTund SPRING_PROFILES_ACTIVEzu continious_integrationunten,

<?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>
betenagupd
quelle
-3

Wir verwenden eine groovige Jobdatei:

description('')
steps {
    environmentVariables {
        envs(PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true)
    }
}
techguy2000
quelle