从Groovy / Jenkins的一个类传递闭包

时间:2019-02-28 09:38:00

标签: jenkins groovy jenkins-pipeline

我正在尝试创建一个JobGenerator类,该类将把构建步骤传递给调用实例。我遇到一个问题,如果尝试运行此错误时出现此错误:

  

hudson.remoting.ProxyException:groovy.lang.MissingMethodException:方法的无签名:org.jenkinsci.plugins.workflow.cps.CpsClosure2.build()适用于参数类型:(java.util.LinkedHashMap)值: [[job:FooJob]]

class BuildGenerator implements Serializable {     

static def generateJob() {
    return  [
            "TestJob",
            { ->
                build(
                        job: 'FooJob'
                )
            },
    ]
  }        
}        

node(){
    def tasks = [:]
    def label
    def task

    stage("Build") {
        def generator = new BuildGenerator()            
        tasks["Testing"] = generator.generateJob()[1]
        parallel tasks
    }
}

如果我在类外删除了generateJob函数,那么它将正常工作。我在这里关闭有什么错吗?我是groovy / jenkins世界的新手。

1 个答案:

答案 0 :(得分:1)

嗯,这就是Groovy / Jenkins管道的工作方式。 build内部的node是其余步骤和功能。如果您希望访问它们,则必须像这样将CPS实例传递给方法(或使用构造函数仅将实例传递一次):

class BuildGenerator implements Serializable {     

static def generateJob(script) {
    return  [
            "TestJob",
            { ->
                script.build(
                        job: 'FooJob'
                )
            },
    ]
  }        
}        

node(){
    def tasks = [:]
    def label
    def task

    stage("Build") {
        def generator = new BuildGenerator()            
        tasks["Testing"] = generator.generateJob(this)[1]
        parallel tasks
    }
}