2016-05-06 10 views
5

Ho creato una nuova pipeline Jenkins. La pipeline è (attualmente) parametrizzata con una singola opzione booleana denominata VAR_A. Il mio script pipeline è:Passaggio Jenkins crea i parametri nei nodi della pipeline

node ('windows') { 
    echo "$VAR_A" 
    bat 'env' 
} 

Quando costruisco manualmente il progetto con VAR_A controllato, "vero" fa eco, come previsto. L'elenco delle variabili di ambiente, tuttavia, non mostra VAR_A=true.

io sono in grado di ottenere env per mostrare VAR_A se mi avvolgo la chiamata in un blocco withEnv:

node ('windows') { 
    echo "$VAR_A" 
    withEnv(["VAR_A=$VAR_A"]) { 
     bat 'env' 
    } 
} 

sarò più parametri rispetto a questo, in modo specificando ogni parametro singolarmente non è desiderato. C'è un modo per trasferire tutti i parametri di costruzione nell'ambiente di un nodo?

risposta

8

Il punto è che negli script Pipeline i parametri del lavoro non vengono immessi automaticamente nell'ambiente come per i lavori regolari. Ogni parametro diventa una variabile dello script Pipeline binding. Pertanto è possibile accedervi direttamente per nome.

Nell'esempio echo "$VAR_A" la sostituzione variabile viene eseguita da groovy nel contesto del proprio script (vedere Groovy doc on strings interpolation). Ecco perché non lo vedi nell'output bat.

Per ogni parametro che si desidera iniettare è necessario aggiungere una riga come questa: env.VAR_A = VAR_A all'inizio del copione. Può essere al di fuori del blocco node perché env è globale all'interno dell'intero script.

In alternativa, è possibile aggiungere tutti gli script vars, inclusi i parametri e persino i vart integrati Pipeline, ovvero steps nell'ambiente. Purtroppo richiederà qualche whitelist per l'esecuzione in una sandbox:

@NonCPS 
def populateEnv(){ binding.variables.each{k,v -> env."$k" = "$v"} } 
populateEnv() 

Esempio: VAR_A è un parametro. corpo Script:

def AAAA = 1 // such a definition doesn't put variable in the binding 
BBBB = 2  // creates a binding variable. Absolutely the same behavior as for a job parameter. 

@NonCPS 
def populateEnv(){ binding.variables.each{k,v -> env."$k" = "$v"} } 
populateEnv() // at this point injection happens 

CCCC = 3  // created after the injection hence it won't appear in env. 
node ('windows') { 
    bat 'env' 
} 

Nella bat uscita troverete VAR_A e BBBB.

IMO a meno che il proprio lavoro non abbia definito decine di parametri l'approccio env.VAR_A = VAR_A è più semplice, diretto e non richiede approvazioni.