diff --git a/jenkins_jobs/modules/general.py b/jenkins_jobs/modules/general.py index 51953a269..36bdf8e3e 100644 --- a/jenkins_jobs/modules/general.py +++ b/jenkins_jobs/modules/general.py @@ -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 diff --git a/jenkins_jobs/modules/project_workflow.py b/jenkins_jobs/modules/project_workflow.py new file mode 100644 index 000000000..09d026216 --- /dev/null +++ b/jenkins_jobs/modules/project_workflow.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2015 David Caro +# +# Based on jenkins_jobs/modules/project_flow.py by +# Copyright (C) 2013 eNovance SAS +# +# 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 `. + +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 diff --git a/setup.cfg b/setup.cfg index 0e29c19fe..8a0f60c35 100644 --- a/setup.cfg +++ b/setup.cfg @@ -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 diff --git a/tests/yamlparser/fixtures/project_workflow_template001.xml b/tests/yamlparser/fixtures/project_workflow_template001.xml new file mode 100644 index 000000000..f82dbe506 --- /dev/null +++ b/tests/yamlparser/fixtures/project_workflow_template001.xml @@ -0,0 +1,25 @@ + + + + + false + + + <!-- Managed by Jenkins Job Builder --> + false + false + false + false + true + + + + + diff --git a/tests/yamlparser/fixtures/project_workflow_template001.yaml b/tests/yamlparser/fixtures/project_workflow_template001.yaml new file mode 100644 index 000000000..c0cc57089 --- /dev/null +++ b/tests/yamlparser/fixtures/project_workflow_template001.yaml @@ -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!" + } + ] diff --git a/tests/yamlparser/fixtures/project_workflow_template002.xml b/tests/yamlparser/fixtures/project_workflow_template002.xml new file mode 100644 index 000000000..f92286df8 --- /dev/null +++ b/tests/yamlparser/fixtures/project_workflow_template002.xml @@ -0,0 +1,25 @@ + + + + + false + + + <!-- Managed by Jenkins Job Builder --> + false + false + false + false + true + + + + + diff --git a/tests/yamlparser/fixtures/project_workflow_template002.yaml b/tests/yamlparser/fixtures/project_workflow_template002.yaml new file mode 100644 index 000000000..2f33ba52f --- /dev/null +++ b/tests/yamlparser/fixtures/project_workflow_template002.yaml @@ -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' diff --git a/tests/yamlparser/fixtures/project_workflow_template003.xml b/tests/yamlparser/fixtures/project_workflow_template003.xml new file mode 100644 index 000000000..8274d6a0f --- /dev/null +++ b/tests/yamlparser/fixtures/project_workflow_template003.xml @@ -0,0 +1,25 @@ + + + + + true + + + <!-- Managed by Jenkins Job Builder --> + false + false + false + false + true + + + + + diff --git a/tests/yamlparser/fixtures/project_workflow_template003.yaml b/tests/yamlparser/fixtures/project_workflow_template003.yaml new file mode 100644 index 000000000..4b43208e3 --- /dev/null +++ b/tests/yamlparser/fixtures/project_workflow_template003.yaml @@ -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'