# Copyright 2012 Hewlett-Packard Development Company, L.P. # # 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 Maven Project module handles creating Maven Jenkins projects. To create a Maven project, specify ``maven`` in the ``project-type`` attribute to the :ref:`Job` definition. It also requires a ``maven`` section in the :ref:`Job` definition. :Job Parameters: * **root-module**: * **group-id** (`str`): GroupId. * **artifact-id** (`str`): ArtifactId. * **root-pom** (`str`): The path to the pom.xml file. (default 'pom.xml') * **goals** (`str`): Goals to execute. (required) * **maven-opts** (`str`): Java options to pass to maven (aka MAVEN_OPTS) * **maven-name** (`str`): Installation of maven which should be used. Not setting ``maven-name`` appears to use the first maven install defined in the global jenkins config. * **private-repository** ('str'): Whether to use a private maven repository Possible values are `default`, `local-to-workspace` and `local-to-executor`. * **ignore-upstream-changes** (`bool`): Do not start a build whenever a SNAPSHOT dependency is built or not. (default true) * **incremental-build** (`bool`): Activate incremental build - only build changed modules (default false). * **automatic-archiving** (`bool`): Activate automatic artifact archiving (default true). * **automatic-site-archiving** (`bool`): Activate automatic site documentation artifact archiving (default true). * **automatic-fingerprinting** (`bool`): Activate automatic fingerprinting of consumed and produced artifacts (default true). * **per-module-email** (`bool`): Send an e-mail for each failed module (default true). * **parallel-build-modules** (`bool`): Build modules in parallel (default false) * **resolve-dependencies** (`bool`): Resolve Dependencies during Pom parsing (default false). * **run-headless** (`bool`): Run headless (default false). * **disable-downstream** (`bool`): Disable triggering of downstream projects (default false). * **process-plugins** (`bool`): Process Plugins during Pom parsing (default false). * **custom-workspace** (`str`): Path to the custom workspace. If no path is provided, custom workspace is not used. (optional) * **settings** (`str`): Path to custom maven settings file. If settings type is 'file' then this is a Path. Otherwise it is the id for ConfigFileProvider. (optional) * **settings-type** (`str`): Type of settings file file|cfp. (default file) * **global-settings** (`str`): Path to custom maven global settings file. If settings type is 'file' then this is a Path. Otherwise it is the id for ConfigFileProvider. (optional) * **global-settings-type** (`str`): Type of settings file file|cfp. (default file) * **post-step-run-condition** (`str`): Run the post-build steps only if the build succeeds ('SUCCESS'), build succeeds or is unstable ('UNSTABLE'), regardless of build result ('FAILURE'). (default 'FAILURE'). Requires the Jenkins :jenkins-wiki:`Config File Provider Plugin ` for the Config File Provider "settings" and "global-settings" config. Example: .. literalinclude:: /../../tests/general/fixtures/project-maven001.yaml CFP Example: .. literalinclude:: /../../tests/general/fixtures/project-maven003.yaml """ import pkg_resources import xml.etree.ElementTree as XML from jenkins_jobs.errors import InvalidAttributeError import jenkins_jobs.modules.base import jenkins_jobs.modules.helpers as helpers from jenkins_jobs.modules import hudson_model class Maven(jenkins_jobs.modules.base.Base): sequence = 0 choices_private_repo = { 'default': 'hudson.maven.local_repo.DefaultLocalRepositoryLocator', 'local-to-workspace': 'hudson.maven.local_repo.PerJobLocalRepositoryLocator', 'local-to-executor': 'hudson.maven.local_repo.PerExecutorLocalRepositoryLocator', } def root_xml(self, data): xml_parent = XML.Element('maven2-moduleset') if 'maven' not in data: return xml_parent # determine version of plugin plugin_info = self.registry.get_plugin_info("Maven Integration plugin") version = pkg_resources.parse_version(plugin_info.get('version', '0')) if 'root-module' in data['maven']: root_module = XML.SubElement(xml_parent, 'rootModule') XML.SubElement(root_module, 'groupId').text = \ data['maven']['root-module']['group-id'] XML.SubElement(root_module, 'artifactId').text = \ data['maven']['root-module']['artifact-id'] XML.SubElement(xml_parent, 'goals').text = data['maven']['goals'] maven_opts = data['maven'].get('maven-opts') if maven_opts: XML.SubElement(xml_parent, 'mavenOpts').text = maven_opts maven_name = data['maven'].get('maven-name') if maven_name: XML.SubElement(xml_parent, 'mavenName').text = maven_name private_repo = data['maven'].get('private-repository') if private_repo: if private_repo not in self.choices_private_repo.keys(): raise ValueError('Not a valid private-repository "%s", ' 'must be one of "%s"' % (private_repo, ", ".join(self.choices_private_repo.keys()))) XML.SubElement(xml_parent, 'localRepository', attrib={'class': self.choices_private_repo[private_repo]}) XML.SubElement(xml_parent, 'ignoreUpstremChanges').text = str( data['maven'].get('ignore-upstream-changes', True)).lower() XML.SubElement(xml_parent, 'rootPOM').text = \ data['maven'].get('root-pom', 'pom.xml') XML.SubElement(xml_parent, 'aggregatorStyleBuild').text = str( not data['maven'].get('parallel-build-modules', False)).lower() XML.SubElement(xml_parent, 'incrementalBuild').text = str( data['maven'].get('incremental-build', False)).lower() XML.SubElement(xml_parent, 'siteArchivingDisabled').text = str( not data['maven'].get('automatic-site-archiving', True)).lower() XML.SubElement(xml_parent, 'fingerprintingDisabled').text = str( not data['maven'].get('automatic-fingerprinting', True)).lower() if (version > pkg_resources.parse_version('0') and version < pkg_resources.parse_version('2.0.1')): XML.SubElement(xml_parent, 'perModuleEmail').text = str( data.get('per-module-email', True)).lower() XML.SubElement(xml_parent, 'archivingDisabled').text = str( not data['maven'].get('automatic-archiving', True)).lower() XML.SubElement(xml_parent, 'resolveDependencies').text = str( data['maven'].get('resolve-dependencies', False)).lower() XML.SubElement(xml_parent, 'processPlugins').text = str( data['maven'].get('process-plugins', False)).lower() XML.SubElement(xml_parent, 'mavenValidationLevel').text = '-1' XML.SubElement(xml_parent, 'runHeadless').text = str( data['maven'].get('run-headless', False)).lower() XML.SubElement(xml_parent, 'disableTriggerDownstreamProjects').text = \ str(data['maven'].get('disable-downstream', False)).lower() if 'custom-workspace' in data['maven']: XML.SubElement(xml_parent, 'customWorkspace').text = str( data['maven'].get('custom-workspace')) helpers.config_file_provider_settings(xml_parent, data['maven']) run_post_steps = XML.SubElement(xml_parent, 'runPostStepsIfResult') run_conditions = ['SUCCESS', 'UNSTABLE', 'FAILURE'] run_condition = data['maven'].get('post-step-run-condition', 'FAILURE') if run_condition not in run_conditions: raise InvalidAttributeError('post-step-run-condition', run_condition, run_conditions) cond_dict = hudson_model.THRESHOLDS[run_condition] XML.SubElement(run_post_steps, 'name').text = cond_dict['name'] XML.SubElement(run_post_steps, 'ordinal').text = cond_dict['ordinal'] XML.SubElement(run_post_steps, 'color').text = cond_dict['color'] return xml_parent