【问题标题】:Passing closures from a class in Groovy/Jenkins从 Groovy/Jenkins 中的类传递闭包
【发布时间】:2019-07-22 04:15:59
【问题描述】:

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

hudson.remoting.ProxyException:groovy.lang.MissingMethodException:没有方法签名:org.jenkinsci.plugins.workflow.cps.CpsClosure2.build() 适用于参数类型:(java.util.LinkedHashMap) 值: [[工作: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 世界的新手。

【问题讨论】:

    标签: jenkins groovy jenkins-pipeline


    【解决方案1】:

    嗯...这就是 Groovy/Jenkins 管道的工作方式。 buildnode 中可用,作为其余步骤和功能。如果您希望访问这些,您必须将 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
        }
    }
    

    【讨论】:

    • 正是我所缺少的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多