在多个 类 中扩展 Jenkins 作业 DSL 代码
Extending Jenkins job DSL code in multiple classes
我已经阅读了很多关于 Jenkins 作业 DSL 插件的教程,但我不知道如何创建一个作业工厂 class,而后者又使用另一个 class 来生成作业。
我已经有很多作业 Groovy 脚本可以直接调用作业工厂并且可以正常工作,而且我的作业已正确生成。我需要的是另一个 class,它反过来使用以前的工作工厂生成大量工作。
我花了几个小时试图调试这个问题。我很确定它与闭包和实例化工厂对象有关。
package company.factory
import javaposse.jobdsl.dsl.DslFactory
import javaposse.jobdsl.dsl.Job
/**
* Base DSL templates for all Jenkins jobs.
*
*/
class JobFactory {
private DslFactory dslFactory
JobFactory(DslFactory dslFactory) {
this.dslFactory = dslFactory
}
Job generateBaseJob() {
dslFactory.job('TEST-1') {
logRotator(365, -1, 1, -1)
}
}
def generate() {
generateBaseJob()
}
}
将其称为 Groovy 脚本有效:
import company.factory.JobFactory
JobFactory jobfactory = new JobFactory(this)
jobfactory.generate()
现在,当我尝试用另一个 class 扩展 class 时,它失败了。
package company.flow
import company.factory.JobFactory
class DeploymentFlow {
JobFactory jobfactory = new JobFactory(this)
def generateAllJobs() {
jobfactory.generate()
}
}
将其称为 Groovy 脚本失败:
import company.flow.DeploymentFlow
new DeploymentFlow().generateAllJobs()
错误:
javaposse.jobdsl.dsl.DslScriptException: (JobFactory.groovy, line 36) No signature of method: company.flow.DeploymentFlow.job() is applicable for argument types: (java.lang.String, company.factory.JobFactory$_generateBaseJob_closure1) values: [TEST-1, company.factory.JobFactory$_generateBaseJob_closure1@60ed3159]
Possible solutions: any(), wait(), getA(), find(), grep(), dump()
at javaposse.jobdsl.dsl.AbstractDslScriptLoader.runScriptEngine(AbstractDslScriptLoader.groovy:114)
at javaposse.jobdsl.dsl.AbstractDslScriptLoader.runScripts_closure1(AbstractDslScriptLoader.groovy:61)
at groovy.lang.Closure.call(Closure.java:414)
at groovy.lang.Closure.call(Closure.java:430)
at javaposse.jobdsl.dsl.AbstractDslScriptLoader.runScripts(AbstractDslScriptLoader.groovy:46)
at javaposse.jobdsl.dsl.AbstractDslScriptLoader.runScript(AbstractDslScriptLoader.groovy:87)
at JobScriptsSpec.test script #file.name(JobScriptsSpec.groovy:57)
Caused by:
groovy.lang.MissingMethodException: No signature of method: company.flow.DeploymentFlow.job() is applicable for argument types: (java.lang.String, company.factory.JobFactory$_generateBaseJob_closure1) values: [TEST-1, company.factory.JobFactory$_generateBaseJob_closure1@60ed3159]
Possible solutions: any(), wait(), getA(), find(), grep(), dump()
at company.factory.JobFactory.generateBaseJob(JobFactory.groovy:36)
at company.flow.DeploymentFlow.generateAllJobs(DeploymentFlow.groovy:31)
at script.run(script:24)
at javaposse.jobdsl.dsl.AbstractDslScriptLoader.runScript(AbstractDslScriptLoader.groovy:138)
at javaposse.jobdsl.dsl.AbstractDslScriptLoader.runScriptEngine(AbstractDslScriptLoader.groovy:108)
... 6 more
我需要将我的工作工厂 class 扩展到另一个 class,因为我想生成很多工作并且我想避免重复的代码。任何帮助将不胜感激。
在 Google Jenkins DSL 插件组的好心人的帮助下,我设法解决了这个问题。
工作代码如下。
工厂class:
package company.factory
import javaposse.jobdsl.dsl.DslFactory
import javaposse.jobdsl.dsl.Job
class JobFactory {
private DslFactory dslFactory
JobFactory(DslFactory dslFactory) {
this.dslFactory = dslFactory
}
Job generateBaseJob() {
dslFactory.job('TEST-1')
}
}
部署class:
package company.flow
import company.factory.JobFactory
import javaposse.jobdsl.dsl.DslFactory
class DeploymentFlow {
JobFactory JobFactory
DeploymentFlow(DslFactory dslFactory) {
JobFactory = new JobFactory(dslFactory)
}
void generateAllJobs() {
JobFactory.generateBaseJob()
}
}
在我的种子作业中调用部署 class:
import company.flow.DeploymentFlow
DeploymentFlow deploymentFlow = new DeploymentFlow(this)
deploymentFlow.generateAllJobs()
我已经阅读了很多关于 Jenkins 作业 DSL 插件的教程,但我不知道如何创建一个作业工厂 class,而后者又使用另一个 class 来生成作业。
我已经有很多作业 Groovy 脚本可以直接调用作业工厂并且可以正常工作,而且我的作业已正确生成。我需要的是另一个 class,它反过来使用以前的工作工厂生成大量工作。
我花了几个小时试图调试这个问题。我很确定它与闭包和实例化工厂对象有关。
package company.factory
import javaposse.jobdsl.dsl.DslFactory
import javaposse.jobdsl.dsl.Job
/**
* Base DSL templates for all Jenkins jobs.
*
*/
class JobFactory {
private DslFactory dslFactory
JobFactory(DslFactory dslFactory) {
this.dslFactory = dslFactory
}
Job generateBaseJob() {
dslFactory.job('TEST-1') {
logRotator(365, -1, 1, -1)
}
}
def generate() {
generateBaseJob()
}
}
将其称为 Groovy 脚本有效:
import company.factory.JobFactory
JobFactory jobfactory = new JobFactory(this)
jobfactory.generate()
现在,当我尝试用另一个 class 扩展 class 时,它失败了。
package company.flow
import company.factory.JobFactory
class DeploymentFlow {
JobFactory jobfactory = new JobFactory(this)
def generateAllJobs() {
jobfactory.generate()
}
}
将其称为 Groovy 脚本失败:
import company.flow.DeploymentFlow
new DeploymentFlow().generateAllJobs()
错误:
javaposse.jobdsl.dsl.DslScriptException: (JobFactory.groovy, line 36) No signature of method: company.flow.DeploymentFlow.job() is applicable for argument types: (java.lang.String, company.factory.JobFactory$_generateBaseJob_closure1) values: [TEST-1, company.factory.JobFactory$_generateBaseJob_closure1@60ed3159]
Possible solutions: any(), wait(), getA(), find(), grep(), dump()
at javaposse.jobdsl.dsl.AbstractDslScriptLoader.runScriptEngine(AbstractDslScriptLoader.groovy:114)
at javaposse.jobdsl.dsl.AbstractDslScriptLoader.runScripts_closure1(AbstractDslScriptLoader.groovy:61)
at groovy.lang.Closure.call(Closure.java:414)
at groovy.lang.Closure.call(Closure.java:430)
at javaposse.jobdsl.dsl.AbstractDslScriptLoader.runScripts(AbstractDslScriptLoader.groovy:46)
at javaposse.jobdsl.dsl.AbstractDslScriptLoader.runScript(AbstractDslScriptLoader.groovy:87)
at JobScriptsSpec.test script #file.name(JobScriptsSpec.groovy:57)
Caused by:
groovy.lang.MissingMethodException: No signature of method: company.flow.DeploymentFlow.job() is applicable for argument types: (java.lang.String, company.factory.JobFactory$_generateBaseJob_closure1) values: [TEST-1, company.factory.JobFactory$_generateBaseJob_closure1@60ed3159]
Possible solutions: any(), wait(), getA(), find(), grep(), dump()
at company.factory.JobFactory.generateBaseJob(JobFactory.groovy:36)
at company.flow.DeploymentFlow.generateAllJobs(DeploymentFlow.groovy:31)
at script.run(script:24)
at javaposse.jobdsl.dsl.AbstractDslScriptLoader.runScript(AbstractDslScriptLoader.groovy:138)
at javaposse.jobdsl.dsl.AbstractDslScriptLoader.runScriptEngine(AbstractDslScriptLoader.groovy:108)
... 6 more
我需要将我的工作工厂 class 扩展到另一个 class,因为我想生成很多工作并且我想避免重复的代码。任何帮助将不胜感激。
在 Google Jenkins DSL 插件组的好心人的帮助下,我设法解决了这个问题。
工作代码如下。
工厂class:
package company.factory
import javaposse.jobdsl.dsl.DslFactory
import javaposse.jobdsl.dsl.Job
class JobFactory {
private DslFactory dslFactory
JobFactory(DslFactory dslFactory) {
this.dslFactory = dslFactory
}
Job generateBaseJob() {
dslFactory.job('TEST-1')
}
}
部署class:
package company.flow
import company.factory.JobFactory
import javaposse.jobdsl.dsl.DslFactory
class DeploymentFlow {
JobFactory JobFactory
DeploymentFlow(DslFactory dslFactory) {
JobFactory = new JobFactory(dslFactory)
}
void generateAllJobs() {
JobFactory.generateBaseJob()
}
}
在我的种子作业中调用部署 class:
import company.flow.DeploymentFlow
DeploymentFlow deploymentFlow = new DeploymentFlow(this)
deploymentFlow.generateAllJobs()