Comment définir les variables d'environnement dans Jenkins?

228

Je voudrais pouvoir faire quelque chose comme:

AOEU=$(echo aoeu)

et avoir Jenkins ensemble AOEU=aoeu.

La section Variables d'environnement dans Jenkins ne fait pas cela. Au lieu de cela, il se met AOEU='$(echo aoeu)'.

Comment puis-je demander à Jenkins d'évaluer une commande shell et d'affecter la sortie à une variable d'environnement?

Finalement, je veux pouvoir affecter l'exécuteur d'un travail à une variable d'environnement qui peut être transmise ou utilisée par d'autres scripts.

Noel Yap
la source
2
Le plugin EnvInject présente une sérieuse vulnérabilité de sécurité. Maintenant Jenkins a un support intégré pour ce stackoverflow.com/a/53430757/1753177
lambodar
@lambodar le lien va juste à la question
Z. Cochrane
@ Z.Cochrane, c'est un lien vers une réponse qui a été supprimée par l'auteur.
Noel Yap

Réponses:

217

Cela peut être fait via le plugin EnvInject de la manière suivante:

  1. Créez une étape de construction "Exécuter le shell" qui s'exécute:

    echo AOEU=$(echo aoeu) > propsfile
    
  2. Créez une étape de génération de variables d'environnement Inject et définissez "Chemin d'accès du fichier de propriétés" sur propsfile.

Remarque : Ce plugin n'est (principalement) pas compatible avec le plugin Pipeline.

malenkiy_scot
la source
4
EnvInject ne gère pas la situation que j'ai donnée ci-dessus: [EnvInject] - Injection en tant que variables d'environnement du contenu des propriétés AOEU = $ (echo aoeu) [EnvInject] - Variables injectées avec succès. [EnvInject] - Non défini variable AOEU non résolue.
Noel Yap
1
Cette solution utilise la syntaxe du shell Unix et ne fonctionnera pas sur Windows.
fbmd
2
@fbmd Je l'exécute sous Windows. Vous avez juste besoin de vous assurer que vous avez shsur le chemin.
Custodio
2
EnvInject ne fonctionne pas si le "shell d'exécution" se termine avec une erreur car la génération ne passe pas à la partie d'injection.
Chadi
1
@ Vitim.us, foosera exporté dans cette action shell spécifique mais pas dans d'autres actions.
Noel Yap
109

La manière la plus simple

Vous pouvez utiliser le plug-in EnvInject pour injecter des variables d'environnement au démarrage de la génération. Par exemple:

Ajouter clé = valeur (bash OK!) Sous «Environnement de génération» -> «Injecter des variables d'environnement au processus de génération» -> «Contenu des propriétés»

Comment vous savez que cela fonctionne

EnvInject - Variables injectées avec succès

kenny_k
la source
5
Essayez de définir la valeur en fonction de la sortie d'une commande shell.
Noel Yap
1
@NoelYap Fonctionne aussi, tant qu'à la fin la ligne est évaluée key=value. Dans mon cas d'utilisation, je génère la ligne complètement: 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 quelle version d'EnvInject utilisez-vous? Avec 1.91.3, une commande comme la vôtre est interprétée comme "cat = app ...". Ce serait génial si cette fonctionnalité était prise en charge, mais j'ai l'impression que cela a peut-être fonctionné pour vous par accident.
killthrush
1
tenter d'attribuer une valeur à la sortie d'une commande shell ne fonctionne pas pour moi non plus : BUILD_DATE=date "+%Y-%m-%d-%H_%M_%S"et BUILD_DATE=$(date "+%Y-%m-%d-%H_%M_%S")et BUILD_DATE=`date "+%Y-%m-%d-%H_%M_%S"`n'a pas fonctionné pour moi
scottysseus
1
@scottyseus J'ai fini par utiliser ce wiki.jenkins-ci.org/display/JENKINS/Environment+Script+Plugin fonctionnait comme un charme. stackoverflow.com/a/38286383/1240268
Andy Hayden
56

