Extend trigger_builds functionality

To support fan-out and conditional trigger behaviour with
Jenkins Parameterized Trigger Plugin add following attributes:

* Config for failTriggerOnMissing
* Parameter factories

Change-Id: I3755ed32779e64e7aee7a55a00c683edff6bbbd8
This commit is contained in:
Carl Loa Odin 2014-04-28 17:32:59 +02:00
parent 04139e0f5e
commit d78d0329f6
17 changed files with 521 additions and 3 deletions

View File

@ -262,6 +262,9 @@ def trigger_builds(parser, xml_parent, data):
key/value pairs to be passed to the job (optional)
:arg str property-file:
Pass properties from file to the other job (optional)
:arg bool property-file-fail-on-missing:
Don't trigger if any files are missing (optional)
(default true)
:arg bool current-parameters: Whether to include the
parameters passed to the current build to the
triggered job.
@ -271,11 +274,45 @@ def trigger_builds(parser, xml_parent, data):
to finish or not (default false)
:arg bool same-node: Use the same node for the triggered builds that was
used for this build (optional)
:arg list parameter-factories: list of parameter factories
Example:
:Factory: * **factory** (`str`) **filebuild** -- For every property file,
invoke one build
* **file-pattern** (`str`) -- File wildcard pattern
* **no-files-found-action** (`str`) -- Action to perform when
no files found (optional) ['FAIL', 'SKIP', 'NOPARMS']
(default 'SKIP')
:Factory: * **factory** (`str`) **binaryfile** -- For every matching
file, invoke one build
* **file-pattern** (`str`) -- Artifact ID of the artifact
* **no-files-found-action** (`str`) -- Action to perform when
no files found (optional) ['FAIL', 'SKIP', 'NOPARMS']
(default 'SKIP')
:Factory: * **factory** (`str`) **counterbuild** -- Invoke i=0...N builds
* **from** (`int`) -- Artifact ID of the artifact
* **to** (`int`) -- Version of the artifact
* **step** (`int`) -- Classifier of the artifact
* **parameters** (`str`) -- KEY=value pairs, one per line
(default '')
* **validation-fail** (`str`) -- Action to perform when
stepping validation fails (optional)
['FAIL', 'SKIP', 'NOPARMS']
(default 'FAIL')
Examples:
Basic usage.
.. literalinclude:: /../../tests/builders/fixtures/trigger-builds001.yaml
:language: yaml
Example with all supported parameter factories.
.. literalinclude:: \
/../../tests/builders/fixtures/trigger-builds-configfactory-multi.yaml
:language: yaml
"""
tbuilder = XML.SubElement(xml_parent,
'hudson.plugins.parameterizedtrigger.'
@ -307,8 +344,11 @@ def trigger_builds(parser, xml_parent, data):
'FileBuildParameters')
propertiesFile = XML.SubElement(params, 'propertiesFile')
propertiesFile.text = project_def['property-file']
failOnMissing = XML.SubElement(params, 'failTriggerOnMissing')
failOnMissing.text = 'true'
failTriggerOnMissing = XML.SubElement(params,
'failTriggerOnMissing')
failTriggerOnMissing.text = str(project_def.get(
'property-file-fail-on-missing', True)).lower()
if 'predefined-parameters' in project_def:
params = XML.SubElement(tconfigs,
'hudson.plugins.parameterizedtrigger.'
@ -317,6 +357,67 @@ def trigger_builds(parser, xml_parent, data):
properties.text = project_def['predefined-parameters']
if(len(list(tconfigs)) == 0):
tconfigs.set('class', 'java.util.Collections$EmptyList')
if 'parameter-factories' in project_def:
fconfigs = XML.SubElement(tconfig, 'configFactories')
supported_factories = ['filebuild', 'binaryfile', 'counterbuild']
supported_actions = ['SKIP', 'NOPARMS', 'FAIL']
for factory in project_def['parameter-factories']:
if factory['factory'] not in supported_factories:
raise JenkinsJobsException("factory must be one of %s" %
", ".join(supported_factories))
if factory['factory'] == 'filebuild':
params = XML.SubElement(
fconfigs,
'hudson.plugins.parameterizedtrigger.'
'FileBuildParameterFactory')
if factory['factory'] == 'binaryfile':
params = XML.SubElement(
fconfigs,
'hudson.plugins.parameterizedtrigger.'
'BinaryFileParameterFactory')
parameterName = XML.SubElement(params, 'parameterName')
parameterName.text = factory['parameter-name']
if (factory['factory'] == 'filebuild' or
factory['factory'] == 'binaryfile'):
filePattern = XML.SubElement(params, 'filePattern')
filePattern.text = factory['file-pattern']
noFilesFoundAction = XML.SubElement(
params,
'noFilesFoundAction')
noFilesFoundActionValue = str(factory.get(
'no-files-found-action', 'SKIP'))
if noFilesFoundActionValue not in supported_actions:
raise JenkinsJobsException(
"no-files-found-action must be one of %s" %
", ".join(supported_actions))
noFilesFoundAction.text = noFilesFoundActionValue
if factory['factory'] == 'counterbuild':
params = XML.SubElement(
fconfigs,
'hudson.plugins.parameterizedtrigger.'
'CounterBuildParameterFactory')
fromProperty = XML.SubElement(params, 'from')
fromProperty.text = str(factory['from'])
toProperty = XML.SubElement(params, 'to')
toProperty.text = str(factory['to'])
stepProperty = XML.SubElement(params, 'step')
stepProperty.text = str(factory['step'])
paramExpr = XML.SubElement(params, 'paramExpr')
paramExpr.text = str(factory.get(
'parameters', ''))
validationFail = XML.SubElement(params, 'validationFail')
validationFailValue = str(factory.get(
'validation-fail', 'FAIL'))
if validationFailValue not in supported_actions:
raise JenkinsJobsException(
"validation-fail action must be one of %s" %
", ".join(supported_actions))
validationFail.text = validationFailValue
projects = XML.SubElement(tconfig, 'projects')
projects.text = project_def['project']
condition = XML.SubElement(tconfig, 'condition')

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<project>
<builders>
<hudson.plugins.parameterizedtrigger.TriggerBuilder>
<configs>
<hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig>
<configs class="java.util.Collections$EmptyList"/>
<configFactories>
<hudson.plugins.parameterizedtrigger.BinaryFileParameterFactory>
<parameterName>filename</parameterName>
<filePattern>propfile*.txt</filePattern>
<noFilesFoundAction>FAIL</noFilesFoundAction>
</hudson.plugins.parameterizedtrigger.BinaryFileParameterFactory>
</configFactories>
<projects>build_started</projects>
<condition>ALWAYS</condition>
<triggerWithNoParameters>false</triggerWithNoParameters>
<buildAllNodesWithLabel>false</buildAllNodesWithLabel>
<block>
<buildStepFailureThreshold>
<name>FAILURE</name>
<ordinal>2</ordinal>
<color>RED</color>
</buildStepFailureThreshold>
<unstableThreshold>
<name>UNSTABLE</name>
<ordinal>1</ordinal>
<color>YELLOW</color>
</unstableThreshold>
<failureThreshold>
<name>FAILURE</name>
<ordinal>2</ordinal>
<color>RED</color>
</failureThreshold>
</block>
</hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig>
</configs>
</hudson.plugins.parameterizedtrigger.TriggerBuilder>
</builders>
</project>

View File

@ -0,0 +1,9 @@
builders:
- trigger-builds:
- project: "build_started"
parameter-factories:
- factory: binaryfile
parameter-name: filename
file-pattern: propfile*.txt
no-files-found-action: FAIL
block: true

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<project>
<builders>
<hudson.plugins.parameterizedtrigger.TriggerBuilder>
<configs>
<hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig>
<configs class="java.util.Collections$EmptyList"/>
<configFactories>
<hudson.plugins.parameterizedtrigger.BinaryFileParameterFactory>
<parameterName>filename</parameterName>
<filePattern>propfile*.txt</filePattern>
<noFilesFoundAction>SKIP</noFilesFoundAction>
</hudson.plugins.parameterizedtrigger.BinaryFileParameterFactory>
</configFactories>
<projects>build_started</projects>
<condition>ALWAYS</condition>
<triggerWithNoParameters>false</triggerWithNoParameters>
<buildAllNodesWithLabel>false</buildAllNodesWithLabel>
<block>
<buildStepFailureThreshold>
<name>FAILURE</name>
<ordinal>2</ordinal>
<color>RED</color>
</buildStepFailureThreshold>
<unstableThreshold>
<name>UNSTABLE</name>
<ordinal>1</ordinal>
<color>YELLOW</color>
</unstableThreshold>
<failureThreshold>
<name>FAILURE</name>
<ordinal>2</ordinal>
<color>RED</color>
</failureThreshold>
</block>
</hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig>
</configs>
</hudson.plugins.parameterizedtrigger.TriggerBuilder>
</builders>
</project>

View File

@ -0,0 +1,8 @@
builders:
- trigger-builds:
- project: "build_started"
parameter-factories:
- factory: binaryfile
parameter-name: filename
file-pattern: propfile*.txt
block: true

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<project>
<builders>
<hudson.plugins.parameterizedtrigger.TriggerBuilder>
<configs>
<hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig>
<configs class="java.util.Collections$EmptyList"/>
<configFactories>
<hudson.plugins.parameterizedtrigger.CounterBuildParameterFactory>
<from>0</from>
<to>5</to>
<step>1</step>
<paramExpr>EXAMPLE=NICE
HELLO=WORLD
</paramExpr>
<validationFail>SKIP</validationFail>
</hudson.plugins.parameterizedtrigger.CounterBuildParameterFactory>
</configFactories>
<projects>build_started</projects>
<condition>ALWAYS</condition>
<triggerWithNoParameters>false</triggerWithNoParameters>
<buildAllNodesWithLabel>false</buildAllNodesWithLabel>
<block>
<buildStepFailureThreshold>
<name>FAILURE</name>
<ordinal>2</ordinal>
<color>RED</color>
</buildStepFailureThreshold>
<unstableThreshold>
<name>UNSTABLE</name>
<ordinal>1</ordinal>
<color>YELLOW</color>
</unstableThreshold>
<failureThreshold>
<name>FAILURE</name>
<ordinal>2</ordinal>
<color>RED</color>
</failureThreshold>
</block>
</hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig>
</configs>
</hudson.plugins.parameterizedtrigger.TriggerBuilder>
</builders>
</project>

View File

@ -0,0 +1,13 @@
builders:
- trigger-builds:
- project: "build_started"
parameter-factories:
- factory: counterbuild
from: 0
to: 5
step: 1
validation-fail: SKIP
parameters: |
EXAMPLE=NICE
HELLO=WORLD
block: true

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<project>
<builders>
<hudson.plugins.parameterizedtrigger.TriggerBuilder>
<configs>
<hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig>
<configs class="java.util.Collections$EmptyList"/>
<configFactories>
<hudson.plugins.parameterizedtrigger.CounterBuildParameterFactory>
<from>0</from>
<to>5</to>
<step>1</step>
<paramExpr/>
<validationFail>FAIL</validationFail>
</hudson.plugins.parameterizedtrigger.CounterBuildParameterFactory>
</configFactories>
<projects>build_started</projects>
<condition>ALWAYS</condition>
<triggerWithNoParameters>false</triggerWithNoParameters>
<buildAllNodesWithLabel>false</buildAllNodesWithLabel>
<block>
<buildStepFailureThreshold>
<name>FAILURE</name>
<ordinal>2</ordinal>
<color>RED</color>
</buildStepFailureThreshold>
<unstableThreshold>
<name>UNSTABLE</name>
<ordinal>1</ordinal>
<color>YELLOW</color>
</unstableThreshold>
<failureThreshold>
<name>FAILURE</name>
<ordinal>2</ordinal>
<color>RED</color>
</failureThreshold>
</block>
</hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig>
</configs>
</hudson.plugins.parameterizedtrigger.TriggerBuilder>
</builders>
</project>

View File

@ -0,0 +1,9 @@
builders:
- trigger-builds:
- project: "build_started"
parameter-factories:
- factory: counterbuild
from: 0
to: 5
step: 1
block: true

View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<project>
<builders>
<hudson.plugins.parameterizedtrigger.TriggerBuilder>
<configs>
<hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig>
<configs class="java.util.Collections$EmptyList"/>
<configFactories>
<hudson.plugins.parameterizedtrigger.FileBuildParameterFactory>
<filePattern>propfile*.txt</filePattern>
<noFilesFoundAction>NOPARMS</noFilesFoundAction>
</hudson.plugins.parameterizedtrigger.FileBuildParameterFactory>
</configFactories>
<projects>build_started</projects>
<condition>ALWAYS</condition>
<triggerWithNoParameters>false</triggerWithNoParameters>
<buildAllNodesWithLabel>false</buildAllNodesWithLabel>
<block>
<buildStepFailureThreshold>
<name>FAILURE</name>
<ordinal>2</ordinal>
<color>RED</color>
</buildStepFailureThreshold>
<unstableThreshold>
<name>UNSTABLE</name>
<ordinal>1</ordinal>
<color>YELLOW</color>
</unstableThreshold>
<failureThreshold>
<name>FAILURE</name>
<ordinal>2</ordinal>
<color>RED</color>
</failureThreshold>
</block>
</hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig>
</configs>
</hudson.plugins.parameterizedtrigger.TriggerBuilder>
</builders>
</project>

View File

@ -0,0 +1,8 @@
builders:
- trigger-builds:
- project: "build_started"
parameter-factories:
- factory: filebuild
file-pattern: propfile*.txt
no-files-found-action: NOPARMS
block: true

View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<project>
<builders>
<hudson.plugins.parameterizedtrigger.TriggerBuilder>
<configs>
<hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig>
<configs class="java.util.Collections$EmptyList"/>
<configFactories>
<hudson.plugins.parameterizedtrigger.FileBuildParameterFactory>
<filePattern>propfile*.txt</filePattern>
<noFilesFoundAction>SKIP</noFilesFoundAction>
</hudson.plugins.parameterizedtrigger.FileBuildParameterFactory>
</configFactories>
<projects>build_started</projects>
<condition>ALWAYS</condition>
<triggerWithNoParameters>false</triggerWithNoParameters>
<buildAllNodesWithLabel>false</buildAllNodesWithLabel>
<block>
<buildStepFailureThreshold>
<name>FAILURE</name>
<ordinal>2</ordinal>
<color>RED</color>
</buildStepFailureThreshold>
<unstableThreshold>
<name>UNSTABLE</name>
<ordinal>1</ordinal>
<color>YELLOW</color>
</unstableThreshold>
<failureThreshold>
<name>FAILURE</name>
<ordinal>2</ordinal>
<color>RED</color>
</failureThreshold>
</block>
</hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig>
</configs>
</hudson.plugins.parameterizedtrigger.TriggerBuilder>
</builders>
</project>

View File

@ -0,0 +1,7 @@
builders:
- trigger-builds:
- project: "build_started"
parameter-factories:
- factory: filebuild
file-pattern: propfile*.txt
block: true

View File

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<project>
<builders>
<hudson.plugins.parameterizedtrigger.TriggerBuilder>
<configs>
<hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig>
<configs>
<hudson.plugins.parameterizedtrigger.CurrentBuildParameters/>
<hudson.plugins.parameterizedtrigger.SubversionRevisionBuildParameters/>
<hudson.plugins.parameterizedtrigger.PredefinedBuildParameters>
<properties>FOO=&quot;bar&quot;</properties>
</hudson.plugins.parameterizedtrigger.PredefinedBuildParameters>
</configs>
<configFactories>
<hudson.plugins.parameterizedtrigger.FileBuildParameterFactory>
<filePattern>propfile*.txt</filePattern>
<noFilesFoundAction>SKIP</noFilesFoundAction>
</hudson.plugins.parameterizedtrigger.FileBuildParameterFactory>
<hudson.plugins.parameterizedtrigger.BinaryFileParameterFactory>
<parameterName>filename</parameterName>
<filePattern>otherpropfile*.txt</filePattern>
<noFilesFoundAction>SKIP</noFilesFoundAction>
</hudson.plugins.parameterizedtrigger.BinaryFileParameterFactory>
<hudson.plugins.parameterizedtrigger.CounterBuildParameterFactory>
<from>0</from>
<to>5</to>
<step>1</step>
<paramExpr/>
<validationFail>FAIL</validationFail>
</hudson.plugins.parameterizedtrigger.CounterBuildParameterFactory>
</configFactories>
<projects>build_started</projects>
<condition>ALWAYS</condition>
<triggerWithNoParameters>false</triggerWithNoParameters>
<buildAllNodesWithLabel>false</buildAllNodesWithLabel>
<block>
<buildStepFailureThreshold>
<name>FAILURE</name>
<ordinal>2</ordinal>
<color>RED</color>
</buildStepFailureThreshold>
<unstableThreshold>
<name>UNSTABLE</name>
<ordinal>1</ordinal>
<color>YELLOW</color>
</unstableThreshold>
<failureThreshold>
<name>FAILURE</name>
<ordinal>2</ordinal>
<color>RED</color>
</failureThreshold>
</block>
</hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig>
</configs>
</hudson.plugins.parameterizedtrigger.TriggerBuilder>
</builders>
</project>

View File

@ -0,0 +1,18 @@
builders:
- trigger-builds:
- project: "build_started"
predefined-parameters:
FOO="bar"
current-parameters: true
svn-revision: true
parameter-factories:
- factory: filebuild
file-pattern: propfile*.txt
- factory: binaryfile
parameter-name: filename
file-pattern: otherpropfile*.txt
- factory: counterbuild
from: 0
to: 5
step: 1
block: true

View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<project>
<builders>
<hudson.plugins.parameterizedtrigger.TriggerBuilder>
<configs>
<hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig>
<configs>
<hudson.plugins.parameterizedtrigger.FileBuildParameters>
<propertiesFile>propfile.txt</propertiesFile>
<failTriggerOnMissing>false</failTriggerOnMissing>
</hudson.plugins.parameterizedtrigger.FileBuildParameters>
</configs>
<projects>build_started</projects>
<condition>ALWAYS</condition>
<triggerWithNoParameters>false</triggerWithNoParameters>
<buildAllNodesWithLabel>false</buildAllNodesWithLabel>
<block>
<buildStepFailureThreshold>
<name>FAILURE</name>
<ordinal>2</ordinal>
<color>RED</color>
</buildStepFailureThreshold>
<unstableThreshold>
<name>UNSTABLE</name>
<ordinal>1</ordinal>
<color>YELLOW</color>
</unstableThreshold>
<failureThreshold>
<name>FAILURE</name>
<ordinal>2</ordinal>
<color>RED</color>
</failureThreshold>
</block>
</hudson.plugins.parameterizedtrigger.BlockableBuildTriggerConfig>
</configs>
</hudson.plugins.parameterizedtrigger.TriggerBuilder>
</builders>
</project>

View File

@ -0,0 +1,6 @@
builders:
- trigger-builds:
- project: "build_started"
property-file: propfile.txt
property-file-fail-on-missing: false
block: true