列表中的 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()
}
}
我正在尝试创建一个 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()
}
}