Dans mon cas, je devais ajouter la JMETER_HOMEvariable d'environnement pour être disponible via mes scripts de génération Ant dans tous les projets sur mon serveur Jenkins (Linux), d'une manière qui n'interfère pas avec mon environnement de construction local (Windows et Mac) dans le build.xmlscript . La définition de la variable d'environnement via Gérer Jenkins - Configurer le système - Propriétés globales était le moyen le plus simple et le moins intrusif d'y parvenir. Aucun plug-in n'est nécessaire.

Gérer les propriétés globales Jenkins


La variable d'environnement est alors disponible dans Ant via:

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

Cela peut être vérifié pour les œuvres en ajoutant:

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

Ce qui produit:

Accueil JMeter: ~ / .jmeter

vallismortis
la source
C'est une propriété mondiale. Cela affectera TOUS les travaux sur Jenkins. Supposons que je veuille juste cette propriété pour un travail?
IgorGanapolsky
J'ai ajouté à Manage Jenkins - Configure System - Global properties, les éléments suivants: git /path/to/my/gitet PATH+git /path/to/my/git. Cependant, si je suis en train d'accéder à gitpartir de l'un Jenkins pipeline script, je reçois: /bin/sh: git: command not found.
octavian
1
J'avais juste besoin de configurer la variable d'environnement JAVA_HOME et cette réponse a été celle qui m'a aidé.
Sandoval0992
19

Vous pouvez utiliser le plug- in d' injecteur d'environnement pour définir les variables d'environnement dans Jenkins au niveau du travail et du nœud. Ci-dessous, je vais montrer comment les définir au niveau de l'emploi.

  1. Depuis l'interface Web Jenkins, accédez à Manage Jenkins > Manage Pluginset installez le plugin.

Plugin d'injecteur d'environnement

  1. Accédez à l' Configureécran de votre travail
  2. Rechercher Add build stepdans la Buildsection et sélectionnerInject environment variables
  3. Définissez la variable d'environnement souhaitée comme modèle VARIABLE_NAME = VALUE. Dans mon cas, j'ai changé la valeur de la variable USERPROFILE

entrez la description de l'image ici

Si vous devez définir une nouvelle variable d'environnement en fonction de certaines conditions (par exemple, les paramètres de travail), vous pouvez vous référer à cette réponse .

Ayaz Alifov
la source
16

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'
            }
        }
    }
JSixface
la source
Cela n'analyse pas.
rjurney
2
Ce format est destiné au projet de pipeline Jenkinsfile. Dans quel type d'emploi utilisez-vous cet extrait de code?
JSixface
1
Cela fonctionne parfaitement dans un Jenkinsfilepipeline (pas de travail)! C'est génial, merci!
mathielo
14

EnvInject Plugin aka ( Environment Injector Plugin ) vous offre plusieurs options pour définir les variables d'environnement à partir de la configuration Jenkins.

En sélectionnant, Inject environment variables to the build processvous obtiendrez:

  • Properties File Path
  • Properties Content
  • Script File Path

  • Script Content

  • et enfin Evaluated Groovy script.


Evaluated Groovy scriptvous donne la possibilité de définir la variable d'environnement en fonction du résultat de la commande exécutée :

  • avec executeméthode:
    return [HOSTNAME_SHELL: 'hostname'.execute().text, 
        DATE_SHELL: 'date'.execute().text,
        ECHO_SHELL: 'echo hello world!'.execute().text
    ]
  • ou avec un Groovycode explicite :
    return [HOSTNAME_GROOVY: java.net.InetAddress.getLocalHost().getHostName(),
        DATE_GROOVY: new Date()
    ] 

