2017-04-26 3 views
0

Ich habe Probleme mit einem Jenkins Job mit Groovy, und es scheint super einfach, aber ich bin 1) ein Anfänger bei Java/Groovy und 2) alle Beispiele, die ich kann Finde ich nicht, was ich tun muss.Einfache parallele Ausführung in Jenkins für ein Array

fand ich die folgende ähnliche Frage: Jenkins Groovy Parallel Variable not working, aber das genaue Code führt zu einem Fehler:

java.lang.UnsupportedOperationException: Calling public static java.util.List org.codehaus.groovy.runtime.DefaultGroovyMethods.collect(java.lang.Object,groovy.lang.Closure) on a CPS-transformed closure is not yet supported (JENKINS-26481); encapsulate in a @NonCPS method, or use Java-style loops

Hier mein Pseudo-Code ist von dem, was ich tun möchte:

String[] arr = [ "one","two","three",'four','five' ] 
echo "Running commands: ${arr}" 
int top = arr.size() 
echo "top is ${top}" 
parallel arr.each { 
    echo "${it}" 
} 

Ich habe Verschlüsse versucht, aber sie werfen einen Fehler und ehrlich gesagt, ich weiß kaum, wie man sie benutzt. Der folgende Code

String[] arr = [ "one","two","three",'four','five' ] 
echo "Running commands: ${arr}" 

parallel arr.collect { item -> 
    { -> 
     echo "${item}" 
    } 
} 

führt die gleichen "java.lang.UnsupportedOperationException", wie die damit verbundene Frage oben.

Ich versuche zu lernen, Groovy mit Jenkins richtig zu verwenden, aber es war rau. Ich suche nur nach Hilfe, die ich an dieser Stelle bekommen kann.

Vielen Dank.

Antwort

0

Es ist eine ziemlich ärgerliche Einschränkung, aber zur Zeit können Sie nicht .each in einem Pipeline-Skript verwenden (wie hier dokumentiert: https://issues.jenkins-ci.org/browse/JENKINS-26481)

Sie benötigen eine aktuelle Schleife zu tun, wie

String[] arr = [ "one","two","three",'four','five' ] 
echo "Running commands: ${arr}" 
int top = arr.size() 
echo "top is ${top}" 
for (it in arr) { 
    echo "${it}" 
} 

Wenn tatsächlich parallele Ausführung benötigt der Code aussehen wie:

String[] arr = [ "one","two","three",'four','five' ] 
echo "Running commands: ${arr}" 
int top = arr.size() 
echo "top is ${top}" 
def stepsForParallel = [:] 

for (int i = 0; i < arr.size(); i++) { 
    def it = arr[i] 
    def stepName = "running ${it}" 
    stepsForParallel[stepName] = { ->   
     echo "${it}" 
    } 
} 

parallel stepsForParallel 

die andere Stackoverflow Sie verknüpft verwendet die Build-Flow-Plugi n, welches der Vorgänger des von Ihnen verwendeten Pipeline-Plugins ist. Deshalb funktioniert derselbe Code nicht.

Verwandte Themen