2013-05-02 13 views
29

Ho un lavoro Maven in Jenkins. Prima della fase di costruzione effettiva ho un passo di pre-build "Execute shell". In quel guscio ho impostato una variabile:Jenkins: Come utilizzare una variabile da una shell pre-build nel Maven "Obiettivi e opzioni"

REVISION=$(cat .build_revision) 

Vorrei utilizzare tale variabile nel Maven costruire lavoro in "Obiettivi e opzioni":

clean install -Drevision=${REVISION} 

Ma che non funziona! "Drevision" è impostato su "$ {REVISIONE}" e non sul valore effettivo di $ {REVISION}. Uscita:

Executing Maven: -B -f /home/gerrit/.jenkins/jobs/<job_name>/workspace/pom.xml clean install -Drevision=${REVISION} 

Funziona con variabili d'ambiente Jenkins:

clean install -Dbuild=${BUILD_NUMBER} 

Esso definisce "Dbuild" per il numero di build attuale. Uscita:

Executing Maven: -B -f /home/gerrit/.jenkins/jobs/<job_name>/workspace/pom.xml clean install -Dbuild=54 

La mia domanda: Come utilizzare una variabile di shell in Maven "Obiettivi e opzioni" ??

EDIT:

Ho provato ad utilizzare Jenkins EnvInject Plugin a "Iniettare variabili d'ambiente", dopo il guscio pre-build, e la mia variabile è ora accessibile da esempio shell post-build, ma non è ancora disponibile in Maven "Obiettivi e opzioni".

Quindi è possibile impostare "Inject variables variables to the build process" utilizzando il plugin EnvInject, che rende effettivamente disponibili tali variabili in Maven "Obiettivi e opzioni", ma queste vengono impostate subito dopo il checkout SCM, cioè prima del pre -build passi e non supportano le valutazioni di espressione.

risposta

32

Sei sulla strada giusta, ma hai mancato una terza funzionalità del plug-in EnvInject: il passaggio di "Inject variables variables" che può iniettare le variabili nei seguenti passi di build basati sul risultato di uno script o delle proprietà.

Utilizziamo il plugin EnvInject proprio così; Uno script imposta una risorsa e comunica i suoi parametri usando proprietà che vengono propagate dal plugin come variabili di ambiente.

vale a dire la creazione di un database temporaneo per la costruzione: Create a database for the build

+0

Sei sicuro che il tuo metodo renda le variabili disponibili a Maven "Obiettivi e opzioni" ?? Perché ho provato "Inject environment variables" e rende le variabili accessibili ad es. shell post-build, ma non sono disponibili in Maven "Obiettivi e opzioni". –

+1

Sì, è esattamente come lo stiamo facendo - che db.url viene passato a mvn ... -Ddb.url = $ db.url – jjungnickel

+0

@JonasBang - Qual è stata la tua correzione per rendere le tue variabili disponibili per "obiettivi e opzioni " campo? Al momento sto riscontrando lo stesso problema con il fatto che sono disponibili per i passaggi post-generazione, ma non per il passaggio di esperti. –

0

Penso che la soluzione migliore sia provare il plug-in EnvInject per questo insieme al passo iniziale pre-scm.

  1. Si esegue il pre-scm come già si fa.
  2. Si utilizza l'iniettare ENV per caricare il file per la compilazione del lavoro principale passi

consideri il caricamento di contenuti (formato proprietà) del file o eseguire uno script che caricherà il file come si vuole e fare una variabile disponibile per il resto del lavoro con l'opzione "Prepara un ambiente per l'esecuzione".

Spero che questo aiuti.

+0

Non riesco a utilizzare "Prepara un ambiente per l'esecuzione" perché "Tutte queste azioni verranno eseguite prima di un controllo SCM". Il valore di cui ho bisogno per la mia variabile è preso dalla cassa SCM. "Inject environment variables" espande correttamente l'espressione e rende la variabile disponibile ad altre shell nel lavoro, ma non la rende disponibile per il passaggio di Build effettivo (ad esempio "Obiettivi e opzioni" di Maven). "Iniettare le variabili di ambiente per il processo di creazione" rende la variabile disponibile per il passaggio di build effettivo (ovvero Maven "Obiettivi e opzioni"), ma non espande l'espressione. –

+0

Inoltre, "Inject in environment variables to the build process" viene iniettato dopo il checkout di SCM, quindi sembra che questa sia l'opzione da utilizzare. L'unico problema è quindi come ottenerlo per espandere l'espressione: REVISION = $ (cat .build_revision) ?? Attualmente è impostata la variabile come stringa '$ (cat.build_revision) ', non il valore dal file' .build_revision '. –

+0

Non sono sicuro che sia possibile eseguire un comando nelle variabili come suggerito. Forse prova REVISION = 'cat .build_revision'. –

7

ho avuto un problema molto simile, cercando di calcolare una versione build e iniettare nella build.Dopo aver incontrato tutti gli stessi problemi (non espandendo, ecc.), Ho usato l'opzione "Genera variabili d'ambiente dallo script", che interpreta l'output come coppie tag = value in variabili Jenkins. Lo script:

#generate a version code that is high enough to surpass previously published clients 
    val=`expr 150000 + $BUILD_NUMBER` 
    echo VERSION_CODE=$val 

Dopo questo, sono stato in grado di iniettare $ VERSION_CODE in Maven come segue:

-Dbuild.vercode=${VERSION_CODE} 

Speranza che funziona per voi.

+2

Per chi è alla ricerca di questa opzione, può essere trovato nell'ambiente Environment Script Plugin: https://wiki.jenkins-ci.org/display/JENKINS/Environment+Script+Plugin – Pmarcoen

3

Questo problema è causato da un bug in Jenkins Maven Project Plugin come descritto in this bug report aperto in data 2012-06-22. Il plugin non è stato ancora risolto a partire dalla versione 2.1.

Una correzione è stata proposta per il plug-in di progetto Maven, ma non è stata ancora integrata. Ecco il link alla richiesta pull: https://github.com/jenkinsci/maven-plugin/pull/14

Se si genera il plugin autonomamente con la patch richiesta di pull applicata, le variabili vengono iniettate e rese disponibili nel campo "obiettivi e opzioni" come previsto.

0

Vedo che c'è una risposta accettata, ma per un principiante in Jenkins ho trovato difficile capire tutto. Ecco perché vorrei aggiungere un po 'più di dettagli in questa risposta e mostrare come l'ho fatto.

Come suggerito da @jjungnickel, è necessario disporre di EnvInject Plugin installato per Jenkins. Quindi nella sezione Build>Aggiungi passo di costruzione otterrai l'opzione "Inject environment variables".

In sostanza l'idea è:

  1. Aggiungi variabili che si desidera accedere in seguito a un file (potrebbe essere inserito da uno script di shell o potrebbe essere un file dal file system).
  2. Inietti il ​​file con le variabili.
  3. Utilizzare le variabili.

Qui una configurazione di esempio:

enter image description here

Dal momento che voglio usarli in porta Maven ho bisogno di controllare la casella di controllo Inject Variabili costruire.

Quindi alla fine della compilazione rimuovo il file solo perché voglio mantenere l'ambiente com'era prima della compilazione.

Problemi correlati