jenkins-job-builder/jenkins_jobs/modules/scm.py
william.soula d332f499af Adding ability to checkout multiple svn repositories
Change-Id: I5f07fe15dfed1f65a8793bdf68805b0ec6b16bc7
Reviewed-on: https://review.openstack.org/15527
Reviewed-by: Clark Boylan <clark.boylan@gmail.com>
Approved: James E. Blair <corvus@inaugust.com>
Reviewed-by: James E. Blair <corvus@inaugust.com>
Tested-by: Jenkins
2012-11-07 22:18:06 +00:00

195 lines
6.9 KiB
Python

# 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 SCM module allows you to specify the source code location for the
project. It adds the ``scm`` attribute to the :ref:`Job` definition,
which accepts a single scm definiton.
**Component**: scm
:Macro: scm
:Entry Point: jenkins_jobs.scm
Example::
job:
name: test_job
scm:
-git:
url: https://example.com/project.git
"""
import xml.etree.ElementTree as XML
import jenkins_jobs.modules.base
def git(self, xml_parent, data):
"""yaml: git
Specifies the git SCM repository for this job.
Requires the Jenkins `Git Plugin.
<https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin>`_
:arg str url: URL of the git repository
:arg list(str) branches: list of branch specifiers to build
:arg bool skip-tag: Skip tagging
:arg bool prune: Prune remote branches
:arg bool clean: Clean after checkout
:arg bool fastpoll: Use fast remote polling
:arg bool disable-submodules: Disable submodules
:arg bool recursive-submodules: Recursively update submodules
:arg bool use-author: Use author rather than committer in Jenkin's build
changeset
:arg bool wipe-workspace: Wipe out workspace before build
Example::
scm:
- git:
url: https://example.com/project.git
branches:
- master
- stable
"""
# XXX somebody should write the docs for those with option name =
# None so we have a sensible name/key for it.
mapping = [
# option, xml name, default value (text), attributes (hard coded)
("disable-submodules", 'disableSubmodules', False),
("recursive-submodules", 'recursiveSubmodules', False),
(None, 'doGenerateSubmoduleConfigurations', False),
("use-author", 'authorOrCommitter', False),
("clean", 'clean', False),
("wipe-workspace", 'wipeOutWorkspace', True),
("prune", 'pruneBranches', False),
("fastpoll", 'remotePoll', False),
(None, 'buildChooser', '', {
'class': 'hudson.plugins.git.util.DefaultBuildChooser'}),
(None, 'gitTool', "Default"),
(None, 'submoduleCfg', '', {'class': 'list'}),
(None, 'relativeTargetDir', ''),
(None, 'reference', ''),
(None, 'excludedRegions', ''),
(None, 'excludedUsers', ''),
(None, 'gitConfigName', ''),
(None, 'gitConfigEmail', ''),
('skip-tag', 'skipTag', False),
(None, 'scmName', ''),
]
scm = XML.SubElement(xml_parent,
'scm', {'class': 'hudson.plugins.git.GitSCM'})
XML.SubElement(scm, 'configVersion').text = '2'
user = XML.SubElement(scm, 'userRemoteConfigs')
huser = XML.SubElement(user, 'hudson.plugins.git.UserRemoteConfig')
XML.SubElement(huser, 'name').text = 'origin'
XML.SubElement(huser, 'refspec').text = \
'+refs/heads/*:refs/remotes/origin/*'
XML.SubElement(huser, 'url').text = data['url']
xml_branches = XML.SubElement(scm, 'branches')
branches = data.get('branches', ['**'])
for branch in branches:
bspec = XML.SubElement(xml_branches, 'hudson.plugins.git.BranchSpec')
XML.SubElement(bspec, 'name').text = branch
for elem in mapping:
(optname, xmlname, val) = elem[:3]
attrs = {}
if len(elem) >= 4:
attrs = elem[3]
xe = XML.SubElement(scm, xmlname, attrs)
if optname and optname in data:
val = data[optname]
if type(val) == bool:
xe.text = str(val).lower()
else:
xe.text = val
def svn(self, xml_parent, data):
"""yaml: svn
Specifies the svn SCM repository for this job.
:arg str url: URL of the svn repository
:arg str basedir: location relative to the workspace root to checkout to
(default '.')
:arg str workspaceupdater: optional argument to specify
how to update the workspace (default wipeworkspace)
:arg list repos: list of repositories to checkout (optional)
:Repo: * **url** (`str`) -- URL for the repository
* **basedir** (`str`) -- Location relative to the workspace
root to checkout to (default '.')
:workspaceupdater values:
:wipeworkspace: - deletes the workspace before checking out
:revertupdate: - do an svn revert then an svn update
:emulateclean: - delete unversioned/ignored files then update
:update: - do an svn update as much as possible
Example::
scm:
- svn:
workspaceupdater: update
repos:
- url: http://svn.example.com/repo
basedir: .
- url: http://svn.example.com/repo2
basedir: repo2
"""
scm = XML.SubElement(xml_parent, 'scm', {'class':
'hudson.scm.SubversionSCM'})
locations = XML.SubElement(scm, 'locations')
if 'repos' in data:
repos = data['repos']
for repo in repos:
module = XML.SubElement(locations,
'hudson.scm.SubversionSCM_-ModuleLocation')
XML.SubElement(module, 'remote').text = repo['url']
XML.SubElement(module, 'local').text = repo.get('basedir', '.')
elif 'url' in data:
module = XML.SubElement(locations,
'hudson.scm.SubversionSCM_-ModuleLocation')
XML.SubElement(module, 'remote').text = data['url']
XML.SubElement(module, 'local').text = data.get('basedir', '.')
else:
raise Exception("A top level url or repos list must exist")
updater = data.get('workspaceupdater', 'wipeworkspace')
if updater == 'wipeworkspace':
updaterclass = 'CheckoutUpdater'
elif updater == 'revertupdate':
updaterclass = 'UpdateWithRevertUpdater'
elif updater == 'emulateclean':
updaterclass = 'UpdateWithCleanUpdater'
elif updater == 'update':
updaterclass = 'UpdateUpdater'
XML.SubElement(scm, 'workspaceUpdater', {'class':
'hudson.scm.subversion.' + updaterclass})
class SCM(jenkins_jobs.modules.base.Base):
sequence = 30
def gen_xml(self, parser, xml_parent, data):
scms = data.get('scm', [])
if scms:
for scm in data.get('scm', []):
self._dispatch('scm', 'scm',
parser, xml_parent, scm)
else:
XML.SubElement(xml_parent, 'scm', {'class': 'hudson.scm.NullSCM'})