列表中的 Jenkins Job DSL 参数

Jenkins Job DSL Parameter from list

我正在尝试创建一个 DSL 作业,它将从地图列表中创建作业,如下所示:

def git_branch = "origin/awesomebranch"
def credential_id = "awesomerepocreds"
def jobs = [
  [
    title: "AwesomePipeline",
    description: "This pipeline is awesome.",
    directory: "awesomepath",
    repo: "ssh://git@bitbucket.XXX.XX.XX:XXXX/repo/repo.git"
  ]
]

jobs.each { i ->
    pipelineJob(i.title) {
        description("${i.description}\n\n__branch__: ${git_branch}")
        parameters {
            stringParam('branch', defaultValue='origin/develop', description='Branch to build')
        }
        definition {
            cpsScm {
                scm {
                    git {
                        branch('$branch')
                        remote {
                            url(i.repo)
                            credentials(credential_id)
                        }
                    }
                    scriptPath("jenkins/${i.directory}/Jenkinsfile")
                }
            }
        }
    }
}

对于没有参数的作业,这很好用,但我不知道如何将列表传递到将由参数块使用的作业映射中,例如

....
def jobs = [
  [
    title: "AwesomePipeline",
    description: "This pipeline is awesome.",
    directory: "awesomepath",
    repo: "ssh://git@bitbucket.XXX.XX.XX:XXXX/repo/repo.git",
    params: [
        stringParam('branch', defaultValue='origin/develop', description='Branch to build'),
        stringParam('sawesomeparam', defaultValue='awesomevalue', description='awesomething')
    ]
  ]
]
...

这可能会被用作某种形式的 each,但不确定如何正确地表述它。

....
jobs.each { i ->
    pipelineJob(i.title) {
        description("${i.description}\n\n__branch__: ${git_branch}")
        parameters {
            i.params.each { p ->
                p
            }
        }
....

提前致谢

这是个比较老的问题,前几天才发现。这就是我最终解决这个问题的方式。

首先我们需要一个具有静态 context 方法的 class,该方法(我 认为 )被 Groovy 调用。这个上下文随后被重用以实际添加参数。我想你应该使用 job-dsl 插件的 additionalClasspath 功能将 Params class 分开到一个单独的文件中,这样你就可以重新使用它。

import javaposse.jobdsl.dsl.helpers.BuildParametersContext
class Params {
    protected static Closure context(@DelegatesTo(BuildParametersContext) Closure params) {
        params.resolveStrategy = Closure.DELEGATE_FIRST
        return params
    }

    static Closure extend(Closure params) {
        return context(params)
    }
}

然后您可以使用包含闭包列表的 params 属性设置作业。

def jobs = [
    [
        name: "myjob",
        params: [
            {
                stringParam('ADDITIONAL_PARAM', 'default', 'description')
            }
        ]
    ]
]

最后,您可以使用上面 class.

的静态 extend 调用 parameters 属性
jobs.each { j ->
    pipelineJob(j.name) {
        // here go all the default parameters
        parameters {
            string {
                name('SOMEPARAM')
                defaultValue('')
                description('')
                trim(true)
            }
        }
        j.params.each { p ->
            parameters Params.extend(p)
        }

        // additional pipelineJob properties...
    }
}

我之所以将地图的 params 属性制作成一个列表,是因为这样您就可以拥有 return Closure 包含其他参数的其他方法。例如:

class DefaultParams {
    static Closure someParam(String valueDefault) {
        return {
            string {
                name('SOME_EXTRA_PARAM')
                defaultValue(valueDefault)
                description("It's a description bonanza")
                trim(true)
            }
        }
    }
}

def myjobs = [
    [
        name: "myjob",
        params: [
            defaultParams.someParam('default')
            {
                stringParam('ADDITIONAL_PARAM', 'default', 'description')
            }
        ]
    ]
]

您应该能够使用 job-dsl api 页面上显示的所有不同语法。

最简单的方法是:

jobs.each { i ->
    pipelineJob(i.title) {
        description("${i.description}\n\n__branch__: ${git_branch}")
        parameters {
            i.params.each { p ->
                p.delegate = owner.delegate
                p() 
            }
    }

其中 owner.delegate 是参数的委托

或不创建空参数的更好:

jobs.each { i ->
    pipelineJob(i.title) {
        description("${i.description}\n\n__branch__: ${git_branch}")
        i.params.each { p ->
            parameters {
                p.delegate = getDelegate()
                p() 
            }
    }