2014-10-22 10 views
5

Ho uno scenario di flusso di build simile allo documentation example: due processi, uno in esecuzione dopo l'altro.Jenkins + Build Flow, come passare una variabile da un lavoro a un altro

b = build("job1") 
build("job2", param1: b.????) 

mio job1 è uno script di shell che costruisce un pacchetto da un estratto repositoy git e stampa la versione del pacchetto costruito.

Ho bisogno di estrarre la versione da job1 (parse output ??) e renderla disponibile in qualche modo come parametro a job2. Come può essere realizzato? Si prega di notare che non posso conoscere la versione prima di eseguire job1.

risposta

9

Il problema con il semplice utilizzo di export in un passo di generazione di script della shell è che le variabili esportate scompaiono quando lo script della shell viene chiuso, non vengono propagate al lavoro.

Utilizzare EnvInject plugin per creare variabili di ambiente nella build. Se scrive un file di proprietà come parte della build, EnvInject può leggere il file e inject variables as a build step. Un file di proprietà ha un semplice formato KEY=VALUE:

MY_BUILD_VERSION=some_parsed_value 

Una volta che avete una variabile d'ambiente impostata nel tuo lavoro, nella build flusso plugin, è possibile estrarre il valore della variabile e utilizzarlo nei successivi lavori:

def version = build.environment.get("MY_BUILD_VERSION") 
out.println String.format("Parameters: version: %s", version) 
build("My Second Build", MY_BUILD_VERSION: version) 
+0

Funziona per te? Sto creando un file di proprietà 'vars.txt' (contenente 'MY_BUILD_VERSION = something') e usando" Inject variables "come prossimo passo di costruzione come parte di' job1'. Ma per qualche ragione, in buildflow la versione esce come 'null', dopo aver attivato' job1' (usando il tuo esempio come codice) – Unknown

+0

Nevermind, l'ho capito, stavo facendo 'b = build ('job-1')' e cercando 'build.environment.get()'; 'b.environment.get()' funziona correttamente . Grazie! – Unknown

0

Quando si esegue job1 esportare la versione con nome come proprietà di sistema.

export appVersion="stringOfVersion-123" 

Quindi dipende se si conosce la durata della versione (numero di numeri o altri caratteri). Se lo conosci puoi analizzare la variabile dalla fine alla seconda generazione come nuova variabile e usarla.

Come stringa di analisi è possibile trovare in this question with nice examples.

+0

Avete qualche esempio di questo in realtà funziona? Perché nei miei test sembra che non lo faccia; l'ambiente non è preservato da un lavoro all'altro. – Unknown

+0

In realtà no, usiamo Jenkins solo occasionalmente. Ma se si esegue uno script Bash come build1, è possibile esportare variabili come variabili di sistema e in seconda generazione è possibile utilizzare questa variabile. Oppure puoi incollare più informazioni su questo (schermate da Jenkins, codice, ...) alla domanda? –

+0

Vedere la mia configurazione qui. http://imgur.com/a/rT72w – Unknown

0

Se job2 deve sempre ottenere alcune informazioni da job1, è possibile utilizzare l'approccio senza parametri. job1 potrebbe pubblicare artefatti con la versione e job2 userà quell'artefatto (con Copy Artifact Plugin per esempio). Con questo approccio job2 potrebbe essere eseguito anche come lavoro autonomo.

0

Per chiunque altro a venire su questo, un'altra soluzione è quella di utilizzare uno script scriptler, dove si passa il percorso del file .properties, e lo script aggiungerà le proprietà per l'elenco delle variabili di lavoro:

Properties properties = new Properties() 

FilePath workspace = build.getWorkspace() 
FilePath sourceFile = workspace.child(path) 

properties.load(sourceFile.read()) 

properties.each { key, value -> 
    key = key.replace(".", "_").toUpperCase() 
    Job.setVariable(build, key, value) 

    println "Created Variable: " + key + "=" + value 
} 

Questo convertirà tutti i periodi in caratteri di sottolineatura e in maiuscolo tutte le lettere. L'utilizzo di uno script scriptler garantisce che si disponga di un metodo che funzioni indipendentemente dal "plugin soup" che si sta utilizzando.

Problemi correlati