groovy Jenkins中的工作流脚本

cygmwpex  于 2023-02-03  发布在  Jenkins
关注(0)|答案(2)|浏览(211)

我在Jenkins共享库中有一个类,它存储来自Jenkins管道脚本的WorkflowScript类的示例,如下所示。
def myTools = new my.org.MyTools(this)
MyTools的构造函数只是像这样存储WorkflowScript的示例...

MyTools(script){
    this.script = script
}

那么我有一个方法尝试在script上使用groovy的.with,但是失败了...

myMethod(){
    script.with{
        node{
            echo "I want to be able to use pipeline syntax here"
            sh 'echo "without using script. in front of each command"'
        }
    }
}

但是当我运行这个时,我得到了以下错误...

hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: org.jenkinsci.plugins.workflow.cps.CpsClosure2.node() is applicable for argument types: (org.jenkinsci.plugins.workflow.cps.CpsClosure2) values: [org.jenkinsci.plugins.workflow.cps.CpsClosure2@855f14e]
Possible solutions: clone(), use([Ljava.lang.Object;), notify(), wait(), call(), run()
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:58)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:54)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite
.java:113)

我本以为script.with闭包的内部可以访问所有与script.相同的内容,但看起来它只能访问java.lang.Object的方法。是否可以让script.with闭包在script.的相同上下文下工作?

oug3syen

oug3syen1#

对于Groovy闭包,可以指定闭包用来解析方法和属性的策略
有几种选择:第一个委派、仅委派、所有者第一个(默认)、仅所有者、至自身
我觉得pipeline脚本有一个特殊的策略,在你的类里面有一个默认的策略。

nxowjjhe

nxowjjhe2#

class MyTools {
    def script

    def myMethod(){
        def closure = {
            echo "I want to be able to use pipeline syntax here!"
        }
        closure.setDelegate(this.script)
        closure()
    }
}

stage('XXX') {
    steps {
        script {
            def myTools = new MyTools(script:this)
            myTools.myMethod()
        }
    }
}

相关问题