2014-12-16 16 views
13

Lo script non sta iterando attraverso tutti i valori dell'array 'modules'.Groovy .each esegue solo iterazioni una sola volta

class Module { 
    public String name = ''; 
    public Boolean isCustom = false; 
    public Module(String name, Boolean custom){ 
     this.name = name; 
     this.isCustom = custom; 
    } 
} 

//creates array from the ext_module env var 
modules = []; 
EXT_MODULE.split(',').each { 
    modules.add(new Module(it, false)); 
} 


println modules; 
modules.each { 
    println "MODULE NAME ::::: ${it.name}" 
    if(it.isCustom) 
    { 
     println "install custom"; 
    } else { 
     println "install non custom"; 
    } 
}; 

Questo è il risultato della corsa. L'array mostra 4 elementi, ma il codice all'interno di .each black viene eseguito solo una volta.

Esecuzione: Stampa Messaggio [Modulo @ 71f09325, modulo @ e1ddb41, modulo @ 7069a674, modulo @ 1f68f952]
Esecuzione: Stampa Messaggio Nome modulo ::::: puppetlabs-NTP
Esecuzione: Stampa Messaggio installazione non personalizzato
Esecuzione: Fine del flusso di lavoro
finito: SUCCESSO

+0

Questo sembra essere un problema specifico Jenkins DSL. Per qualsiasi motivo funzioni, se si modifica modules.each => for (module in modules), qualcuno può dirmi perché? –

+6

proprio così: 'def modules = EXT_MODULE.split (','). Collect {new Module (it, false)}'. ogni volta che usi 'each' per creare collezioni, un gattino muore. il fatto che non ci sia 'def' è ok con jenkins (-scriptler); non stai scherzando con qualche stato globale qui? – cfrick

+0

La mia ipotesi è che ci sia un qualche tipo di chiusura globale che è influenzata da .each e sta rovinando il processo di costruzione di Jenkins –

risposta

4

Per risolvere il problema, è sufficiente utilizzare una vecchia scuola per il ciclo (code below). Inoltre, NonCPS è un'altra soluzione alternativa. C'è un problema aperto per questa materia. Vedi qui: https://issues.jenkins-ci.org/browse/JENKINS-26481

Update, 24 Ottobre 2016

/** * Discariche ambiente varibles al registro, utilizzando una vecchia scuola ciclo for. */

import com.cloudbees.groovy.cps.NonCPS 

def version = '1.0' 

@NonCPS 
def dumpEnvVars() { 
    def str = "Dumping build environment variables...\n" 
    for (Map.Entry<String, String> entry : currentBuild.build().environment) { 
    str += " ${entry.key} = ${entry.value}\n" 
    } 
    echo str 
} 

return this; 
+1

Potresti migliorare la tua risposta fornendo un esempio di "old school for loop". –

0

Da ieri, il nuovo plugin Pipeline è stato consegnato nella versione 2.0 e correggere questo problema.

.each le chiusure funzionano ora, ma solo .collect eseguono solo una volta l'iterazione.

+1

Uso Jenkins 2.x e tutti i miei plug-in della pipeline sono 2.x, ad eccezione del plug-in Milestone. Tuttavia, each() esegue una sola volta. –

+1

Sono andati avanti e indietro con questa implementazione. Ma penso che al momento non funzioni, e alla fine ho rinunciato. –

+1

Allo stesso modo ho tutto a 2.0 o meglio e.ogni itera una sola volta (così come ogni altra cosa che ho provato) –

0

L'annotazione NonCPS funziona per me nel passaggio della libreria. In questo modo:

import com.cloudbees.groovy.cps.NonCPS 

@NonCPS 
def call(ary) { 
    ary.each { 
    it.whatever 
    } 

}

+0

c'è una soluzione alternativa cambiando in: 'arry.each {print it}' a 'for (int i; i Joey

Problemi correlati