2017-02-07 1 views
2

Je tente de reproduire cette fonctionnalité du plug-in de flux Build: https://wiki.jenkins-ci.org/display/JENKINS/Build+Flow+Plugin:Jenkins Construire flux Plugin chaîne séquentiellement plusieurs emplois en parallèle

parallel (
    { 
     build("job1") 
     build("job2") 
    }, 
    { 
     build("job5") 
     build("job6") 
    } 
) 

je la tâche DSL suivante:

subjob = "test" 
subjob2 = "test2" 
series1 = [] 
series2 = [] 
subjob = [] 

["job1","job2"].each{ parameter -> 
    series1.add({build(subjob, param: parameter)}) 
} 

["job5","job6"].each{ parameter2 -> 
    series2.add({build(subjob2, param: parameter2)}) 
} 

subjob.add(series1) 
subjob.add(series2) 

parallel(subjob) 

Mon but est d'exécuter un ensemble de travaux 1 & 2 en série et un autre jeu de travaux 5 & 6 en série, mais pour exécuter les deux ensembles de travaux en parallèle. C'est-à-dire que les travaux 1 et 5 démarrent en même temps, puis lorsque le travail 1 termine le travail 2 et lorsque le travail 5 se termine, le travail 6 commence.

Cependant, j'ai essayé un certain nombre de variations sur le code ci-dessus, mais différentes erreurs à chaque fois. Le code ci-dessus donne ce qui suit:

ERROR: Failed to run DSL Script 
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '[[email protected], [email protected]]' with class 'java.util.ArrayList' to class 'groovy.lang.Closure' due to: groovy.lang.GroovyRuntimeException: failed to invoke constructor: public groovy.lang.Closure(java.lang.Object,java.lang.Object) with arguments: [[email protected], [email protected]] reason: java.lang.InstantiationException 

Y a-t-il une meilleure façon de procéder?

Répondre

1

L'étape/fonction parallèle attend une liste de fermetures, par ex. une liste de blocs de code. Ce que vous lui donnez une liste de la liste des fermetures, et vous pouvez naturellement pas lancer ce à une fermeture, d'où l'erreur:

Cannot cast object '...' with class 'java.util.ArrayList' to class 'groovy.lang.Closure' 

Ce que vous devez faire est d'envelopper les emplois en série dans une fermeture :

subjob = "test" 
subjob2 = "test2" 
series1 = [] 
series2 = [] 
subTasks = [] 

["job1","job2"].each{ parameter -> 
    series1.add({build(subjob, param: parameter)}) 
} 

["job5","job6"].each{ parameter2 -> 
    series2.add({build(subjob2, param: parameter2)}) 
} 

subTasks.add({ 
    series1.each{it()} 
}) 
subTasks.add({ 
    series2.each{it()} 
}) 

parallel(subTasks) 

une explication de ce que je fais:

subTasks.add({ 
    series1.each{it()} 
}) 

d'abord, nous ajoutons une nouvelle fermeture à la liste subTasks, cette fermeture prend chaque élément dans la liste et l'exécute (it()).

+0

Merci, je comprends la théorie maintenant, mais je reçois ce qui suit lors de l'exécution de votre code: java.util.concurrent.ExecutionException: java.lang.NullPointerException: Impossible d'invoquer la méthode call() sur l'objet nul – bazza2000

+0

Wops, mon Mauvais, il devrait être 'series1.each {it()}', par exemple parenthèses au lieu de parenthèses. J'ai mis à jour ma réponse. –

+0

Vous cherchez mieux;), obtenant maintenant 'java.util.concurrent.ExecutionException: groovy.lang.MissingMethodException: Aucune signature de méthode: com.cloudbees.plugins.flow.FlowDelegate.build() est applicable pour les types d'arguments: (java .util.LinkedHashMap, java.util.ArrayList) valeurs: [[param: job1], [Script1 $ _run_closure3 @ 5bc92f8c, Script1 $ _run_closure4 @ 3a163c10]] Solutions possibles: build (java.lang.String), build (Java .util.Map, java.lang.String), fail(), find(), getBuild(), wait() ' – bazza2000