Iteration over list or map in Pipeline script

15,909 views
Skip to first unread message

Martin Schmude

unread,
Mar 13, 2017, 10:26:44 AM3/13/17
to Jenkins Users
Hello,

I have a freestyle job with one step of the kind "Execute Groovy Script". Its Groovy code is

def x = ['a', 'b', 'c']
println x
x
.each { println it }


The output of this job is (not surprinsingly):
[Test-Groovy2] $ groovy /var/lib/jenkins/workspace/Test-Groovy2/hudson3825239812036801886.groovy
[a, b, c]
a
b
c
Finished: SUCCESS

But if I create a pipeline job with the pipeline script set to the same Groovy code, its output is:
[Pipeline] echo
[a, b, c]
[Pipeline] echo
a
[Pipeline] End of Pipeline
Finished: SUCCESS

The .each() gets the first element in the list and nothing more.
What's going on here? I thought that pipeline scripts are just Groovy plus some pipeline DSL, but I seem to be wrong.

BTW: my Jenkins is 2.27.

Slide

unread,
Mar 13, 2017, 10:59:55 AM3/13/17
to Jenkins Users
Pipeline is a SUBSET of Groovy, not a superset. There are things (like iterators) that are not serializable, so they can't be used in a pipeline. You can create a method that is marked with @NonCPS to do things that are not serialized, but sometimes it is difficult to get back out what you need without the full Groovy functionality. You need to switch to using C style loops.

--
You received this message because you are subscribed to the Google Groups "Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jenkinsci-use...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/jenkinsci-users/ca2dd238-550f-46a0-8f56-1bc167402eb8%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Bill Dennis

unread,
Mar 13, 2017, 8:03:37 PM3/13/17
to Jenkins Users
You can do it with a for loop. There are issues using Groovy iterators like each {}. Try something like this:

pipeline {
    agent any
   
    stages
{
        stage
('loop') {
            steps
{
                script
{

                   
def x = ['a', 'b', 'c']

                    println x
                   
for(String item: x) {
                        println item
                   
}
               
}
           
}
       
}
   
}
}

Martin Schmude

unread,
Mar 17, 2017, 2:10:31 AM3/17/17
to Jenkins Users
Thank you all for the clarification.

Baptiste Mathus

unread,
Mar 24, 2017, 3:12:12 PM3/24/17
to jenkins...@googlegroups.com
It might have been fixed, I didn't check very recently, but not long ago that kind of loop (Java 5 style) was not working either. So either double check or use c-style loops only in general.

--
You received this message because you are subscribed to the Google Groups "Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jenkinsci-users+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/jenkinsci-users/de886784-ca86-4872-a310-0924a7a25d9c%40googlegroups.com.

John Mellor

unread,
Mar 27, 2017, 11:32:58 AM3/27/17
to Jenkins Users

I just did it this morning, doesn't work.

You have to instead do:


for(int i = 0; i < list.size(); i++) { def elem = list[i]; ... }

Reply all
Reply to author
Forward
0 new messages