Search code examples
jenkinsjenkins-job-dsl

gradle test fail when using slackNotifier in Jenkins Job DSL definition


Update: From the bottom of the Automatically Generated DSL wiki entry ... The generated DSL is only supported when running in Jenkins,....

Since slackNotifier is generated DSL, it doesn't appear that there is a way to test this in our particular infrastructure. We're going to write a function which generates the config using the configure block.


I have a seed job definition which is failing gradle test even though it seems to work fine when we use it in Jenkins.

Job Definition Excerpt

//package master
// GitURL
def gitUrl = 'https://github.com/team/myapp'
def slackRoom = null

job('seed-dsl') {
    description('This seed is updated from the seed-dsl-updater job')
    properties {
        //Set github project URL
        githubProjectUrl(gitUrl)
    }
    ...
    // publishers is another name for post build steps
    publishers {
        mailer('', false, true)
        slackNotifier {
            room(slackRoom)
            notifyAborted(true)
            notifyFailure(true)
            notifyNotBuilt(true)
            notifyUnstable(true)
            notifyBackToNormal(true)
            notifySuccess(false)
            notifyRepeatedFailure(false)
            startNotification(false)
            includeTestSummary(false)
            includeCustomMessage(false)
            customMessage(null)
            buildServerUrl(null)
            sendAs(null)
            commitInfoChoice('NONE')
            teamDomain(null)
            authToken(null)
        }
    }
}

The gradle test command works fine when I comment out the with the slackNotifier declaration, but fail with the following error when it's enabled:

Test output excerpt

Caused by:
        javaposse.jobdsl.dsl.DslScriptException: (script, line 79) No signature of method: javaposse.jobdsl.dsl.helpers.publisher.PublisherContext.slackNotifier() is applicable for argument types: (script$_run_closure1$_closure9$_closure14) values: [script$_run_closure1$_closure9$_closure14@d2392a1]
        Possible solutions: stashNotifier(), stashNotifier(groovy.lang.Closure)
            at javaposse.jobdsl.dsl.DslScriptLoader.runScriptEngine(DslScriptLoader.groovy:135)
            at javaposse.jobdsl.dsl.DslScriptLoader.runScriptsWithClassLoader_closure1(DslScriptLoader.groovy:78)

According to the migration doc, slackNotifer has been supported since 1.47. In my gradle.build, I'm using 1.48. I see the same errors with plugin version 1.50

gradle.build excerpt

ext {
 jobDslVersion = '1.48'
 ...
}
...
// Job DSL plugin including plugin dependencies
testCompile "org.jenkins-ci.plugins:job-dsl:${jobDslVersion}"
testCompile "org.jenkins-ci.plugins:job-dsl:${jobDslVersion}@jar"
...

The gradle.build also includes the following, as suggested by the [testing docs] *(https://github.com/jenkinsci/job-dsl-plugin/wiki/Testing-DSL-Scripts).

testPlugins 'org.jenkins-ci.plugins:slack:2.0.1'

What do I need to do to be able to successfully test my job definitions. Is this a bug, or have I missed something else?


Solution

  • removed incorrect reply


    EDIT

    I see I missed the point.

    The new approach is to reuse the @DataBoundConstructor exposed by plugins, so nothing needs to be written to support a new plugin assuming it has a DataBoundConstructor

    Your SlackNotifier has this - note the DSL converts the lowercase first letter for you

    @DataBoundConstructor
    public SlackNotifier(
        final String teamDomain, 
        final String authToken, 
        final String room, 
        final String buildServerUrl,
        final String sendAs, 
        final boolean startNotification, 
        final boolean notifyAborted, 
        final boolean notifyFailure,
        final boolean notifyNotBuilt, 
        final boolean notifySuccess, 
        final boolean notifyUnstable, 
        final boolean notifyBackToNormal,
        final boolean notifyRepeatedFailure, 
        final boolean includeTestSummary, 
        CommitInfoChoice commitInfoChoice,
        boolean includeCustomMessage, 
        String customMessage) {
        ...
    }
    

    Unfortunately there is an embedded type in the parameter list CommitInfoChoice and this does not have a DataBoundConstructor and its an enum too.

    public enum CommitInfoChoice {
        NONE("nothing about commits",                             false, false),
        AUTHORS("commit list with authors only",                  true,  false),
        AUTHORS_AND_TITLES("commit list with authors and titles", true,  true);
        ...
    }
    

    I'll go out on a limb and say that it won't work out the box until the nested enum implements a databound constructor and also has a descriptor, sorry.

    I don't have the plugin but you can look at the XML for a real created job with the plugin and see what goes into this section. I suspect it is a nested structure

    You can try the job dsl google group - link to a post about the generic approach