(Plus de détails sur chaque méthode peuvent être trouvés dans l'aide intégrée (?))


Malheureusement, vous ne pouvez pas faire la même chose Script Contentcomme indiqué:

Exécutez un fichier de script visant à définir un environnement tel que la création de dossiers, la copie de fichiers, etc. Donnez le contenu du fichier de script. Vous pouvez utiliser les variables de propriétés ci-dessus. Cependant, l'ajout ou la substitution de variables d'environnement dans le script n'a aucun impact sur le travail de génération .

luka5z
la source
12

Le plugin Build Env Propagator vous permet d'ajouter de nouvelles variables d'environnement de construction, par exemple

Jenkins Build - Propager les variables d'environnement de build

Toute étape successive des variables d'environnement de génération Propagate remplacera les valeurs de variable d'environnement précédemment définies.

Kenorb
la source
Je vous remercie! Le plugin Build Env Propagator a fonctionné lorsque je l'ai essayé, et c'est génial d'avoir la possibilité de définir des variables d'environnement pendant les étapes de construction!
twasbrillig
10

Dans mon cas, j'avais configuré des variables d'environnement en utilisant l'option suivante et cela a fonctionné-

Manage Jenkins -> Configure System -> Global Properties -> Environment Variables -> Add
nik
la source
C'est le meilleur moyen
Long Nguyen
7

Normalement, vous pouvez configurer les variables d'environnement dans les propriétés globales dans Configurer le système .

Cependant, pour les variables dynamiques avec substitution de shell, vous souhaiterez peut-être créer un fichier de script dans le répertoire Jenkins HOME et l'exécuter pendant la génération. L'accès SSH est requis. Par exemple.

  1. Connectez-vous en tant que Jenkins: sudo su - jenkinsousudo su - jenkins -s /bin/bash
  2. 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
    
  3. Dans Jenkins Build ( Execute shell ), appelez le script et ses variables avant toute autre chose, par exemple

    source ~/load_env.sh
    
Kenorb
la source
n'a malheureusement pas fonctionné pour moi. après sudo su - jenkins, echo $USERme donne toujours root.
priagupd
@prayagupd Vous devez simuler une connexion complète, utilisez donc le su -lparamètre pour cela, sinon posez une question distincte.
kenorb
@kenorb après avoir appelé le script, comment lire à nouveau la variable env? par exemple, cela ne fonctionne pas sh "" "source ~ / load_env.sh echo" VM_NAME: $ VM_NAME "echo" VM_NAME: $ {VM_NAME} "" ""
aung
7

Il s'agit de l'extrait pour stocker la variable d'environnement et 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 arrive sous forme de chaîne. Si vous souhaitez l'utiliser comme un booléen, vous devez l'analyser en utilisant Boolean.parse (env.DISABLE_SQL).

barotdeep
la source
4

Essayez le plugin de script d'environnement ( GitHub ) qui est très similaire à EnvInject . Il vous permet d'exécuter un script avant la génération (après l'extraction SCM) qui génère des variables d'environnement pour celui-ci. Par exemple

Jenkins Build - Emploi régulier - Environnement de construction

et dans votre script, vous pouvez imprimer par exemple FOO=barsur la sortie standard pour définir cette variable.

Exemple à ajouter à une PATHvariable de style existante :

echo PATH+unique_identifier=/usr/local/bin

Vous êtes donc libre de faire tout ce dont vous avez besoin dans le script - soit catun fichier, soit d'exécuter un script dans une autre langue à partir de l'arborescence source de votre projet, etc.

Kenorb
la source
1

Vous pouvez utiliser l'une des méthodes suivantes répertoriées ci-dessous:

  1. Utilisez le plugin Env Inject pour créer des variables d'environnement. Suivez ceci pour l'utilisation et plus de détails https://github.com/jenkinsci/envinject-plugin
    1. Naviguez ci-dessous et pouvez ajouter

Gérer Jenkins -> Configurer le système -> Propriétés globales -> Variables d'environnement -> Ajouter

entrez la description de l'image ici

Sumit
la source
0

Pour une raison quelconque, sudo su - jenkinsne me connecte pas à l' jenkins utilisateur , j'ai fini par utiliser une approche différente.

J'ai réussi à définir les variables env globales en utilisant jenkins config.xmlat /var/lib/jenkins/config.xml(installé dans Linux / RHEL) - sans utiliser de plugins externes.

J'ai simplement dû arrêter jenkins add puis add globalNodeProperties, puis redémarrer.

Exemple, je suis la définition des variables APPLICATION_ENVIRONMENTet SPRING_PROFILES_ACTIVEà continious_integrationci - 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>
Prayagupd
la source
-3

Nous utilisons un fichier de travail groovy:

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