温馨提示:本文翻译自stackoverflow.com,查看原文请点击:inheritance - How to create an extendable base job in Jenkins Job DSL?
groovy jenkins inheritance jenkins-groovy jenkins-job-dsl

inheritance - 如何在Jenkins Job DSL中创建可扩展的基础作业?

发布于 2020-03-27 11:11:37

我正在尝试创建一个基础工作,以减少我们工作之间的重复。我做了以下工作,但是不起作用:

def baseJob(Map m, Closure c = {}) {
    type = m.type ?: 'dev'
    pipelineJob("prefix-${m.name}") {
        parameters {
            stringParam('ONE', 'one', 'Description one')
        }
        c()
    }
}

baseJob(type: 'release', name: 'test') {
    parameters { // <-- Fails here
        stringParam('TWO', 'two', 'Description two')
    }
}

我收到以下错误:

错误:(脚本,第12行)方法的无签名:script.parameters()适用于参数类型:(script $ _run_closure1 $ _closure4)值:[script $ _run_closure1 $ _closure4 @ 18b249b3]

预期的工作如下:

def baseJob(Map m, Closure c = {}) {
    type = m.type ?: 'dev'
    pipelineJob("prefix-${m.name}") {
        parameters {
            stringParam('ONE', 'one', 'Description one')
        }
        parameters { // <-- This is fine
            stringParam('TWO', 'two', 'Description two')
        }
        c()
    }
}

baseJob(type: 'release', name: 'test')

所以问题不在于我打过parameters多次电话问题似乎是我parameters从闭包内部调用

我想相信有一种执行关闭的方法,因此可以parameters正确调用。但是,我怀疑我必须先了解更多有关Groovy和Jenkins Job DSL的知识,然后才能弄清楚。因此,我希望有人知道该怎么做。

如果您有替代解决方案来完成可扩展的基础工作,那也是一个有效的答案。

查看更多

查看更多

提问者
Erik B
被浏览
117
Erik B 2019-07-04 00:48

您只需要将要调用的闭包的代理设置为您所在的闭包的代理即可:

def baseJob(Map m, Closure c = {}) {
    type = m.type ?: 'dev'
    pipelineJob("prefix-${m.name}") {
        parameters {
            stringParam('ONE', 'one', 'Description one')
        }
        c.delegate = delegate // <-- Just add this line
        c()
    }
}

baseJob(type: 'release', name: 'test') {
    parameters {
        stringParam('TWO', 'two', 'Description two')
    }
}

delegate 包含当前正在执行的闭包的委托。