Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to print each element of Multi-line String Parameter?

I've Pipeline job in Jenkins (v2.7.1) where I'd like to print each element of Multi-line String parameter (Params) with 3 strings in each line: Foo, Bar, Baz as an input.

So I've tried the following syntax (using split and each):

Params.split("\\r?\\n").each { param ->
    println "Param: ${param}"
}

but it fails with:

java.lang.UnsupportedOperationException: Calling public static java.lang.Object org.codehaus.groovy.runtime.DefaultGroovyMethods.each(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 at org.jenkinsci.plugins.workflow.cps.GroovyClassLoaderWhitelist.checkJenkins26481(GroovyClassLoaderWhitelist.java:90)

which suggest to encapsulate in a @NonCPS method, or use Java-style loops.


So I've tried to encapsulate in a @NonCPS method like:

@NonCPS
def printParams() {
    Params.split("\\r?\\n").each { param ->
        println "Param: ${param}"
    }
}
printParams()

but it fails with:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods println groovy.lang.Closure java.lang.Object

Without the function (as per first example), adding @NonCPS at the beginning it complains about unexpected token.


I also tried Java-style syntax as suggested by using for operator (similar as here):

String[] params = Params.split("\\r?\\n")
for (String param: params) {
    println "Param: ${param}"
}

which seems to work in plain Groovy, but it fails in Jenkins with:

java.io.NotSerializableException: java.util.AbstractList$Itr at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)


Which syntax I should use to make it work?

like image 443
kenorb Avatar asked Oct 22 '16 18:10

kenorb


2 Answers

The code works fine when disabling a Use Groovy Sandbox option and adding @NonCPS helper method. Alternatively, as suggested by @agg3l, proceed to Jenkins management to permit this method access.

So the working code is (same as the 2nd example):

@NonCPS
def printParams() {
    Params.split("\\r?\\n").each { param ->
        println "Param: ${param}"
    }
}
printParams()
like image 94
kenorb Avatar answered Oct 30 '22 07:10

kenorb


I know it's an old post but this is my way to do it, hopefully help anyone else

params.readLines().each {
                            println it
                            if (it) {
                                // if you want to avoid make operation with empty lines
                            }
                        }
like image 40
Jheison Rodriguez Avatar answered Oct 30 '22 07:10

Jheison Rodriguez