Come impostare le variabili di ambiente in Jenkins?


228

Vorrei poter fare qualcosa del tipo:

AOEU=$(echo aoeu)

e ho Jenkins impostato AOEU=aoeu.

La sezione Variabili d'ambiente in Jenkins non lo fa. Invece, imposta AOEU='$(echo aoeu)'.

Come posso convincere Jenkins a valutare un comando shell e assegnare l'output a una variabile d'ambiente?

Alla fine, voglio essere in grado di assegnare l'esecutore di un lavoro a una variabile di ambiente che può essere passata o utilizzata da altri script.


2
Il plug-in EnvInject presenta una grave vulnerabilità di sicurezza. Ora Jenkins sta avendo il supporto integrato per questo stackoverflow.com/a/53430757/1753177
lambodar

@lambodar il link va proprio alla domanda
Z. Cochrane,

@ Z.Cochrane, è un collegamento a una risposta che è stata eliminata dall'autore.
Noel Yap,

Risposte:


217

Questo può essere fatto tramite il plugin EnvInject nel modo seguente:

  1. Creare un passaggio di build "Esegui shell" che esegue:

    echo AOEU=$(echo aoeu) > propsfile
    
  2. Creare un passaggio di creazione delle variabili di ambiente Inject e impostare "Percorso file proprietà" su propsfile.

Nota : questo plugin non è (principalmente) compatibile con il plugin Pipeline.


4
EnvInject non gestisce la situazione che ho indicato sopra: [EnvInject] - Iniettando come variabili di ambiente il contenuto delle proprietà AOEU = $ (echo aoeu) [EnvInject] - Le variabili sono state iniettate correttamente. [EnvInject] - Variabile 'AOEU' non risolta.
Noel Yap,

1
Tale soluzione utilizza la sintassi della shell Unix e non funziona su Windows.
fbmd,

2
@fbmd Lo sto eseguendo su Windows. Devi solo assicurarti di avere shsul percorso.
Custodio,

2
EnvInject non funziona se "esegui shell" esce con un errore perché la generazione non procede alla parte di iniezione.
Chadi,

1
@ Vitim.us, fooverrà esportato in quella specifica azione shell ma non in altre azioni.
Noel Yap,

109

Il modo più semplice

È possibile utilizzare il plug-in EnvInject per iniettare le variabili di ambiente all'avvio della compilazione. Per esempio:

Aggiungi chiave = valore (bash OK!) In "Ambiente di compilazione" -> "Inietta variabili di ambiente nel processo di compilazione" -> "Contenuto proprietà"

Come sai che funziona

EnvInject - Variabili iniettate correttamente


5
Prova a impostare il valore in base all'output di un comando shell.
Noel Yap,

1
@NoelYap Funziona anche, purché alla fine la riga valuti key=value. Nel mio caso d'uso ho generato completamente la riga: 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 quale versione di EnvInject stai usando? Con 1.91.3, un comando come il tuo viene interpretato come "cat = app ...". Sarebbe fantastico se questa funzione fosse supportata, ma ho l'impressione che possa aver funzionato per caso per caso.
killthrush,

1
tentando di assegnare un valore all'uscita di un comando di shell non funziona per me uno: BUILD_DATE=date "+%Y-%m-%d-%H_%M_%S"e BUILD_DATE=$(date "+%Y-%m-%d-%H_%M_%S")e BUILD_DATE=`date "+%Y-%m-%d-%H_%M_%S"`non ha funzionato per me
scottysseus


56

Nel mio caso, dovevo aggiungere la JMETER_HOMEvariabile d'ambiente affinché fosse disponibile tramite i miei script di build Ant in tutti i progetti sul mio server Jenkins (Linux), in modo tale da non interferire con il mio ambiente di build locale (Windows e Mac) nello build.xmlscript . L'impostazione della variabile d'ambiente tramite Gestisci Jenkins - Configura sistema - Le proprietà globali era il modo più semplice e meno invadente per raggiungere questo obiettivo. Non sono necessari plug-in.

