如何打印多行字符串参数的每个元素? [英] How to print each element of Multi-line String Parameter?

查看:500
本文介绍了如何打印多行字符串参数的每个元素?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Jenkins的流水线工作(v2.7.1)中打印了多行字符串参数( Params )的每个元素,其中包含3个字符串每行: Bar Baz 作为输入。

已尝试以下语法(使用 拆分 ):

  Params.split(\\r?\\ n),每个{参数 - > 
printlnParam:$ {param}
}

但失败与:


java.lang.UnsupportedOperationException :调用public static java.lang。对象
org.codehaus.groovy.runtime.DefaultGroovyMethods.each(java.lang.Object,groovy.lang.Closure)尚未支持CPS转换的闭包( JENKINS-26481 );封装在@NonCPS方法中,或者在org.jenkinsci.plugins.workflow.cps.GroovyClassLoaderWhitelist.checkJenkins26481(GroovyClassLoaderWhitelist.java:90)中使用Java风格的循环

建议封装在@NonCPS方法中,或者使用Java风格的循环。






所以我试着用@NonCPS方法封装

  @NonCPS 
def printParams(){
Params.split(\\\\\\\\\)。each {param - >
printlnParam:$ {param}
}
}
printParams()

,但会失败:


org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:脚本没有允许使用staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods println groovy.lang.Closure java.lang.Object

没有函数(按照第一个示例),在开始时添加 @NonCPS ,它会抱怨意外令牌




我也尝试过使用 for 运算符所建议的Java风格语法(类似于这里):

  String [] params = Params.split(\\ \\\r?\\\\

for(String param:params){
printlnParam:$ {param}
}

这似乎在普通的Groovy中工作,但在Jenkins中失败:


$ b


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







我应该使用哪种语法才能使其工作? 解除方法

禁用时,代码可以正常工作使用Groovy Sandbox 选项并添加 @NonCPS 辅助方法。或者,如 @ agg3l ,继续 Jenkins管理以允许此方法访问。



因此,工作代码(与第二个示例相同):

  @NonCPS 
def printParams(){
Params.split(\\r?\\\ \\ n)。每个{参数 - >
printlnParam:$ {param}
}
}
printParams()


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?

解决方案

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

这篇关于如何打印多行字符串参数的每个元素?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