调用jenkins管道脚本close(),而不执行闭包

调用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

以下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 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