Gestisci le proprietà globali di Jenkins


La variabile d'ambiente è quindi disponibile in Ant tramite:

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

Questo può essere verificato per funzionare aggiungendo:

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

Che produce:

JMeter Home: ~ / .jmeter


Questa è una proprietà globale. Avrà effetto su TUTTI i lavori su Jenkins. Supponiamo che voglia solo questa proprietà per un lavoro?
IgorGanapolsky,

Ho aggiunto a Gestisci Jenkins - Configura sistema - Proprietà globali, il seguente: git /path/to/my/gite PATH+git /path/to/my/git. Tuttavia, se sto cercando di accedere gitda una Jenkins pipeline script, ottengo: /bin/sh: git: command not found.
Ottaviano,

1
Avevo solo bisogno di impostare la variabile d'ambiente JAVA_HOME e questa risposta è stata quella che mi ha aiutato.
Sandoval0992,

19

È possibile utilizzare Environment Injector Plugin per impostare le variabili di ambiente in Jenkins a livello di lavoro e di nodo. Di seguito mostrerò come impostarli a livello di lavoro.

  1. Dall'interfaccia web Jenkins, andare Manage Jenkins > Manage Pluginse installare il plugin.

Plugin Iniettore Ambiente

  1. Vai alla Configureschermata del tuo lavoro
  2. Trova Add build stepnella Buildsezione e selezionaInject environment variables
  3. Impostare la variabile d'ambiente desiderata su VARIABLE_NAME = VALUE pattern. Nel mio caso, ho modificato il valore della variabile USERPROFILE

inserisci qui la descrizione dell'immagine

Se è necessario definire una nuova variabile di ambiente in base ad alcune condizioni (ad es. Parametri di lavoro), è possibile fare riferimento a questa risposta .


16

Puoi provare qualcosa del genere

stages {
        stage('Build') {
            environment { 
                    AOEU= sh (returnStdout: true, script: 'echo aoeu').trim()
                }
            steps {
                sh 'env'
                sh 'echo $AOEU'
            }
        }
    }

Questo non analizza.
rjurney,

2
Questo formato è per il progetto della pipeline Jenkinsfile. In quale tipo di lavoro stai utilizzando questo snippet?
JSixface,

1
Funziona perfettamente in a Jenkinsfilefor a pipeline (non lavoro)! È fantastico, grazie per questo!
mathielo,

14

EnvInject Plugin aka ( Environment Injector Plugin ) offre diverse opzioni per impostare le variabili di ambiente dalla configurazione di Jenkins.

Selezionando Inject environment variables to the build processotterrai:

  • Properties File Path
  • Properties Content
  • Script File Path

  • Script Content

  • e infine Evaluated Groovy script.


Evaluated Groovy scriptti dà la possibilità di impostare la variabile d'ambiente in base al risultato del comando eseguito :

  • con executemetodo:
    return [HOSTNAME_SHELL: 'hostname'.execute().text, 
        DATE_SHELL: 'date'.execute().text,
        ECHO_SHELL: 'echo hello world!'.execute().text
    ]
  • o con Groovycodice esplicito :
    return [HOSTNAME_GROOVY: java.net.InetAddress.getLocalHost().getHostName(),
        DATE_GROOVY: new Date()
    ] 

(Ulteriori dettagli su ciascun metodo sono disponibili nella guida integrata (?))


Sfortunatamente non puoi fare lo stesso da Script Contentcome afferma:

Esegui un file di script per impostare un ambiente come la creazione di cartelle, la copia di file e così via. Fornisci il contenuto del file di script. È possibile utilizzare le variabili delle proprietà sopra. Tuttavia, l'aggiunta o l'override delle variabili di ambiente nello script non ha alcun impatto sul lavoro di compilazione .


