Расширение кода задания DSL Дженкинса в нескольких классах - PullRequest
0 голосов
/ 02 октября 2019

Я прочитал много учебников, касающихся плагина Jenkins Job DSL, но я не могу понять, как создать класс фабрики заданий, который, в свою очередь, использует другой класс, который генерирует задания.

У меня уже естьмного заданий Groovy-скрипты, которые напрямую вызывают фабрику заданий и работают, и мои задания генерируются правильно. Что мне нужно, так это еще один класс, который, в свою очередь, генерирует множество заданий с использованием предыдущей фабрики заданий.

Я часами пытался отладить эту проблему. Я почти уверен, что это как-то связано с замыканиями и созданием экземпляров фабричных объектов, но у меня просто нет знаний, чтобы решить проблему.

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()

Теперь, когда я пытаюсь расширить этот класс другим классом, происходит сбой.

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

Мне нужно расширить класс фабрики заданий в другой класс, поскольку я хочу создавать много заданий и избегать дублирования кода. Любая помощь будет принята с благодарностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...