调用jenkins管道脚本close(),而不执行闭包
以下Jenkins管道脚本不执行闭包中的代码调用jenkins管道脚本close(),而不执行闭包,jenkins,jenkins-pipeline,jenkins-groovy,Jenkins,Jenkins Pipeline,Jenkins Groovy,以下Jenkins管道脚本不执行闭包中的代码 class MyClass implements Closeable, Serializable { private final script MyClass(final script) { this.script = script this.script.echo "In MyClass()" } @Override public void close() throws E
class MyClass implements Closeable, Serializable {
private final script
MyClass(final script) {
this.script = script
this.script.echo "In MyClass()"
}
@Override
public void close() throws Exception {
this.script.echo "In MyClass.close()"
}
}
def sdk = new MyClass(this).withCloseable {
println "In Closure ..."
}
println "Done"
请注意,没有“InClosure…”字符串。
我必须批准签名:方法groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object才能运行上述脚本。简短版本:
我相信Jenkins安装中附带的groovy版本不支持。withCloseable
。特别要注意的是,许多Jenkins安装只有groovy 1.8.9版。我认为,Groovy直到第2版才添加带有closeable的自动
更长:
您不应该批准签名groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object
。去取消批准它,因为它对您没有任何好处,可能会隐藏其他错误/使它们更难跟踪,如果您让非管理员开发人员向Jenkins实例提交作业,这将是一个安全漏洞
groovy和Jenkins的交互有一个恼人的小UI故障:如果您试图在没有该方法的对象上调用一个方法,并且该对象的类是用groovy编写的,那么您将得到一个“脚本不允许使用该方法”引用groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object
时出错。不是NoSuchMethodException
,不是关于错误方法名称的有用消息,而是一个安全错误
如果您收到的错误消息特别指的是groovy.lang.GroovyObject invokeMethod
,通常意味着“您调用了一个不存在的方法”。在这种情况下,我认为这是因为安装在Jenkins实例上的groovy
太旧了,不能自动将withCloseable
添加到实现Closeable
的类中
This is the output:
[Pipeline] Start of Pipeline
[Pipeline] echo
In MyClass()
[Pipeline] echo
In MyClass.close()
[Pipeline] echo
Done
[Pipeline] End of Pipeline
Finished: SUCCESS