J'aimerais pouvoir faire quelque chose comme:
AOEU=$(echo aoeu)
et avoir Jenkins mis AOEU=aoeu
.
La section Variables d'environnement de Jenkins ne le fait pas. Au lieu de cela, il définit AOEU='$(echo aoeu)'
.
Comment faire en sorte que Jenkins évalue une commande Shell et affecte le résultat à une variable d'environnement?
Finalement, je veux pouvoir affecter l'exécuteur d'un travail à une variable d'environnement pouvant être transmise ou utilisée par d'autres scripts.
Cela peut être fait via plugin EnvInject de la manière suivante:
Créez une étape de génération "Execute Shell" qui s'exécute:
echo AOEU=$(echo aoeu) > propsfile
Créez une étape de construction Inject variables d’environnement} et définissez "Propriétés du chemin du fichier" sur propsfile
.
Note: Ce plugin n'est (pour la plupart) pas compatible avec le plugin Pipeline.
Vous pouvez utiliser plugin EnvInject pour injecter des variables d’environnement au démarrage de la construction. Par exemple:
Dans mon cas, j’avais besoin d’ajouter la variable d’environnement JMETER_HOME
pour qu’elle soit disponible via mes scripts de génération Ant dans tous les projets du serveur Jenkins (Linux), de manière à ne pas interférer avec mon environnement de construction local (Windows et Mac) dans le répertoire. build.xml
script. Définir la variable d'environnement via Manage Jenkins - Configurer le système - Les propriétés globales était le moyen le plus simple et le moins intrusif d'y parvenir. Aucun plug-in n'est nécessaire.
La variable d'environnement est alors disponible dans Ant via:
<property environment="env" />
<property name="jmeter.home" value="${env.JMETER_HOME}" />
Ceci peut être vérifié pour fonctionner en ajoutant:
<echo message="JMeter Home: ${jmeter.home}"/>
Qui produit:
JMeter Home: ~/.jmeter
Plugin EnvInject aka (plug-in d'injecteur d'environnement) vous donne plusieurs options pour définir les variables d'environnement à partir de la configuration de Jenkins.
En sélectionnant Inject environment variables to the build process
vous obtiendrez:
Properties File Path
Properties Content
Script File Path
Script Content
et enfin Evaluated Groovy script
.
Evaluated Groovy script
vous donne la possibilité de définir une variable d'environnement en fonction du résultat de la commande exécutée:
execute
: return [HOSTNAME_Shell: 'hostname'.execute().text,
DATE_Shell: 'date'.execute().text,
ECHO_Shell: 'echo hello world!'.execute().text
]
Groovy
explicite: return [HOSTNAME_GROOVY: Java.net.InetAddress.getLocalHost().getHostName(),
DATE_GROOVY: new Date()
]
(Vous trouverez plus de détails sur chaque méthode dans l'aide intégrée (?))
Malheureusement, vous ne pouvez pas faire la même chose à partir de Script Content
car il est écrit:
Exécutez un fichier de script visant à définir un environnement tel que la création de dossiers, copie de fichiers, etc. Donnez le contenu du fichier de script. Vous peut utiliser les variables de propriétés ci-dessus. Cependant, ajouter ou remplacer Les variables d'environnement du script n'ont aucun impact sur le travail de construction.
Vous pouvez essayer quelque chose comme ça
stages {
stage('Build') {
environment {
AOEU= sh (returnStdout: true, script: 'echo aoeu').trim()
}
steps {
sh 'env'
sh 'echo $AOEU'
}
}
}
Il existe Build Env Propagator Plugin qui vous permet d’ajouter de nouvelles variables d’environnement de construction, par exemple.
Toute étape successive des variables d'environnement de construction Propagate remplacera les valeurs de variable d'environnement précédemment définies.
Vous pouvez utiliser Environment Injector Plugin pour définir les variables d’environnement dans Jenkins au niveau des tâches et des nœuds. Ci-dessous, je montrerai comment les définir au niveau de l'emploi.
Manage Jenkins > Manage Plugins
et installez le plug-in.Configure
Add build step
dans la section Build
et sélectionnez Inject environment variables
.Si vous devez définir une nouvelle variable d’environnement en fonction de certaines conditions (paramètres de travail, par exemple), vous pouvez vous référer à cette answer .
Normalement, vous pouvez configurer Variables d'environnement in Propriétés globales in Configure System .
Cependant, pour les variables dynamiques avec substitution Shell, vous pouvez créer un fichier de script dans Jenkins HOME dir et l'exécuter pendant la construction. L'accès SSH est requis. Par exemple.
Sudo su - jenkins
ou Sudo su - jenkins -s /bin/bash
Créez un script shell, par exemple:
echo 'export VM_NAME="$JOB_NAME"' > ~/load_env.sh
echo "export AOEU=$(echo aoeu)" >> ~/load_env.sh
chmod 750 ~/load_env.sh
Dans Jenkins Build ( Execute Shell ), appelez le script et ses variables avant toute autre opération, par exemple.
source ~/load_env.sh
Essayez Environment Script Plugin ( GitHub ) qui est très similaire à EnvInject . Il vous permet d'exécuter un script avant la construction (après extraction de SCM) qui génère des variables d'environnement pour celui-ci. Par exemple.
et dans votre script, vous pouvez imprimer, par exemple, FOO=bar
à la sortie standard pour définir cette variable.
Exemple pour ajouter une variable PATH
- existante:
echo PATH+unique_identifier=/usr/local/bin
Vous êtes donc libre de faire tout ce dont vous avez besoin dans le script - soit cat
un fichier, soit exécuter un script dans une autre langue à partir de l'arbre source de votre projet, etc.
Pour une raison quelconque, Sudo su - jenkins
ne me connecte pas à jenkins
user , j’ai utilisé une approche différente.
J'ai réussi à définir les variables env globales à l'aide de jenkins config.xml
à /var/lib/jenkins/config.xml
(installé dans Linux/RHEL) - sans l'aide de plugins externes.
Je devais simplement arrêter jenkins ajouter puis ajouter globalNodeProperties
, puis redémarrer.
Exemple, je définis les variables APPLICATION_ENVIRONMENT
et SPRING_PROFILES_ACTIVE
à continious_integration
ci-dessous,
<?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 dispose d'un support intégré pour cela, qui vous permet d'accéder à la valeur des variables locales en tant que variables d'environnement globales. Vous pouvez y parvenir en suivant 4 étapes simples.
Étape 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
Étape 2
Dans la liste déroulante "Ajouter l'étape de construction", sélectionnez "Variable d'environnement d'injection}".
Étape 3
Entrez le nom de fichier complet que vous avez créé précédemment (<some_name>.properties
) dans le champ Propriétés du chemin du fichier.
Étape 4
Désormais, elle est disponible en tant que variable d'environnement Jenkins et vous pouvez l'utiliser selon vos besoins dans Post-build-Action. $ nom_variable1 comme toute autre variable d'environnement.
Ici est un billet de Nice à ce sujet
Dans mon cas, j'avais configuré les variables d'environnement à l'aide de l'option suivante et cela a fonctionné.
Manage Jenkins -> Configure System -> Global Properties -> Environment Variables -> Add
Nous utilisons un fichier de travail groovy:
description('')
steps {
environmentVariables {
envs(PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true)
}
}
C'est l'extrait permettant de stocker la variable d'environnement et d'y accéder.
node {
withEnv(["ENABLE_TESTS=true", "DISABLE_SQL=false"]) {
stage('Select Jenkinsfile') {
echo "Enable test?: ${env.DEVOPS_SKIP_TESTS}
customStep script: this
}
}
}
Remarque: La valeur de la variable d'environnement est fournie sous forme de chaîne. Si vous souhaitez l'utiliser comme booléen, vous devez l'analyser à l'aide de Boolean.parse (env.DISABLE_SQL).