diff --git a/docs/The-Configure-Block.md b/docs/The-Configure-Block.md index c6f2a4c10..7d4c76931 100644 --- a/docs/The-Configure-Block.md +++ b/docs/The-Configure-Block.md @@ -851,6 +851,22 @@ job('example') { } ``` +## Configure Post Build Task Publisher with multiply conditions +DSL: +```groovy +job('example') { + publishers { + def conditions = [ + ['Build was aborted', 'AND'], + ['Simulation.*started', 'AND'] + ] + postBuildTaskChainConditions { + task(conditions, 'git clean -fdx') + } + } +} +``` + ## Configure Post Build Sonar Task In order to trigger a Sonar analysis as a Post Build Task in your job you can use the following code. diff --git a/job-dsl-core/src/main/groovy/javaposse/jobdsl/dsl/helpers/publisher/PostBuildTaskMultiplyContext.groovy b/job-dsl-core/src/main/groovy/javaposse/jobdsl/dsl/helpers/publisher/PostBuildTaskMultiplyContext.groovy new file mode 100644 index 000000000..bc2980efb --- /dev/null +++ b/job-dsl-core/src/main/groovy/javaposse/jobdsl/dsl/helpers/publisher/PostBuildTaskMultiplyContext.groovy @@ -0,0 +1,33 @@ +package javaposse.jobdsl.dsl.helpers.publisher + +import groovy.transform.Canonical +import javaposse.jobdsl.dsl.Context +import javaposse.jobdsl.dsl.Preconditions + +class PostBuildTaskMultiplyContext implements Context { + List tasks = [] + + /** + * Adds a script that will be executed if the output in the console log matches the regular expression. Can be + * called multiple times to add more scripts. + */ + void task(List conditions, String script, boolean escalate = false, + boolean runIfSuccessful = false) { + Preconditions.checkNotNullOrEmpty(script, 'Script to run is required!') + + tasks << new PostBuildTask( + conditions: conditions, + script: script, + escalateStatus: escalate, + runIfJobSuccessful: runIfSuccessful + ) + } + + @Canonical + static class PostBuildTask { + List conditions + String script + boolean escalateStatus + boolean runIfJobSuccessful + } +} diff --git a/job-dsl-core/src/main/groovy/javaposse/jobdsl/dsl/helpers/publisher/PublisherContext.groovy b/job-dsl-core/src/main/groovy/javaposse/jobdsl/dsl/helpers/publisher/PublisherContext.groovy index 53d78f26b..253cabe82 100644 --- a/job-dsl-core/src/main/groovy/javaposse/jobdsl/dsl/helpers/publisher/PublisherContext.groovy +++ b/job-dsl-core/src/main/groovy/javaposse/jobdsl/dsl/helpers/publisher/PublisherContext.groovy @@ -746,6 +746,37 @@ class PublisherContext extends AbstractExtensibleContext { } } + /** + * Searches with a few conditions for a regular expression in the console log and, if matched, executes a script. + * + * @since 1.19 + */ + @RequiresPlugin(id = 'postbuild-task') + void postBuildTaskMultiplyConditions(@DslContext(PostBuildTaskMultiplyContext) Closure postBuildClosure) { + PostBuildTaskMultiplyContext postBuildContext = new PostBuildTaskMultiplyContext() + ContextHelper.executeInContext(postBuildClosure, postBuildContext) + + publisherNodes << new NodeBuilder().'hudson.plugins.postbuildtask.PostbuildTask' { + tasks { + postBuildContext.tasks.each { PostBuildTaskMultiplyContext.PostBuildTask task -> + 'hudson.plugins.postbuildtask.TaskProperties' { + logTexts { + task.conditions.each { conditionMap -> + 'hudson.plugins.postbuildtask.LogProperties' { + logText(conditionMap[0]) + operator(conditionMap[1]) + } + } + } + EscalateStatus(task.escalateStatus) + RunIfJobSuccessful(task.runIfJobSuccessful) + script(task.script) + } + } + } + } + } + /** * Aggregates downstream test results. * diff --git a/job-dsl-core/src/test/groovy/javaposse/jobdsl/dsl/helpers/publisher/PublisherContextSpec.groovy b/job-dsl-core/src/test/groovy/javaposse/jobdsl/dsl/helpers/publisher/PublisherContextSpec.groovy index 785397272..1c1b2d230 100644 --- a/job-dsl-core/src/test/groovy/javaposse/jobdsl/dsl/helpers/publisher/PublisherContextSpec.groovy +++ b/job-dsl-core/src/test/groovy/javaposse/jobdsl/dsl/helpers/publisher/PublisherContextSpec.groovy @@ -2028,6 +2028,31 @@ class PublisherContextSpec extends Specification { 1 * jobManagement.requirePlugin('postbuild-task') } + def 'call postBuildTaskChain with two conditions'() { + def conditions = [ + ['Build was aborted', 'AND'], + ['Simulation.*started', 'AND'] + ] + when: + context.postBuildTaskMultiplyConditions { + task(conditions, 'git clean -fdx') + } + + then: + context.publisherNodes.size() == 1 + context.publisherNodes[0].name() == 'hudson.plugins.postbuildtask.PostbuildTask' + with(context.publisherNodes[0].tasks[0].'hudson.plugins.postbuildtask.TaskProperties'[0]) { + logTexts[0].'hudson.plugins.postbuildtask.LogProperties'[0].logText[0].value() == 'Build was aborted' + logTexts[0].'hudson.plugins.postbuildtask.LogProperties'[0].operator[0].value() == 'AND' + logTexts[0].'hudson.plugins.postbuildtask.LogProperties'[1].logText[0].value() == 'Simulation.*started' + logTexts[0].'hudson.plugins.postbuildtask.LogProperties'[1].operator[0].value() == 'AND' + EscalateStatus[0].value() == false + RunIfJobSuccessful[0].value() == false + script[0].value() == 'git clean -fdx' + } + 1 * jobManagement.requirePlugin('postbuild-task') + } + def 'call postBuildTask with two tasks'() { when: context.postBuildTask {