如何打印多行字符串参数的每个元素?
How to print each element of Multi-line String Parameter?
我在 Jenkins (v2.7.1) 中进行了管道作业,我想打印多行字符串参数 (Params
) 的每个元素,每行有 3 个字符串:Foo、Bar、Baz 作为输入。
所以我尝试了以下语法(使用 split
和 each
):
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
}
}
我在 Jenkins (v2.7.1) 中进行了管道作业,我想打印多行字符串参数 (Params
) 的每个元素,每行有 3 个字符串:Foo、Bar、Baz 作为输入。
所以我尝试了以下语法(使用 split
和 each
):
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
辅助方法时,代码工作正常。或者,按照
所以工作代码是(与第二个例子相同):
@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
}
}