Ich würde gerne etwas tun können wie:
AOEU=$(echo aoeu)
und Jenkins AOEU=aoeu
gesetzt haben.
Die Umgebungsvariablen in Jenkins tun das nicht. Stattdessen wird AOEU='$(echo aoeu)'
festgelegt.
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.
Dies kann über EnvInject Plugin auf folgende Weise erfolgen:
Erstellen Sie einen Buildschritt "Execute Shell", der ausgeführt wird:
echo AOEU=$(echo aoeu) > propsfile
Erstellen Sie einen Inject-Umgebungsvariablen-Erstellungsschritt, und legen Sie "Properties File Path" auf propsfile
fest.
Note: Dieses Plugin ist (meistens) nicht mit dem Pipeline-Plugin kompatibel.
Sie können EnvInject plugin verwenden, um Umgebungsvariablen beim Build-Start einzuspritzen. Zum Beispiel:
In meinem Fall musste ich die Umgebungsvariable JMETER_HOME
hinzufügen, um über meine Ant-Build-Skripts in allen Projekten auf meinem Jenkins-Server (Linux) verfügbar zu sein, und zwar auf eine Weise, die meine lokale Build-Umgebung (Windows und Mac) im System nicht beeinträchtigt build.xml
-Skript. Das Einstellen der Umgebungsvariable über Manage Jenkins - Configure System - Globale Eigenschaften war der einfachste und am wenigsten aufdringliche Weg, dies zu erreichen. Es sind keine Plug-Ins erforderlich.
Die Umgebungsvariable ist dann in Ant verfügbar über:
<property environment="env" />
<property name="jmeter.home" value="${env.JMETER_HOME}" />
Dies kann durch Hinzufügen von Werken überprüft werden:
<echo message="JMeter Home: ${jmeter.home}"/>
Was produziert:
JMeter Home: ~/.jmeter
EnvInject Plugin aka (Environment Injector Plugin) bietet verschiedene Optionen zum Festlegen von Umgebungsvariablen aus der Jenkins-Konfiguration.
Durch Auswahl von Inject environment variables to the build process
erhalten Sie:
Properties File Path
Properties Content
Script File Path
Script Content
und schließlich Evaluated Groovy script
.
Evaluated Groovy script
gibt Ihnen die Möglichkeit, Umgebungsvariable basierend auf dem Ergebnis des ausgeführten Befehls zu setzen:
execute
Methode: return [HOSTNAME_Shell: 'hostname'.execute().text,
DATE_Shell: 'date'.execute().text,
ECHO_Shell: 'echo hello world!'.execute().text
]
Groovy
code: 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 mit Script Content
nicht dasselbe machen, da es heißt:
Führen Sie eine Skriptdatei aus, um eine Umgebung wie das Erstellen von .__ festzulegen. Ordner, Kopieren von Dateien usw. Geben Sie den Inhalt der Skriptdatei an. Sie kann die obigen Eigenschaftsvariablen verwenden. Hinzufügen oder Überschreiben von Umgebungsvariablen im Skript haben keine Auswirkungen auf die Job bauen.
Sie können so etwas versuchen
stages {
stage('Build') {
environment {
AOEU= sh (returnStdout: true, script: 'echo aoeu').trim()
}
steps {
sh 'env'
sh 'echo $AOEU'
}
}
}
Es gibt Build Env Propagator Plugin , mit dem Sie neue Build-Umgebungsvariablen hinzufügen können, z.
Jeder nachfolgende Schritt "Build-Umgebungsvariablen weitergeben" überschreibt zuvor definierte Umgebungsvariablenwerte.
Mit Environment Injector Plugin können Sie Umgebungsvariablen in Jenkins auf Job- und Knotenebene festlegen. Nachfolgend werde ich zeigen, wie man sie auf Jobebene einstellt.
Manage Jenkins > Manage Plugins
und installieren Sie das Plugin.Configure
Add build step
im Abschnitt Build
und wählen Sie Inject environment variables
aus.Wenn Sie abhängig von bestimmten Bedingungen (z. B. Jobparameter) eine neue Umgebungsvariable definieren müssen, können Sie auf diese Antwort verweisen.
Normalerweise können Sie Umgebungsvariablen in Globale Eigenschaften in System konfigurieren konfigurieren.
Bei dynamischen Variablen mit Shell-Ersetzung möchten Sie jedoch möglicherweise eine Skriptdatei in Jenkins HOME-Verzeichnis erstellen und während des Builds ausführen. Der SSH-Zugriff ist erforderlich. Zum Beispiel.
Sudo su - jenkins
oder Sudo su - jenkins -s /bin/bash
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
Rufen Sie in Jenkins Build ( Execute Shell ) das Skript und seine Variablen vor allem anderen auf, z.
source ~/load_env.sh
Probieren Sie das Environment Script Plugin ( GitHub ) aus, das EnvInject sehr ähnlich ist. Damit können Sie vor dem Build (nach dem SCM-Checkout) ein Skript ausführen, das Umgebungsvariablen für es generiert. Z.B.
und in Ihrem Skript können Sie z. FOO=bar
an die Standardausgabe, um diese Variable festzulegen.
Beispiel zum Anhängen an eine vorhandene Variable des Typs PATH
-style:
echo PATH+unique_identifier=/usr/local/bin
Sie können also alles tun, was Sie im Skript benötigen - entweder cat
eine Datei oder ein Skript in einer anderen Sprache aus dem Quellbaum Ihres Projekts ausführen usw.
Aus irgendeinem Grund meldet sich Sudo su - jenkins
nicht bei jenkins
user . Ich habe am Ende einen anderen Ansatz gewählt.
Ich konnte die globalen env-Variablen mithilfe von jenkins config.xml
um /var/lib/jenkins/config.xml
(installiert unter Linux/RHEL) einstellen - ohne externe Plugins.
Ich musste einfach Jenkins hinzufügen stoppen, dann globalNodeProperties
hinzufügen und dann neu starten.
Beispiel: Ich definiere die Variablen APPLICATION_ENVIRONMENT
und SPRING_PROFILES_ACTIVE
bis continious_integration
unten.
<?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>
Jenkin hat hierfür eine integrierte Unterstützung, mit der Sie als globale Umgebungsvariablen auf den Wert lokaler Variablen zugreifen können. Sie können dies in den folgenden 4 einfachen Schritten erreichen.
Schritt 1
............................
rm -f <some_name>.properties
touch <Some_name>.properties
............................
#pass the variable name you want to access as an env variable
echo variable_name1=$some_value1 >> <some_name>.properties
echo variable_name2=$some_value2 >> <some_name>.properties
............................
echo variable_name3=$some_value3 >> <some_name>.properties
Schritt 2
Wählen Sie unter "Add Build Step" im Dropdown-Menü "Inject-Umgebungsvariable" aus.
Schritt 3
Geben Sie den vollständig qualifizierten Dateinamen, den Sie zuvor erstellt haben (<some_name>.properties
), in das Feld Properties File Path ein.
Schritt 4
Jetzt ist es als Jenkins-Umgebungsvariable verfügbar und kann nach Bedarf in Post-Build-Action verwendet werden. $ Variablenname1 wie jede andere Umgebungsvariable.
Hier ist ein schöner Beitrag dazu
In meinem Fall hatte ich Umgebungsvariablen mit der folgenden Option konfiguriert, und es funktionierte:
Manage Jenkins -> Configure System -> Global Properties -> Environment Variables -> Add
Wir verwenden eine groovy Jobdatei:
description('')
steps {
environmentVariables {
envs(PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true)
}
}
Dies ist das Snippet, um Umgebungsvariablen zu speichern und darauf zuzugreifen.
node {
withEnv(["ENABLE_TESTS=true", "DISABLE_SQL=false"]) {
stage('Select Jenkinsfile') {
echo "Enable test?: ${env.DEVOPS_SKIP_TESTS}
customStep script: this
}
}
}
Anmerkung: Der Wert der Umgebungsvariablen wird als Zeichenfolge ausgegeben. Wenn Sie es als Boolean verwenden möchten, müssen Sie es mit Boolean.parse (env.DISABLE_SQL) analysieren.