Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.8k views
in Technique[技术] by (71.8m points)

jenkins - 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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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()

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...