如何打印多行字符串参数的每个元素?

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

我在 Jenkins (v2.7.1) 中进行了管道作业,我想打印多行字符串参数 (Params) 的每个元素,每行有 3 个字符串:FooBarBaz 作为输入。

所以我尝试了以下语法(使用 spliteach):

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

但它失败了:

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)

建议封装在@NonCPS 方法中,或使用Java 式循环


所以我尝试封装在@NonCPS 方法 中,例如:

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

但它失败了:

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

没有函数(按照第一个例子),在开头添加 @NonCPS 它会抱怨 unexpected token.


我还尝试了使用 for 运算符建议的 Java 风格的语法(类似于 here):

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

这似乎在普通 Groovy 中有效,但在 Jenkins 中失败了:

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


我应该使用哪种语法来使其工作?

当禁用 Use Groovy Sandbox 选项并添加 @NonCPS 辅助方法时,代码工作正常。或者,按照 的建议,继续 Jenkins 管理 以允许此方法访问。

所以工作代码是(与第二个例子相同):

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

我知道这是旧的 post 但这是我的方法,希望对其他人有所帮助

params.readLines().each {
                            println it
                            if (it) {
                                // if you want to avoid make operation with empty lines
                            }
                        }