12

Esiste il plug-in Propagator di Build Env che consente di aggiungere nuove variabili di ambiente di build, ad es

Jenkins Build - Propaga le variabili di ambiente di build

Qualsiasi passaggio successivo delle variabili di ambiente di build Propagate sovrascriverà i valori delle variabili di ambiente precedentemente definiti.


Grazie! Build Env Propagator Plugin ha funzionato quando l'ho provato ed è fantastico avere la possibilità di impostare le variabili di ambiente durante le fasi di Build!
twasbrillig,

10

Nel mio caso, avevo configurato le variabili d'ambiente usando la seguente opzione e ha funzionato-

Manage Jenkins -> Configure System -> Global Properties -> Environment Variables -> Add

Questo è il modo migliore
Long Nguyen,

7

Normalmente è possibile configurare le variabili di ambiente nelle proprietà globali in Configura sistema .

Tuttavia, per le variabili dinamiche con sostituzione della shell, potresti voler creare un file di script nella directory HOME di Jenkins ed eseguirlo durante la compilazione. È richiesto l'accesso SSH. Per esempio.

  1. Accedi come Jenkins: sudo su - jenkinsosudo su - jenkins -s /bin/bash
  2. Creare uno script di shell, ad esempio:

    echo 'export VM_NAME="$JOB_NAME"' > ~/load_env.sh
    echo "export AOEU=$(echo aoeu)" >> ~/load_env.sh
    chmod 750 ~/load_env.sh
    
  3. In Jenkins Build ( Execute shell ), invoca lo script e le sue variabili prima di ogni altra cosa, ad es

    source ~/load_env.sh
    

purtroppo non ha funzionato per me. dopo sudo su - jenkins, echo $USERmi dà ancora root.
prayagupd,

@prayagupd Devi simulare un accesso completo, quindi usa il su -lparametro per farlo, altrimenti fai una domanda separata.
Kenorb,

@kenorb dopo aver richiamato lo script, come posso leggere di nuovo la variabile env? ad esempio, questo non funziona sh "" "source ~ / load_env.sh echo" VM_NAME: $ VM_NAME "echo" VM_NAME: $ {VM_NAME} "" ""
fino al

7

Questo è lo snippet per archiviare la variabile di ambiente e accedervi.

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

Nota: il valore della variabile di ambiente arriva come stringa. Se si desidera utilizzarlo come booleano, è necessario analizzarlo utilizzando Boolean.parse (env.DISABLE_SQL).


4

Prova Environment Script Plugin ( GitHub ) che è molto simile a EnvInject . Ti consente di eseguire uno script prima della compilazione (dopo il checkout SCM) che genera variabili di ambiente per esso. Per esempio

Jenkins Build - Lavoro regolare - Build Environment

e nel tuo script, puoi stampare ad esempio FOO=barsullo standard output per impostare quella variabile.

Esempio da aggiungere a una PATHvariabile di stile esistente :

echo PATH+unique_identifier=/usr/local/bin

Quindi sei libero di fare tutto ciò di cui hai bisogno nello script - catun file o eseguire uno script in un'altra lingua dall'albero dei sorgenti del tuo progetto, ecc.



0

Per qualche motivo sudo su - jenkinsnon mi registra l' jenkins utente , ho finito con un approccio diverso.

Sono riuscito a impostare le variabili env globali usando jenkins config.xmlat /var/lib/jenkins/config.xml(installato in Linux / RHEL) - senza usare plugin esterni.

Ho semplicemente dovuto interrompere jenkins aggiungere quindi aggiungere globalNodePropertiese quindi riavviare.

Esempio, sto definendo le variabili APPLICATION_ENVIRONMENTe SPRING_PROFILES_ACTIVEin continious_integrationbasso,

<?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>

-3

Usiamo file di lavoro groovy:

description('')
steps {
    environmentVariables {
        envs(PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true)
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.