避免 Jenkins Job DSL 的口是心非 API
Avoid duplicity on Jenkins Job DSL API
我正在使用 Jenkins Job DSL 插件 配置几个 Jenkins 作业,在我的两个作业的步骤部分,它几乎相同,只需更改一个“builder”的值“couchbase”。
目前看来我正在打破 DRY,并且复制了很多代码。因为我是 DSL 的新手,所以我不太确定 API 是否允许创建一种通用代码以避免像我一样重复步骤。
job("images/builder") {
concurrentBuild()
triggers {
githubPush()
}
scm {
git {
remote {
github("aws", "https", "github.dev.global.com")
credentials('***********')
}
}
}
steps {
shell('export AWS_DEFAULT_REGION=eu-west-1')
shell('$(aws ecr get-login --region eu-west-1)')
shell('docker build -t builder -f ./images/builder/Dockerfile .')
shell('docker tag -f builder:latest **********.dkr.ecr.eu-west-1.amazonaws.com/builder:latest')
shell('docker push **********.dkr.ecr.eu-west-1.amazonaws.com/builder:latest)')
}
}
job("images/couchbase") {
concurrentBuild()
triggers {
githubPush()
}
scm {
git {
remote {
github("aws2", "https", "github.dev.global.com")
credentials('****************')
}
}
}
steps {
shell('export AWS_DEFAULT_REGION=eu-west-1')
shell('$(aws ecr get-login --region eu-west-1)')
shell('docker build -t builder -f ./images/couchbase/Dockerfile .')
shell('docker tag -f builder:latest ********.dkr.ecr.eu-west-1.amazonaws.com/couchbase:latest')
shell('docker push **********.dkr.ecr.eu-west-1.amazonaws.com/couchbase:latest)')
}
}
如果简单到两个命名项目的相同步骤,一个循环就足够了:
String[] names = ["builder", "couchbase"]
names.each {
job("images/" + it) {
concurrentBuild()
triggers {
githubPush()
}
scm {
git {
remote {
github("aws2", "https", "github.dev.global.com")
credentials('****************')
}
}
}
steps {
shell('export AWS_DEFAULT_REGION=eu-west-1')
shell('$(aws ecr get-login --region eu-west-1)')
shell('docker build -t builder -f ./images/' + it + '/Dockerfile .')
shell('docker tag -f builder:latest ********.dkr.ecr.eu-west-1.amazonaws.com/' + it + ':latest')
shell('docker push **********.dkr.ecr.eu-west-1.amazonaws.com/' + it + ':latest)')
}
}
}
如果您想要更复杂的内容,请查看 these examples, specifically the job builder class and usage of it
我正在使用 Jenkins Job DSL 插件 配置几个 Jenkins 作业,在我的两个作业的步骤部分,它几乎相同,只需更改一个“builder”的值“couchbase”。
目前看来我正在打破 DRY,并且复制了很多代码。因为我是 DSL 的新手,所以我不太确定 API 是否允许创建一种通用代码以避免像我一样重复步骤。
job("images/builder") {
concurrentBuild()
triggers {
githubPush()
}
scm {
git {
remote {
github("aws", "https", "github.dev.global.com")
credentials('***********')
}
}
}
steps {
shell('export AWS_DEFAULT_REGION=eu-west-1')
shell('$(aws ecr get-login --region eu-west-1)')
shell('docker build -t builder -f ./images/builder/Dockerfile .')
shell('docker tag -f builder:latest **********.dkr.ecr.eu-west-1.amazonaws.com/builder:latest')
shell('docker push **********.dkr.ecr.eu-west-1.amazonaws.com/builder:latest)')
}
}
job("images/couchbase") {
concurrentBuild()
triggers {
githubPush()
}
scm {
git {
remote {
github("aws2", "https", "github.dev.global.com")
credentials('****************')
}
}
}
steps {
shell('export AWS_DEFAULT_REGION=eu-west-1')
shell('$(aws ecr get-login --region eu-west-1)')
shell('docker build -t builder -f ./images/couchbase/Dockerfile .')
shell('docker tag -f builder:latest ********.dkr.ecr.eu-west-1.amazonaws.com/couchbase:latest')
shell('docker push **********.dkr.ecr.eu-west-1.amazonaws.com/couchbase:latest)')
}
}
如果简单到两个命名项目的相同步骤,一个循环就足够了:
String[] names = ["builder", "couchbase"]
names.each {
job("images/" + it) {
concurrentBuild()
triggers {
githubPush()
}
scm {
git {
remote {
github("aws2", "https", "github.dev.global.com")
credentials('****************')
}
}
}
steps {
shell('export AWS_DEFAULT_REGION=eu-west-1')
shell('$(aws ecr get-login --region eu-west-1)')
shell('docker build -t builder -f ./images/' + it + '/Dockerfile .')
shell('docker tag -f builder:latest ********.dkr.ecr.eu-west-1.amazonaws.com/' + it + ':latest')
shell('docker push **********.dkr.ecr.eu-west-1.amazonaws.com/' + it + ':latest)')
}
}
}
如果您想要更复杂的内容,请查看 these examples, specifically the job builder class and usage of it