Skip to content

Commit

Permalink
Adding parameterized downstream jobs
Browse files Browse the repository at this point in the history
  • Loading branch information
Justin Ryan committed Dec 28, 2012
1 parent 0d75e8f commit 95a45d7
Show file tree
Hide file tree
Showing 2 changed files with 203 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@ class PublisherContextHelper extends AbstractContextHelper<PublisherContext> {
</entries>
</be.certipost.hudson.plugin.SCPRepositoryPublisher>
*/
def publishScp(String site, Closure scpClosure = null) {
def publishScp(String site, Closure scpClosure) {
ScpContext scpContext = new ScpContext()
AbstractContextHelper.executeInContext(scpClosure, scpContext)

Expand Down Expand Up @@ -379,14 +379,151 @@ class PublisherContextHelper extends AbstractContextHelper<PublisherContext> {
<hudson.plugins.parameterizedtrigger.BuildTriggerConfig>
<configs class="java.util.Collections$EmptyList"/>
<projects>DSL-Tutorial-1-Test</projects>
<condition>SUCCESS</condition> // SUCCESS, UNSTABLE, UNSTABLE_OR_BETTER, UNSTABLE_OR_WORSE, FAILED,
<condition>SUCCESS</condition> // SUCCESS, UNSTABLE, UNSTABLE_OR_BETTER, UNSTABLE_OR_WORSE, FAILED
<triggerWithNoParameters>false</triggerWithNoParameters>
</hudson.plugins.parameterizedtrigger.BuildTriggerConfig>
</configs>
</hudson.plugins.parameterizedtrigger.BuildTrigger>
*/
def downstreamParameterized(Closure downstreamClosure) {
DownstreamContext downstreamContext = new DownstreamContext()
AbstractContextHelper.executeInContext(downstreamClosure, downstreamContext)

def nodeBuilder = NodeBuilder.newInstance()
def publishNode = nodeBuilder.'hudson.plugins.parameterizedtrigger.BuildTrigger' {
configs {
downstreamContext.triggers.each { DownstreamTriggerContext trigger ->
'hudson.plugins.parameterizedtrigger.BuildTriggerConfig' {
projects trigger.projects
condition trigger.condition
triggerWithNoParameters trigger.triggerWithNoParameters?'true':'false'
if (trigger.hasParameter() ) {
configs {
if (trigger.usingCurrentBuild) {
'hudson.plugins.parameterizedtrigger.CurrentBuildParameters' ''
}

if (trigger.usingPropertiesFile) {
'hudson.plugins.parameterizedtrigger.FileBuildParameters' {
propertiesFile trigger.propFile
}
}

if (trigger.usingGitRevision) {
'hudson.plugins.git.GitRevisionBuildParameters' {
'combineQueuedCommits' trigger.combineQueuedCommits?'true':'false'
}
}

if (trigger.usingPredefined) {
'hudson.plugins.parameterizedtrigger.PredefinedBuildParameters' {
delegate.createNode('properties', trigger.predefinedProps.join('\n'))
}
}

if (trigger.usingMatrixSubset) {
'hudson.plugins.parameterizedtrigger.matrix.MatrixSubsetBuildParameters' {
filter trigger.matrixSubsetFilter
}
}

if (trigger.usingSubversionRevision) {
'hudson.plugins.parameterizedtrigger.SubversionRevisionBuildParameters' {}
}
}
} else {
configs('class':'java.util.Collections$EmptyList')
}
}
}
}
}
publisherNodes << publishNode

}
}

static class DownstreamContext implements Context {
private List<DownstreamTriggerContext> triggers = []
def trigger(String projects, Closure downstreamTriggerClosure = null) {
trigger(projects, null, downstreamTriggerClosure)
}

def trigger(String projects, String condition, Closure downstreamTriggerClosure = null) {
trigger(projects, condition, false, downstreamTriggerClosure)
}

def trigger(String projects, String condition, boolean triggerWithNoParameters, Closure downstreamTriggerClosure = null) {
DownstreamTriggerContext downstreamTriggerContext = new DownstreamTriggerContext()
downstreamTriggerContext.projects = projects
downstreamTriggerContext.condition = condition?:'SUCCESS'
downstreamTriggerContext.triggerWithNoParameters = triggerWithNoParameters
AbstractContextHelper.executeInContext(downstreamTriggerClosure, downstreamTriggerContext)

// Validate this trigger
assert validDownstreamConditionNames.contains(downstreamTriggerContext.condition), "Trigger condition has to be one of these values: ${validDownstreamConditionNames.join(',')}"

triggers << downstreamTriggerContext
}
def validDownstreamConditionNames = ['SUCCESS', 'UNSTABLE', 'UNSTABLE_OR_BETTER', 'UNSTABLE_OR_WORSE', 'FAILED']
}

static class DownstreamTriggerContext implements Context {
String projects
String condition
boolean triggerWithNoParameters

boolean usingCurrentBuild = false
def currentBuild() {
usingCurrentBuild = true
}

boolean usingPropertiesFile = false
String propFile
def propertiesFile(String propFile) {
usingPropertiesFile = true
this.propFile = propFile
}

boolean usingGitRevision = false
boolean combineQueuedCommits = false
def gitRevision(boolean combineQueuedCommits = false) {
usingGitRevision = true
this.combineQueuedCommits = combineQueuedCommits
}

boolean usingPredefined = false
List<String> predefinedProps = []
def predefinedProp(String key, String value) {
usingPredefined = true
this.predefinedProps << "${key}=${value}"
}

def predefinedProps(Map<String, String> predefinedPropsMap) {
usingPredefined = true
def props = predefinedPropsMap.collect { "${it.key}=${it.value}"}
this.predefinedProps.addAll(props)
}

def predefinedProps(String predefinedProps) { // Newline separated
usingPredefined = true
this.predefinedProps.addAll(predefinedProps.split('\n'))
}

boolean usingMatrixSubset = false
String matrixSubsetFilter
def matrixSubset(String groovyFilter) {
usingMatrixSubset = true
matrixSubsetFilter = groovyFilter
}

boolean usingSubversionRevision = false
def subversionRevision() {
usingSubversionRevision = true
}

boolean hasParameter() {
return usingCurrentBuild || usingGitRevision || usingMatrixSubset || usingPredefined || usingPropertiesFile || usingSubversionRevision
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ public class PublisherHelperSpec extends Specification {

def 'call scp publish with not enough entries'() {
when:
context.publishScp('javadoc')
context.publishScp('javadoc', null)

then:
thrown(AssertionError)
Expand Down Expand Up @@ -358,6 +358,69 @@ public class PublisherHelperSpec extends Specification {
thrown(AssertionError)
}

def 'call downstream ext with all args'() {
when:
context.downstreamParameterized {
trigger('Project1, Project2', 'UNSTABLE_OR_BETTER', true) {
currentBuild() // Current build parameters
propertiesFile('dir/my.properties') // Parameters from properties file
gitRevision(false) // Pass-through Git commit that was built
predefinedProp('key1', 'value1') // Predefined properties
predefinedProps([key2: 'value2', key3: 'value3'])
predefinedProps('key4=value4\nkey5=value5') // Newline separated
matrixSubset('label=="${TARGET}"') // Restrict matrix execution to a subset
subversionRevision() // Subversion Revision
}
trigger('Project2') {
currentBuild()
}
}

then:
Node publisherNode = context.publisherNodes[0]
publisherNode.name() == 'hudson.plugins.parameterizedtrigger.BuildTrigger'
publisherNode.configs[0].children().size() == 2
Node first = publisherNode.configs[0].'hudson.plugins.parameterizedtrigger.BuildTriggerConfig'[0]
first.projects[0].value() == 'Project1, Project2'
first.condition[0].value() == 'UNSTABLE_OR_BETTER'
first.triggerWithNoParameters[0].value() == 'true'
first.configs[0].'hudson.plugins.parameterizedtrigger.CurrentBuildParameters'[0] instanceof Node
first.configs[0].'hudson.plugins.parameterizedtrigger.FileBuildParameters'[0].propertiesFile[0].value() == 'dir/my.properties'
first.configs[0].'hudson.plugins.git.GitRevisionBuildParameters'[0].combineQueuedCommits[0].value() == 'false'
first.configs[0].'hudson.plugins.parameterizedtrigger.PredefinedBuildParameters'.size() == 1
first.configs[0].'hudson.plugins.parameterizedtrigger.PredefinedBuildParameters'[0].'properties'[0].value() ==
'key1=value1\nkey2=value2\nkey3=value3\nkey4=value4\nkey5=value5'
first.configs[0].'hudson.plugins.parameterizedtrigger.matrix.MatrixSubsetBuildParameters'[0].filter[0].value() == 'label=="${TARGET}"'
first.configs[0].'hudson.plugins.parameterizedtrigger.SubversionRevisionBuildParameters'[0] instanceof Node

Node second = publisherNode.configs[0].'hudson.plugins.parameterizedtrigger.BuildTriggerConfig'[1]
second.projects[0].value() == 'Project2'
second.condition[0].value() == 'SUCCESS'
second.triggerWithNoParameters[0].value() == 'false'
second.configs[0].'hudson.plugins.parameterizedtrigger.CurrentBuildParameters'[0] instanceof Node

when:
context.downstreamParameterized {
trigger('Project3') {
}
}

then:
Node third = context.publisherNodes[1].configs[0].'hudson.plugins.parameterizedtrigger.BuildTriggerConfig'[0]
third.projects[0].value() == 'Project3'
third.condition[0].value() == 'SUCCESS'
third.triggerWithNoParameters[0].value() == 'false'
third.configs[0].attribute('class') == 'java.util.Collections$EmptyList'

when:
context.downstreamParameterized {
trigger('Project4', 'WRONG')
}

then:
thrown(AssertionError)
}

def 'call step via helper'() {
when:
helper.publishers {
Expand Down

0 comments on commit 95a45d7

Please sign in to comment.