Added support for the workflow job type

There's a relatively new workflow plugin, based on the old build flow
one

Change-Id: I5541443e15335839754afee59f1b74ed29ce6676
Signed-off-by: David Caro <dcaroest@redhat.com>
This commit is contained in:
David Caro 2015-11-20 17:31:52 +01:00
parent 294dea66b2
commit 9477275592
9 changed files with 207 additions and 2 deletions

View File

@ -21,8 +21,8 @@ Example:
:Job Parameters:
* **project-type**:
Defaults to "freestyle", but "maven" as well as "multijob", "flow" or
"externaljob" can also be specified.
Defaults to "freestyle", but "maven" as well as "multijob", "flow",
"workflow" or "externaljob" can also be specified.
* **defaults**:
Specifies a set of :ref:`defaults` to use for this job, defaults to

View File

@ -0,0 +1,73 @@
# -*- coding: utf-8 -*-
# Copyright (C) 2015 David Caro <david@dcaro.es>
#
# Based on jenkins_jobs/modules/project_flow.py by
# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
The workflow Project module handles creating Jenkins workflow projects.
You may specify ``workflow`` in the ``project-type`` attribute of
the :ref:`Job` definition.
For now only inline scripts are supported.
Requires the Jenkins :jenkins-wiki:`Workflow Plugin <Workflow+Plugin>`.
In order to use it for job-template you have to escape the curly braces by
doubling them in the DSL: { -> {{ , otherwise it will be interpreted by the
python str.format() command.
:Job Parameters:
* **dsl** (`str`): The DSL content.
* **sandbox** (`bool`): If the script should run in a sandbox (default
false)
Job example:
.. literalinclude::
/../../tests/yamlparser/fixtures/project_workflow_template001.yaml
Job template example:
.. literalinclude::
/../../tests/yamlparser/fixtures/project_workflow_template002.yaml
"""
import xml.etree.ElementTree as XML
import jenkins_jobs.modules.base
from jenkins_jobs.errors import MissingAttributeError
class Workflow(jenkins_jobs.modules.base.Base):
sequence = 0
def root_xml(self, data):
xml_parent = XML.Element('flow-definition',
{'plugin': 'workflow-job'})
xml_definition = XML.SubElement(xml_parent, 'definition',
{'plugin': 'workflow-cps',
'class': 'org.jenkinsci.plugins.'
'workflow.cps.CpsFlowDefinition'})
try:
XML.SubElement(xml_definition, 'script').text = data['dsl']
except KeyError as e:
raise MissingAttributeError(e.arg[0])
needs_workspace = data.get('sandbox', False)
XML.SubElement(xml_definition, 'sandbox').text = str(
needs_workspace).lower()
return xml_parent

View File

@ -43,6 +43,7 @@ jenkins_jobs.projects =
matrix=jenkins_jobs.modules.project_matrix:Matrix
maven=jenkins_jobs.modules.project_maven:Maven
multijob=jenkins_jobs.modules.project_multijob:MultiJob
workflow=jenkins_jobs.modules.project_workflow:Workflow
jenkins_jobs.builders =
ant=jenkins_jobs.modules.builders:ant
artifact-resolver=jenkins_jobs.modules.builders:artifact_resolver

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<flow-definition plugin="workflow-job">
<definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps">
<script>build job: &quot;job1&quot;
parallel [
2a: build job: &quot;job2a&quot;,
2b: node &quot;dummynode&quot; {
sh &quot;echo I'm alive!&quot;
}
]
</script>
<sandbox>false</sandbox>
</definition>
<actions/>
<description>&lt;!-- Managed by Jenkins Job Builder --&gt;</description>
<keepDependencies>false</keepDependencies>
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<concurrentBuild>false</concurrentBuild>
<canRoam>true</canRoam>
<properties/>
<scm class="hudson.scm.NullSCM"/>
<publishers/>
<buildWrappers/>
</flow-definition>

View File

@ -0,0 +1,11 @@
- job:
name: test_job
project-type: workflow
dsl: |
build job: "job1"
parallel [
2a: build job: "job2a",
2b: node "dummynode" {
sh "echo I'm alive!"
}
]

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<flow-definition plugin="workflow-job">
<definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps">
<script>build job: &quot;job1&quot;
parallel [
2a: build job: &quot;job2a&quot;,
2b: node &quot;dummynode&quot; {
sh &quot;echo hello&quot;
}
]
</script>
<sandbox>false</sandbox>
</definition>
<actions/>
<description>&lt;!-- Managed by Jenkins Job Builder --&gt;</description>
<keepDependencies>false</keepDependencies>
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<concurrentBuild>false</concurrentBuild>
<canRoam>true</canRoam>
<properties/>
<scm class="hudson.scm.NullSCM"/>
<publishers/>
<buildWrappers/>
</flow-definition>

View File

@ -0,0 +1,22 @@
- job-template:
name: '{name}-unit-tests'
project-type: workflow
dsl: |
build job: "job1"
parallel [
2a: build job: "job2a",
2b: node "dummynode" {{
sh "echo {isay}"
}}
]
- job-group:
name: '{name}-tests'
jobs:
- '{name}-unit-tests':
isay: 'hello'
- project:
name: project-name
jobs:
- '{name}-tests'

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<flow-definition plugin="workflow-job">
<definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps">
<script>build job: &quot;job1&quot;
parallel [
2a: build job: &quot;job2a&quot;,
2b: node &quot;dummynode&quot; {
sh &quot;echo hello&quot;
}
]
</script>
<sandbox>true</sandbox>
</definition>
<actions/>
<description>&lt;!-- Managed by Jenkins Job Builder --&gt;</description>
<keepDependencies>false</keepDependencies>
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<concurrentBuild>false</concurrentBuild>
<canRoam>true</canRoam>
<properties/>
<scm class="hudson.scm.NullSCM"/>
<publishers/>
<buildWrappers/>
</flow-definition>

View File

@ -0,0 +1,23 @@
- job-template:
name: '{name}-unit-tests'
project-type: workflow
dsl: |
build job: "job1"
parallel [
2a: build job: "job2a",
2b: node "dummynode" {{
sh "echo {isay}"
}}
]
sandbox: true
- job-group:
name: '{name}-tests'
jobs:
- '{name}-unit-tests':
isay: 'hello'
- project:
name: project-name
jobs:
- '{name}-tests'