diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..0d20b6487c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/manifests/site.pp b/manifests/site.pp index 07c5338c7b..a73e62e221 100644 --- a/manifests/site.pp +++ b/manifests/site.pp @@ -187,10 +187,6 @@ node "jenkins.openstack.org" { ssl_key_file => '/etc/ssl/private/jenkins.openstack.org.key', ssl_chain_file => '/etc/ssl/certs/intermediate.pem', } - class { "jenkins_jobs": - site => "openstack", - } - } node "jenkins-dev.openstack.org" { diff --git a/manifests/stackforge.pp b/manifests/stackforge.pp index 050fcdaf0c..0f8dfc0154 100644 --- a/manifests/stackforge.pp +++ b/manifests/stackforge.pp @@ -70,26 +70,7 @@ node "jenkins.stackforge.org" { class { "jenkins_jobs": site => "stackforge", - } - - jenkins_jobs::python_jobs { "reddwarf-natty": - site => "stackforge", - project => "reddwarf", - node_group => "natty", - ensure => "disabled" - } - - jenkins_jobs::generic_jobs { "reddwarf": - site => "stackforge", - project => "reddwarf", - node_group => "oneiric" - } - - jenkins_jobs::jobs::merge_gate { "ceilometer": - site => "stackforge", - project => "ceilometer", - node_group => "oneiric", - trigger_branches => [["ceilometer", '**']] + projects => ['reddwarf', 'ceilometer'] } } diff --git a/modules/jenkins_jobs/files/jenkins_jobs.py b/modules/jenkins_jobs/files/jenkins_jobs.py new file mode 100644 index 0000000000..dd9a08f494 --- /dev/null +++ b/modules/jenkins_jobs/files/jenkins_jobs.py @@ -0,0 +1,173 @@ +#! /usr/bin/env python +# Copyright (C) 2012 OpenStack, LLC. +# +# 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. + +# Manage jobs in Jenkins server + +import os +import argparse +import hashlib +import yaml +import sys +import xml.etree.ElementTree as XML +import pycurl +import jenkins_talker +import ConfigParser +from xml.dom.ext import PrettyPrint +from StringIO import StringIO +from xml.dom.ext.reader import Sax2 + +parser = argparse.ArgumentParser() +subparser = parser.add_subparsers(help='update or delete job', dest='command') +parser_update = subparser.add_parser('update') +parser_update.add_argument('file', help='YAML file for update', type=file) +parser_delete = subparser.add_parser('delete') +parser_delete.add_argument('name', help='name of job') +parser.add_argument('--conf', dest='conf', help='Configuration file') +options = parser.parse_args() + +if options.conf: + conf = options.conf +else: + conf = 'jenkins_jobs.ini' + +conffp = open(conf, 'r') +config = ConfigParser.ConfigParser() +config.readfp(conffp) + +class YamlParser(object): + def __init__(self, yfile): + self.data = yaml.load_all(yfile) + self.it = self.data.__iter__() + self.current = '' + + def get_next_xml(self): + self.current = self.it.next() + return XmlParser(self.current) + + def get_name(self): + return self.current['main']['name'] + + +class XmlParser(object): + def __init__(self, data): + self.data = data + self.xml = XML.Element('project') + self.modules = [] + self._load_modules() + self._build() + + def _load_modules(self): + for modulename in self.data['modules']: + modulename = 'modules.{name}'.format(name=modulename) + self._register_module(modulename) + + def _register_module(self, modulename): + classname = modulename.rsplit('.', 1)[1] + module = __import__(modulename, fromlist=[classname]) + cla = getattr(module, classname) + self.modules.append(cla(self.data)) + + def _build(self): + XML.SubElement(self.xml, 'actions') + description = XML.SubElement(self.xml, 'description') + description.text = "THIS JOB IS MANAGED BY PUPPET AND WILL BE OVERWRITTEN.\n\n\ +DON'T EDIT THIS JOB THROUGH THE WEB\n\n\ +If you would like to make changes to this job, please see:\n\n\ +https://github.com/openstack/openstack-ci-puppet\n\n\ +In modules/jenkins_jobs" + XML.SubElement(self.xml, 'keepDependencies').text = 'false' + XML.SubElement(self.xml, 'disabled').text = self.data['main']['disabled'] + XML.SubElement(self.xml, 'blockBuildWhenDownstreamBuilding').text = 'false' + XML.SubElement(self.xml, 'blockBuildWhenUpstreamBuilding').text = 'false' + XML.SubElement(self.xml, 'concurrentBuild').text = 'false' + XML.SubElement(self.xml, 'buildWrappers') + self._insert_modules() + + def _insert_modules(self): + for module in self.modules: + module.gen_xml(self.xml) + + def md5(self): + return hashlib.md5(self.output()).hexdigest() + + def output(self): + reader = Sax2.Reader() + docNode = reader.fromString(XML.tostring(self.xml)) + tmpStream = StringIO() + PrettyPrint(docNode, stream=tmpStream) + return tmpStream.getvalue() + +class CacheStorage(object): + def __init__(self): + self.cachefilename = os.path.expanduser('~/.jenkins_jobs_cache.yml') + try: + yfile = file(self.cachefilename, 'r') + except IOError: + self.data = {} + return + self.data = yaml.load(yfile) + yfile.close() + + def set(self, job, md5): + self.data[job] = md5 + yfile = file(self.cachefilename, 'w') + yaml.dump(self.data, yfile) + yfile.close() + + def is_cached(self, job): + if self.data.has_key(job): + return True + return False + + def has_changed(self, job, md5): + if self.data.has_key(job) and self.data[job] == md5: + return False + return True + +class Jenkins(object): + def __init__(self, url, user, password): + self.jenkins = jenkins_talker.JenkinsTalker(url, user, password) + + def update_job(self, job_name, xml): + if self.jenkins.is_job(job_name): + self.jenkins.update_job(job_name, xml) + else: + self.jenkins.create_job(job_name, xml) + + def is_job(self, job_name): + return self.jenkins.is_job(job_name) + + def get_job_md5(self, job_name): + xml = self.jenkins.get_job_config(job_name) + return hashlib.md5(xml).hexdigest() + + +yparse = YamlParser(options.file) +cache = CacheStorage() +remote_jenkins = Jenkins(config.get('jenkins','url'), config.get('jenkins','user'), config.get('jenkins','password')) +while True: + try: + xml = yparse.get_next_xml() + job = yparse.get_name() + md5 = xml.md5() + if remote_jenkins.is_job(job) and not cache.is_cached(job): + old_md5 = remote_jenkins.get_job_md5(job) + cache.set(job, old_md5) + + if cache.has_changed(job, md5): + remote_jenkins.update_job(job, xml.output()) + cache.set(job, md5) + except StopIteration: + break diff --git a/modules/jenkins_jobs/files/jenkins_talker.py b/modules/jenkins_jobs/files/jenkins_talker.py new file mode 100644 index 0000000000..ec64b89aa8 --- /dev/null +++ b/modules/jenkins_jobs/files/jenkins_talker.py @@ -0,0 +1,83 @@ +#! /usr/bin/env python +# Copyright (C) 2012 OpenStack, LLC. +# +# 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. + +# A basic API class to talk to a Jenkins Server + +import pycurl +from StringIO import StringIO + +class JenkinsTalkerException(Exception): pass + +class JenkinsTalker(object): + def __init__(self, url, user, password): + self.url = url + self.user = user + self.password = password + + def _post_xml(self, path, xml, pass_codes): + curl = pycurl.Curl() + response = StringIO() + curl.setopt(pycurl.URL, self.url + path) + curl.setopt(pycurl.USERPWD, self.user + ":" + self.password) + curl.setopt(pycurl.POST, 1) + curl.setopt(pycurl.POSTFIELDS, xml) + curl.setopt(pycurl.HTTPHEADER, [ "Content-Type: text/xml" ]) + curl.setopt(pycurl.POSTFIELDSIZE, len(xml)) + # should probably shove this response into a debug output somewhere + curl.setopt(pycurl.WRITEFUNCTION, response.write) + curl.perform() + if curl.getinfo(pycurl.RESPONSE_CODE) not in pass_codes: + raise JenkinsTalkerException('error posting XML') + curl.close() + + def _get_request(self, path, pass_codes): + curl = pycurl.Curl() + response = StringIO() + curl.setopt(pycurl.URL, self.url + path) + curl.setopt(pycurl.USERPWD, self.user + ":" + self.password) + curl.setopt(pycurl.WRITEFUNCTION, response.write) + curl.perform() + if curl.getinfo(pycurl.RESPONSE_CODE) not in pass_codes: + raise JenkinsTalkerException('error getting response') + curl.close() + return response.getvalue() + + def create_job(self, job_name, xml): + path = 'createItem?name=' + job_name + pass_codes = [ 200 ] + self._post_xml(path, xml, pass_codes) + + def update_job(self, job_name, xml): + path = 'job/' + job_name + '/config.xml' + pass_codes = [ 200 ] + self._post_xml(path, xml, pass_codes) + + def delete_job(self, job_name): + path = 'job/' + job_name + '/doDelete' + pass_codes = [ 302 ] + self._get_request(path, pass_codes) + + def get_job_config(self, job_name): + path = 'job/' + job_name + '/config.xml' + pass_codes = [ 200 ] + return self._get_request(path, pass_codes) + + def is_job(self, job_name): + try: + self.get_job_config(job_name) + except JenkinsTalkerException: + return False + return True + diff --git a/modules/jenkins_jobs/files/modules/__init__.py b/modules/jenkins_jobs/files/modules/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/modules/jenkins_jobs/files/modules/assignednode.py b/modules/jenkins_jobs/files/modules/assignednode.py new file mode 100644 index 0000000000..4748b2aae2 --- /dev/null +++ b/modules/jenkins_jobs/files/modules/assignednode.py @@ -0,0 +1,31 @@ +#! /usr/bin/env python +# Copyright (C) 2012 OpenStack, LLC. +# +# 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. + +# Jenkins Job module for assigned nodes +# To use add the folowing into your YAML: +# assignednode: +# - node: 'oneiric' + +import xml.etree.ElementTree as XML + +class assignednode(object): + def __init__(self, data): + self.data = data + + def gen_xml(self, xml_parent): + node = self.data['assignednode']['node'] + XML.SubElement(xml_parent, 'assignedNode').text = node + XML.SubElement(xml_parent, 'canRoam').text = 'false' + diff --git a/modules/jenkins_jobs/files/modules/builders.py b/modules/jenkins_jobs/files/modules/builders.py new file mode 100644 index 0000000000..79b792646f --- /dev/null +++ b/modules/jenkins_jobs/files/modules/builders.py @@ -0,0 +1,83 @@ +#! /usr/bin/env python +# Copyright (C) 2012 OpenStack, LLC. +# +# 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. + +# Jenkins Job module for builders +# To use add the folowing into your YAML: +# builders: +# - 'gerrit_git_prep' +# - 'python26' + +import xml.etree.ElementTree as XML + +class builders(object): + def __init__(self, data): + self.data = data + + def gen_xml(self, xml_parent): + builders = XML.SubElement(xml_parent, 'builders') + for builder in self.data['builders']: + getattr(self, '_' + builder)(builders) + + def _add_script(self, xml_parent, script): + shell = XML.SubElement(xml_parent, 'hudson.tasks.Shell') + XML.SubElement(shell, 'command').text = script + + def _copy_bundle(self, xml_parent): + copy = XML.SubElement(xml_parent, 'hudson.plugins.copyartifact.CopyArtifact') + XML.SubElement(copy, 'projectName').text = '$PROJECT-venv' + XML.SubElement(copy, 'filter') + XML.SubElement(copy, 'target') + XML.SubElement(copy, 'selector', {'class':'hudson.plugins.copyartifact.StatusBuildSelector'}) + self._add_script(xml_parent, '/usr/local/jenkins/slave_scripts/copy-bundle.sh') + + def _coverage(self, xml_parent): + self._add_script(xml_parent, '/usr/local/jenkins/slave_scripts/run-cover.sh') + + def _docs(self, xml_parent): + self._add_script(xml_parent, '/usr/local/jenkins/slave_scripts/run-docs.sh') + + def _gerrit_git_prep(self, xml_parent): + self._add_script(xml_parent, '/usr/local/jenkins/slave_scripts/gerrit-git-prep.sh {site}'.format(site=self.data['main']['site'])) + + def _pep8(self, xml_parent): + self._add_script(xml_parent, 'tox -v -epep8 | tee pep8.txt') + + def _python26(self, xml_parent): + self._add_script(xml_parent, '/usr/local/jenkins/slave_scripts/run-tox.sh 26') + + def _python27(self, xml_parent): + self._add_script(xml_parent, '/usr/local/jenkins/slave_scripts/run-tox.sh 27') + + def _tarball(self, xml_parent): + self._add_script(xml_parent, '/usr/local/jenkins/slave_scripts/create-tarball.sh') + + def _venv(self, xml_parent): + self._add_script(xml_parent, '/usr/local/jenkins/slave_scripts/build-bundle.sh') + + def _ppa(self, xml_parent): + self._add_script(xml_parent, 'rm -rf build dist.zip\n\ +mkdir build') + copy = XML.SubElement(xml_parent, 'hudson.plugins.copyartifact.CopyArtifact') + XML.SubElement(copy, 'projectName').text = '$PROJECT-tarball' + XML.SubElement(copy, 'filter').text = 'dist/*.tar.gz' + XML.SubElement(copy, 'target').text = 'build' + selector = XML.SubElement(copy, 'selector', {'class':'hudson.plugins.copyartifact.StatusBuildSelector'}) + XML.SubElement(selector, 'parameterName').text = 'BUILD_SELECTOR' + self._add_script(xml_parent, '#!/bin/bash\n\ +\n\ +#export DO_UPLOAD="no"\n\ +export PROJECT="<%= project %>"\n\ +export GERRIT_REFNAME=$BRANCH\n\ +/usr/local/jenkins/slave_scripts/create-ppa-package.sh') diff --git a/modules/jenkins_jobs/files/modules/logrotate.py b/modules/jenkins_jobs/files/modules/logrotate.py new file mode 100644 index 0000000000..5e7e5b7a47 --- /dev/null +++ b/modules/jenkins_jobs/files/modules/logrotate.py @@ -0,0 +1,41 @@ +#! /usr/bin/env python +# Copyright (C) 2012 OpenStack, LLC. +# +# 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. + +# Jenkins Job module for logrotate +# To use add the folowing into your YAML: +# logrotate: +# daysToKeep: 3 +# numToKeep: 20 +# artifactDaysToKeep: -1 +# artifactNumToKeep: -1 + +import xml.etree.ElementTree as XML + +class logrotate(object): + def __init__(self, data): + self.data = data + + def gen_xml(self, xml_parent): + if self.data.has_key('logrotate'): + lr_xml = XML.SubElement(xml_parent, 'logRotator') + logrotate = self.data['logrotate'] + lr_days = XML.SubElement(lr_xml, 'daysToKeep') + lr_days.text = str(logrotate['daysToKeep']) + lr_num = XML.SubElement(lr_xml, 'numToKeep') + lr_num.text = str(logrotate['numToKeep']) + lr_adays = XML.SubElement(lr_xml, 'artifactDaysToKeep') + lr_adays.text = str(logrotate['artifactDaysToKeep']) + lr_anum = XML.SubElement(lr_xml, 'artifactNumToKeep') + lr_anum.text = str(logrotate['artifactNumToKeep']) diff --git a/modules/jenkins_jobs/files/modules/properties.py b/modules/jenkins_jobs/files/modules/properties.py new file mode 100644 index 0000000000..ec840211d5 --- /dev/null +++ b/modules/jenkins_jobs/files/modules/properties.py @@ -0,0 +1,49 @@ +#! /usr/bin/env python +# Copyright (C) 2012 OpenStack, LLC. +# +# 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. + +# Jenkins Job module for job properties +# No additional YAML needed + +import xml.etree.ElementTree as XML + +class properties(object): + def __init__(self, data): + self.data = data + + def gen_xml(self, xml_parent): + main = self.data['main'] + properties = XML.SubElement(xml_parent, 'properties') + github = XML.SubElement(properties, 'com.coravy.hudson.plugins.github.GithubProjectProperty') + github_url = XML.SubElement(github, 'projectUrl') + github_url.text = "https://github.com/{site}/{project}".format(site=main['site'], project=main['project']) + throttle = XML.SubElement(properties, 'hudson.plugins.throttleconcurrents.ThrottleJobProperty') + XML.SubElement(throttle, 'maxConcurrentPerNode').text = '0' + XML.SubElement(throttle, 'maxConcurrentTotal').text = '0' + #XML.SubElement(throttle, 'categories') + XML.SubElement(throttle, 'throttleEnabled').text = 'false' + XML.SubElement(throttle, 'throttleOption').text = 'project' + XML.SubElement(throttle, 'configVersion').text = '1' + env = XML.SubElement(properties, 'EnvInjectJobProperty') + einfo = XML.SubElement(env, 'info') + eiproperties = XML.SubElement(einfo, 'propertiesContent') + eiproperties.text = 'PROJECT={project}'.format(project=main['project']) + XML.SubElement(einfo, 'loadFilesFromMaster').text = 'false' + XML.SubElement(env, 'on').text = 'true' + XML.SubElement(env, 'keepJenkinsSystemVariables').text = 'true' + XML.SubElement(env, 'keepBuildVariables').text = 'true' + XML.SubElement(env, 'contributors') + if main.has_key('authenticatedBuild') and main['authenticatedBuild'] == 'true': + security = XML.SubElement(properties, 'hudson.security.AuthorizationMatrixProperty') + XML.SubElement(security, 'permission').text = 'hudson.model.Item.Build:authenticated' diff --git a/modules/jenkins_jobs/files/modules/publisher_coverage.py b/modules/jenkins_jobs/files/modules/publisher_coverage.py new file mode 100644 index 0000000000..23e07c6a13 --- /dev/null +++ b/modules/jenkins_jobs/files/modules/publisher_coverage.py @@ -0,0 +1,63 @@ +#! /usr/bin/env python +# Copyright (C) 2012 OpenStack, LLC. +# +# 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. + +# Jenkins Job module for coverage publishers +# No additional YAML needed + +import xml.etree.ElementTree as XML + +class publisher_coverage(object): + def __init__(self, data): + self.data = data + + def gen_xml(self, xml_parent): + publishers = XML.SubElement(xml_parent, 'publishers') + cobertura = XML.SubElement(publishers, 'hudson.plugins.cobertura.CoberturaPublisher') + XML.SubElement(cobertura, 'coberturaReportFile').text = '**/coverage.xml' + XML.SubElement(cobertura, 'onlyStable').text = 'false' + healthy = XML.SubElement(cobertura, 'healthyTarget') + targets = XML.SubElement(healthy, 'targets', {'class':'enum-map','enum-type':'hudson.plugins.cobertura.targets.CoverageMetric'}) + entry = XML.SubElement(targets, 'entry') + XML.SubElement(entry, 'hudson.plugins.cobertura.targets.CoverageMetric').text = 'CONDITIONAL' + XML.SubElement(entry, 'int').text = '70' + entry = XML.SubElement(targets, 'entry') + XML.SubElement(entry, 'hudson.plugins.cobertura.targets.CoverageMetric').text = 'LINE' + XML.SubElement(entry, 'int').text = '80' + entry = XML.SubElement(targets, 'entry') + XML.SubElement(entry, 'hudson.plugins.cobertura.targets.CoverageMetric').text = 'METHOD' + XML.SubElement(entry, 'int').text = '80' + unhealthy = XML.SubElement(cobertura, 'unhealthyTarget') + targets = XML.SubElement(unhealthy, 'targets', {'class':'enum-map','enum-type':'hudson.plugins.cobertura.targets.CoverageMetric'}) + entry = XML.SubElement(targets, 'entry') + XML.SubElement(entry, 'hudson.plugins.cobertura.targets.CoverageMetric').text = 'CONDITIONAL' + XML.SubElement(entry, 'int').text = '0' + entry = XML.SubElement(targets, 'entry') + XML.SubElement(entry, 'hudson.plugins.cobertura.targets.CoverageMetric').text = 'LINE' + XML.SubElement(entry, 'int').text = '0' + entry = XML.SubElement(targets, 'entry') + XML.SubElement(entry, 'hudson.plugins.cobertura.targets.CoverageMetric').text = 'METHOD' + XML.SubElement(entry, 'int').text = '0' + failing = XML.SubElement(cobertura, 'failingTarget') + targets = XML.SubElement(failing, 'targets', {'class':'enum-map','enum-type':'hudson.plugins.cobertura.targets.CoverageMetric'}) + entry = XML.SubElement(targets, 'entry') + XML.SubElement(entry, 'hudson.plugins.cobertura.targets.CoverageMetric').text = 'CONDITIONAL' + XML.SubElement(entry, 'int').text = '0' + entry = XML.SubElement(targets, 'entry') + XML.SubElement(entry, 'hudson.plugins.cobertura.targets.CoverageMetric').text = 'LINE' + XML.SubElement(entry, 'int').text = '0' + entry = XML.SubElement(targets, 'entry') + XML.SubElement(entry, 'hudson.plugins.cobertura.targets.CoverageMetric').text = 'METHOD' + XML.SubElement(entry, 'int').text = '0' + XML.SubElement(cobertura, 'sourceEncoding').text = 'ASCII' diff --git a/modules/jenkins_jobs/files/modules/publisher_docs.py b/modules/jenkins_jobs/files/modules/publisher_docs.py new file mode 100644 index 0000000000..dfb67d6f79 --- /dev/null +++ b/modules/jenkins_jobs/files/modules/publisher_docs.py @@ -0,0 +1,43 @@ +#! /usr/bin/env python +# Copyright (C) 2012 OpenStack, LLC. +# +# 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. + +# Jenkins Job module for docs publishers +# No additional YAML needed + +import xml.etree.ElementTree as XML + +class publisher_docs(object): + def __init__(self, data): + self.data = data + + def gen_xml(self, xml_parent): + main = self.data['main'] + publishers = XML.SubElement(xml_parent, 'publishers') + scp = XML.SubElement(publishers, 'be.certipost.hudson.plugin.SCPRepositoryPublisher') + XML.SubElement(scp, 'siteName').text = '{proj}.{site}.org'.format(proj=main['project'], site=main['site']) + entries = XML.SubElement(scp, 'entries') + entry = XML.SubElement(entries, 'be.certipost.hudson.plugin.Entry') + XML.SubElement(entry, 'filePath').text = 'docs/{proj}'.format(proj=main['project']) + XML.SubElement(entry, 'sourceFile').text = 'doc/build/html/**' + XML.SubElement(entry, 'keepHierarchy').text = 'false' + entry = XML.SubElement(entries, 'be.certipost.hudson.plugin.Entry') + XML.SubElement(entry, 'filePath').text = 'docs/{proj}/_static'.format(proj=main['project']) + XML.SubElement(entry, 'sourceFile').text = 'doc/build/html/_static/**' + XML.SubElement(entry, 'keepHierarchy').text = 'false' + entry = XML.SubElement(entries, 'be.certipost.hudson.plugin.Entry') + XML.SubElement(entry, 'filePath').text = 'docs/{proj}/_sources'.format(proj=main['project']) + XML.SubElement(entry, 'sourceFile').text = 'doc/build/html/_sources/**' + XML.SubElement(entry, 'keepHierarchy').text = 'false' + diff --git a/modules/jenkins_jobs/files/modules/publisher_none.py b/modules/jenkins_jobs/files/modules/publisher_none.py new file mode 100644 index 0000000000..2065412ed3 --- /dev/null +++ b/modules/jenkins_jobs/files/modules/publisher_none.py @@ -0,0 +1,26 @@ +#! /usr/bin/env python +# Copyright (C) 2012 OpenStack, LLC. +# +# 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. + +# Jenkins Job module for no publishers +# No additional YAML needed + +import xml.etree.ElementTree as XML + +class publisher_none(object): + def __init__(self, data): + self.data = data + + def gen_xml(self, xml_parent): + XML.SubElement(xml_parent, 'publishers') diff --git a/modules/jenkins_jobs/files/modules/publisher_pep8.py b/modules/jenkins_jobs/files/modules/publisher_pep8.py new file mode 100644 index 0000000000..a9d372d34c --- /dev/null +++ b/modules/jenkins_jobs/files/modules/publisher_pep8.py @@ -0,0 +1,74 @@ +#! /usr/bin/env python +# Copyright (C) 2012 OpenStack, LLC. +# +# 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. + +# Jenkins Job module for pep8 publishers +# No additional YAML needed + +import xml.etree.ElementTree as XML + +class publisher_pep8(object): + def __init__(self, data): + self.data = data + + def _add_entry(self, xml_parent, name): + entry = XML.SubElement(xml_parent, 'entry') + XML.SubElement(entry, 'string').text = name + tconfig = XML.SubElement(entry, 'hudson.plugins.violations.TypeConfig') + XML.SubElement(tconfig, 'type').text = name + XML.SubElement(tconfig, 'min').text = '10' + XML.SubElement(tconfig, 'max').text = '999' + XML.SubElement(tconfig, 'unstable').text = '999' + XML.SubElement(tconfig, 'usePattern').text = 'false' + XML.SubElement(tconfig, 'pattern') + + def gen_xml(self, xml_parent): + publishers = XML.SubElement(xml_parent, 'publishers') + violations = XML.SubElement(publishers, 'hudson.plugins.violations.ViolationsPublisher') + config = XML.SubElement(violations, 'config') + suppressions = XML.SubElement(config, 'suppressions', {'class':'tree-set'}) + XML.SubElement(suppressions, 'no-comparator') + configs = XML.SubElement(config, 'typeConfigs') + XML.SubElement(configs, 'no-comparator') + + self._add_entry(configs, 'checkstyle') + self._add_entry(configs, 'codenarc') + self._add_entry(configs, 'cpd') + self._add_entry(configs, 'cpplint') + self._add_entry(configs, 'csslint') + self._add_entry(configs, 'findbugs') + self._add_entry(configs, 'fxcop') + self._add_entry(configs, 'gendarme') + self._add_entry(configs, 'jcreport') + self._add_entry(configs, 'jslint') + + entry = XML.SubElement(configs, 'entry') + XML.SubElement(entry, 'string').text = 'pep8' + tconfig = XML.SubElement(entry, 'hudson.plugins.violations.TypeConfig') + XML.SubElement(tconfig, 'type').text = 'pep8' + XML.SubElement(tconfig, 'min').text = '0' + XML.SubElement(tconfig, 'max').text = '1' + XML.SubElement(tconfig, 'unstable').text = '1' + XML.SubElement(tconfig, 'usePattern').text = 'false' + XML.SubElement(tconfig, 'pattern').text = '**/pep8.txt' + + self._add_entry(configs, 'pmd') + self._add_entry(configs, 'pylint') + self._add_entry(configs, 'simian') + self._add_entry(configs, 'stylecop') + + XML.SubElement(config, 'limit').text = '100' + XML.SubElement(config, 'sourcePathPattern') + XML.SubElement(config, 'fauxProjectPath') + XML.SubElement(config, 'encoding').text = 'default' diff --git a/modules/jenkins_jobs/files/modules/publisher_ppa.py b/modules/jenkins_jobs/files/modules/publisher_ppa.py new file mode 100644 index 0000000000..4a40e22643 --- /dev/null +++ b/modules/jenkins_jobs/files/modules/publisher_ppa.py @@ -0,0 +1,29 @@ +#! /usr/bin/env python +# Copyright (C) 2012 OpenStack, LLC. +# +# 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. + +# Jenkins Job module for PPA publishers +# No additional YAML needed + +import xml.etree.ElementTree as XML + +class publisher_ppa(object): + def __init__(self, data): + self.data = data + + def gen_xml(self, xml_parent): + publishers = XML.SubElement(xml_parent, 'publishers') + archiver = XML.SubElement(publishers, 'hudson.tasks.ArtifactArchiver') + XML.SubElement(archiver, 'artifacts').text = 'build/*.dsc,build/*.tar.gz,build/*.changes' + XML.SubElement(archiver, 'latestOnly').text = 'false' diff --git a/modules/jenkins_jobs/files/modules/publisher_tarball.py b/modules/jenkins_jobs/files/modules/publisher_tarball.py new file mode 100644 index 0000000000..54ed38cc68 --- /dev/null +++ b/modules/jenkins_jobs/files/modules/publisher_tarball.py @@ -0,0 +1,54 @@ +#! /usr/bin/env python +# Copyright (C) 2012 OpenStack, LLC. +# +# 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. + +# Jenkins Job module for tarball publishers +# To use you can optionally add the following into your YAML: +# publisher: +# uploadProject: 'glance' +# +# If you do not add this it will default to the project specified in the YAML + +import xml.etree.ElementTree as XML + +class publisher_tarball(object): + def __init__(self, data): + self.data = data + + def gen_xml(self, xml_parent): + if self.data.has_key('publisher') and self.data['publisher'].has_key('upload_project'): + project = self.data['publisher']['upload_project'] + else: + project = self.data['main']['project'] + publishers = XML.SubElement(xml_parent, 'publishers') + archiver = XML.SubElement(publishers, 'hudson.tasks.ArtifactArchiver') + XML.SubElement(archiver, 'artifacts').text = 'dist/*.tar.gz' + XML.SubElement(archiver, 'latestOnly').text = 'false' + scp = XML.SubElement(publishers, 'be.certipost.hudson.plugin.SCPRepositoryPublisher') + XML.SubElement(scp, 'siteName').text = '{proj}.{site}.org'.format(proj=project, site=self.data['main']['site']) + entries = XML.SubElement(scp, 'entries') + entry = XML.SubElement(entries, 'be.certipost.hudson.plugin.Entry') + XML.SubElement(entry, 'filePath').text = 'tarballs/{proj}/'.format(proj=project) + XML.SubElement(entry, 'sourceFile').text = 'dist/*.tar.gz' + XML.SubElement(entry, 'keepHierarchy').text = 'false' + btrigger = XML.SubElement(publishers, 'hudson.plugins.parameterizedtrigger.BuildTrigger') + btrigger_configs = XML.SubElement(btrigger, 'configs') + btrigger_config = XML.SubElement(btrigger_configs, 'hudson.plugins.parameterizedtrigger.BuildTriggerConfig') + configs = XML.SubElement(btrigger_config, 'configs') + parameters = XML.SubElement(configs, 'hudson.plugins.parameterizedtrigger.PredefinedBuildParameters') + properties = XML.SubElement(parameters, 'properties').text = 'BUILD_SELECTOR=<SpecificBuildSelector><buildNumber>$BUILD_NUMBER</buildNumber></SpecificBuildSelector>\n\ +BRANCH=$GERRIT_REFNAME' + XML.SubElement(btrigger_config, 'projects').text = '{proj}-ppa'.format(proj=self.data['main']['project']) + XML.SubElement(btrigger_config, 'condition').text = 'SUCCESS' + XML.SubElement(btrigger_config, 'triggerWithNoParameters').text = 'false' diff --git a/modules/jenkins_jobs/files/modules/publisher_venv.py b/modules/jenkins_jobs/files/modules/publisher_venv.py new file mode 100644 index 0000000000..32fae1d6df --- /dev/null +++ b/modules/jenkins_jobs/files/modules/publisher_venv.py @@ -0,0 +1,29 @@ +#! /usr/bin/env python +# Copyright (C) 2012 OpenStack, LLC. +# +# 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. + +# Jenkins Job module for venv publishers +# No additional YAML needed + +import xml.etree.ElementTree as XML + +class publisher_venv(object): + def __init__(self, data): + self.data = data + + def gen_xml(self, xml_parent): + publishers = XML.SubElement(xml_parent, 'publishers') + archiver = XML.SubElement(publishers, 'hudson.tasks.ArtifactArchiver') + XML.SubElement(archiver, 'artifacts').text = 'jenkins_venvs/**/.cache.bundle' + XML.SubElement(archiver, 'latestOnly').text = 'false' diff --git a/modules/jenkins_jobs/files/modules/scm.py b/modules/jenkins_jobs/files/modules/scm.py new file mode 100644 index 0000000000..d453893d3b --- /dev/null +++ b/modules/jenkins_jobs/files/modules/scm.py @@ -0,0 +1,64 @@ +#! /usr/bin/env python +# Copyright (C) 2012 OpenStack, LLC. +# +# 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. + +# Jenkins Job module for scm +# To use add the folowing into your YAML: +# scm: +# scm: 'true' +# or +# scm: 'false' + +import xml.etree.ElementTree as XML + +class scm(object): + def __init__(self, data): + self.data = data + + def gen_xml(self, xml_parent): + main = self.data['main'] + scm_enabled = self.data['scm']['scm'] + if scm_enabled == 'true': + 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 = 'git://github.com/{site}/{project}.git'.format(site=main['site'], project=main['project']) + branches = XML.SubElement(scm, 'branches') + bspec = XML.SubElement(branches, 'hudson.plugins.git.BranchSpec') + XML.SubElement(bspec, 'name').text = '**' + XML.SubElement(scm, 'disableSubmodules').text = 'false' + XML.SubElement(scm, 'recursiveSubmodules').text = 'false' + XML.SubElement(scm, 'doGenerateSubmoduleConfigurations').text = 'false' + XML.SubElement(scm, 'authorOrCommitter').text = 'false' + XML.SubElement(scm, 'clean').text = 'false' + XML.SubElement(scm, 'wipeOutWorkspace').text = 'true' + XML.SubElement(scm, 'pruneBranches').text = 'false' + XML.SubElement(scm, 'remotePoll').text = 'false' + XML.SubElement(scm, 'buildChooser', {'class':'hudson.plugins.git.util.DefaultBuildChooser'}) + XML.SubElement(scm, 'gitTool').text = 'Default' + XML.SubElement(scm, 'submoduleCfg', {'class':'list'}) + XML.SubElement(scm, 'relativeTargetDir') + XML.SubElement(scm, 'reference') + XML.SubElement(scm, 'excludedRegions') + XML.SubElement(scm, 'excludedUsers') + XML.SubElement(scm, 'gitConfigName') + XML.SubElement(scm, 'gitConfigEmail') + XML.SubElement(scm, 'skipTag').text = 'false' + XML.SubElement(scm, 'scmName') + else: + XML.SubElement(xml_parent, 'scm', {'class':'hudson.scm.NullSCM'}) + diff --git a/modules/jenkins_jobs/files/modules/trigger_gerrit.py b/modules/jenkins_jobs/files/modules/trigger_gerrit.py new file mode 100644 index 0000000000..895aaeba77 --- /dev/null +++ b/modules/jenkins_jobs/files/modules/trigger_gerrit.py @@ -0,0 +1,70 @@ +#! /usr/bin/env python +# Copyright (C) 2012 OpenStack, LLC. +# +# 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. + +# Jenkins Job module for gerrit triggers +# To use add the following into your YAML: +# trigger: +# triggerOnPatchsetUploadedEvent: 'false' +# triggerOnChangeMergedEvent: 'false' +# triggerOnCommentAddedEvent: 'true' +# triggerOnRefUpdatedEvent: 'false' +# triggerApprovalCategory: 'APRV' +# triggerApprovalValue: 1 +# failureMessage: 'This change was unable to be automatically merged with the current state of the repository. Please rebase your change and upload a new patchset.' +# projects: +# - projectCompareType: 'PLAIN' +# projectPattern: 'openstack/nova' +# branchCompareType: 'ANT' +# branchPattern: '**' +# - projectCompareType: 'PLAIN' +# projectPattern: 'openstack/glance' +# branchCompareType: 'ANT' +# branchPattern: '**' +# ... + +import xml.etree.ElementTree as XML + +class trigger_gerrit(object): + def __init__(self, data): + self.data = data + + def gen_xml(self, xml_parent): + trigger_data = self.data['trigger'] + projects = trigger_data['projects'] + trigger = XML.SubElement(xml_parent, 'triggers', {'class':'vector'}) + gtrig = XML.SubElement(trigger, 'com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger') + XML.SubElement(gtrig, 'spec') + gprojects = XML.SubElement(gtrig, 'gerritProjects') + for project in projects: + gproj = XML.SubElement(gprojects, 'com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.GerritProject') + XML.SubElement(gproj, 'compareType').text = project['projectCompareType'] + XML.SubElement(gproj, 'pattern').text = project['projectPattern'] + branches = XML.SubElement(gproj, 'branches') + gbranch = XML.SubElement(branches, 'com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.Branch') + XML.SubElement(gbranch, 'compareType').text = project['branchCompareType'] + XML.SubElement(gbranch, 'pattern').text = project['branchPattern'] + XML.SubElement(gtrig, 'silentMode').text = 'false' + XML.SubElement(gtrig, 'escapeQuotes').text = 'true' + XML.SubElement(gtrig, 'triggerOnPatchsetUploadedEvent').text = trigger_data['triggerOnPatchsetUploadedEvent'] + XML.SubElement(gtrig, 'triggerOnChangeMergedEvent').text = trigger_data['triggerOnChangeMergedEvent'] + XML.SubElement(gtrig, 'triggerOnCommentAddedEvent').text = trigger_data['triggerOnCommentAddedEvent'] + XML.SubElement(gtrig, 'triggerOnRefUpdatedEvent').text = trigger_data['triggerOnRefUpdatedEvent'] + XML.SubElement(gtrig, 'commentAddedTriggerApprovalCategory').text = trigger_data['triggerApprovalCategory'] + XML.SubElement(gtrig, 'commentAddedTriggerApprovalValue').text = str(trigger_data['triggerApprovalValue']) + XML.SubElement(gtrig, 'buildStartMessage') + XML.SubElement(gtrig, 'buildFailureMessage').text = trigger_data['failureMessage'] + XML.SubElement(gtrig, 'buildSuccessfulMessage') + XML.SubElement(gtrig, 'buildUnstableMessage') + XML.SubElement(gtrig, 'customUrl') diff --git a/modules/jenkins_jobs/files/modules/trigger_none.py b/modules/jenkins_jobs/files/modules/trigger_none.py new file mode 100644 index 0000000000..b43b8b2f0c --- /dev/null +++ b/modules/jenkins_jobs/files/modules/trigger_none.py @@ -0,0 +1,26 @@ +#! /usr/bin/env python +# Copyright (C) 2012 OpenStack, LLC. +# +# 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. + +# Jenkins Job module for no triggers +# No additional YAML needed + +import xml.etree.ElementTree as XML + +class trigger_none(object): + def __init__(self, data): + self.data = data + + def gen_xml(self, xml_parent): + XML.SubElement(xml_parent, 'triggers', {'class':'vector'}) diff --git a/modules/jenkins_jobs/files/modules/trigger_timed.py b/modules/jenkins_jobs/files/modules/trigger_timed.py new file mode 100644 index 0000000000..02e4938df5 --- /dev/null +++ b/modules/jenkins_jobs/files/modules/trigger_timed.py @@ -0,0 +1,33 @@ +#! /usr/bin/env python +# Copyright (C) 2012 OpenStack, LLC. +# +# 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. + +# Jenkins Job module for timed triggers +# To use add the following into your YAML: +# trigger: +# timed: '@midnight' +# or +# timed: '*/15 * * * *' + +import xml.etree.ElementTree as XML + +class trigger_timed(object): + def __init__(self, data): + self.data = data + + def gen_xml(self, xml_parent): + time = self.data['trigger']['timed'] + trigger = XML.SubElement(xml_parent, 'triggers', {'class':'vector'}) + scmtrig = XML.SubElement(trigger, 'hudson.triggers.SCMTrigger') + XML.SubElement(scmtrig, 'spec').text = time diff --git a/modules/jenkins_jobs/files/projects/stackforge/ceilometer.yml b/modules/jenkins_jobs/files/projects/stackforge/ceilometer.yml new file mode 100644 index 0000000000..f0785321bd --- /dev/null +++ b/modules/jenkins_jobs/files/projects/stackforge/ceilometer.yml @@ -0,0 +1,38 @@ +--- +modules: + - properties + - scm + - assignednode + - trigger_gerrit + - builders + - publisher_none + +main: + name: 'gate-ceilometer-merge' + site: 'stackforge' + project: 'ceilometer' + authenticatedBuild: 'true' + disabled: 'false' + +trigger: + triggerOnPatchsetUploadedEvent: 'false' + triggerOnChangeMergedEvent: 'false' + triggerOnCommentAddedEvent: 'true' + triggerOnRefUpdatedEvent: 'false' + triggerApprovalCategory: 'APRV' + triggerApprovalValue: 1 + failureMessage: 'This change was unable to be automatically merged with the current state of the repository. Please rebase your change and upload a new patchset.' + projects: + - projectCompareType: 'PLAIN' + projectPattern: 'stackforge/ceilometer' + branchCompareType: 'ANT' + branchPattern: '**' + +builders: + - gerrit_git_prep + +scm: + scm: 'false' + +assignednode: + node: 'oneiric' diff --git a/modules/jenkins_jobs/files/projects/stackforge/reddwarf.yml b/modules/jenkins_jobs/files/projects/stackforge/reddwarf.yml new file mode 100644 index 0000000000..0d3f29cb80 --- /dev/null +++ b/modules/jenkins_jobs/files/projects/stackforge/reddwarf.yml @@ -0,0 +1,329 @@ +--- +# coverage +modules: + - logrotate + - properties + - scm + - assignednode + - trigger_timed + - builders + - publisher_coverage + +main: + name: 'reddwarf-coverage' + site: 'stackforge' + project: 'reddwarf' + authenticatedBuild: 'false' + disabled: 'true' + +trigger: + timed: '*/15 * * * *' + +builders: + - copy_bundle + - coverage + +scm: + scm: 'true' + +assignednode: + node: 'oneiric' + +logrotate: + daysToKeep: 3 + numToKeep: 20 + artifactDaysToKeep: -1 + artifactNumToKeep: -1 + +--- +# pep8-gate +modules: + - properties + - scm + - assignednode + - trigger_gerrit + - builders + - publisher_pep8 + +main: + name: 'gate-reddwarf-pep8' + site: 'stackforge' + project: 'reddwarf' + authenticatedBuild: 'true' + disabled: 'true' + +trigger: + triggerOnPatchsetUploadedEvent: 'false' + triggerOnChangeMergedEvent: 'false' + triggerOnCommentAddedEvent: 'true' + triggerOnRefUpdatedEvent: 'false' + triggerApprovalCategory: 'APRV' + triggerApprovalValue: 1 + failureMessage: '' + projects: + - projectCompareType: 'PLAIN' + projectPattern: 'stackforge/reddwarf' + branchCompareType: 'ANT' + branchPattern: '**' + +builders: + - gerrit_git_prep + - copy_bundle + - pep8 + +scm: + scm: 'false' + +assignednode: + node: 'oneiric' + +--- +# python26-gate +modules: + - properties + - scm + - assignednode + - trigger_gerrit + - builders + - publisher_none + +main: + name: 'gate-reddwarf-python26' + site: 'stackforge' + project: 'reddwarf' + authenticatedBuild: 'true' + disabled: 'true' + +trigger: + triggerOnPatchsetUploadedEvent: 'false' + triggerOnChangeMergedEvent: 'false' + triggerOnCommentAddedEvent: 'true' + triggerOnRefUpdatedEvent: 'false' + triggerApprovalCategory: 'APRV' + triggerApprovalValue: 1 + failureMessage: '' + projects: + - projectCompareType: 'PLAIN' + projectPattern: 'stackforge/reddwarf' + branchCompareType: 'ANT' + branchPattern: '**' + +builders: + - gerrit_git_prep + - copy_bundle + - python26 + +scm: + scm: 'true' + +assignednode: + node: 'oneiric' + +--- +# python27-gate +modules: + - properties + - scm + - assignednode + - trigger_gerrit + - builders + - publisher_none + +main: + name: 'gate-reddwarf-python27' + site: 'stackforge' + project: 'reddwarf' + authenticatedBuild: 'true' + disabled: 'true' + +trigger: + triggerOnPatchsetUploadedEvent: 'false' + triggerOnChangeMergedEvent: 'false' + triggerOnCommentAddedEvent: 'true' + triggerOnRefUpdatedEvent: 'false' + triggerApprovalCategory: 'APRV' + triggerApprovalValue: 1 + failureMessage: '' + projects: + - projectCompareType: 'PLAIN' + projectPattern: 'stackforge/reddwarf' + branchCompareType: 'ANT' + branchPattern: '**' + +builders: + - gerrit_git_prep + - copy_bundle + - python27 + +scm: + scm: 'true' + +assignednode: + node: 'oneiric' + +--- +# venv +modules: + - properties + - scm + - assignednode + - trigger_timed + - builders + - publisher_venv + +main: + name: 'reddwarf-venv' + site: 'stackforge' + project: 'reddwarf' + authenticatedBuild: 'false' + disabled: 'true' + +trigger: + timed: '@midnight' + +builders: + - venv + +scm: + scm: 'true' + +assignednode: + node: 'oneiric' + +--- +# docs +modules: + - properties + - scm + - assignednode + - trigger_timed + - builders + - publisher_docs + +main: + name: 'reddwarf-docs' + site: 'stackforge' + project: 'reddwarf' + authenticatedBuild: 'false' + disabled: 'true' + +trigger: + timed: '*/15 * * * *' + +builders: + - copy_bundle + - docs + +scm: + scm: 'true' + +assignednode: + node: 'oneiric' + +--- +# merge-gate +modules: + - properties + - scm + - assignednode + - trigger_gerrit + - builders + - publisher_none + +main: + name: 'gate-reddwarf-merge' + site: 'stackforge' + project: 'reddwarf' + authenticatedBuild: 'true' + disabled: 'true' + +trigger: + triggerOnPatchsetUploadedEvent: 'false' + triggerOnChangeMergedEvent: 'false' + triggerOnCommentAddedEvent: 'true' + triggerOnRefUpdatedEvent: 'false' + triggerApprovalCategory: 'APRV' + triggerApprovalValue: 1 + failureMessage: 'This change was unable to be automatically merged with the current state of the repository. Please rebase your change and upload a new patchset.' + projects: + - projectCompareType: 'PLAIN' + projectPattern: 'stackforge/reddwarf' + branchCompareType: 'ANT' + branchPattern: '**' + +builders: + - gerrit_git_prep + +scm: + scm: 'false' + +assignednode: + node: 'oneiric' + +--- +# ppa +modules: + - properties + - scm + - assignednode + - trigger_none + - builders + - publisher_ppa + +main: + name: 'reddwarf-ppa' + site: 'stackforge' + project: 'reddwarf' + authenticatedBuild: 'false' + disabled: 'true' + +builders: + - ppa + +scm: + scm: 'false' + +assignednode: + node: 'oneiric' + +--- +# tarball +modules: + - properties + - scm + - assignednode + - trigger_gerrit + - builders + - publisher_tarball + +main: + name: 'reddwarf-tarball' + site: 'stackforge' + project: 'reddwarf' + authenticatedBulid: 'false' + disabled: 'true' + +trigger: + triggerOnPatchsetUploadedEvent: 'false' + triggerOnChangeMergedEvent: 'false' + triggerOnCommentAddedEvent: 'false' + triggerOnRefUpdatedEvent: 'true' + triggerApprovalCategory: '' + triggerApprovalValue: '' + failureMessage: '' + projects: + - projectCompareType: 'PLAIN' + projectPattern: 'stackforge/reddwarf' + branchCompareType: 'REG_EXP' + branchPattern: '^(?!refs/).*$' + +builders: + - gerrit_git_prep + - copy_bundle + - tarball + +scm: + scm: 'true' + +assignednode: + node: 'oneiric' diff --git a/modules/jenkins_jobs/lib/puppet/parser/functions/builder.rb b/modules/jenkins_jobs/lib/puppet/parser/functions/builder.rb deleted file mode 100644 index 9833193638..0000000000 --- a/modules/jenkins_jobs/lib/puppet/parser/functions/builder.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Puppet::Parser::Functions - newfunction(:builder, :type => :rvalue) do |args| - file = "jenkins_jobs/builder_" + args[0] + ".xml.erb" - wrapper = Puppet::Parser::TemplateWrapper.new(self) - wrapper.file = file - begin - wrapper.result - rescue => detail - raise Puppet::ParseError, - "Failed to parse template #{file}: #{detail}" - end - end -end diff --git a/modules/jenkins_jobs/lib/puppet/parser/functions/misc.rb b/modules/jenkins_jobs/lib/puppet/parser/functions/misc.rb deleted file mode 100644 index 82e9c7b9af..0000000000 --- a/modules/jenkins_jobs/lib/puppet/parser/functions/misc.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Puppet::Parser::Functions - newfunction(:misc, :type => :rvalue) do |args| - file = "jenkins_jobs/" + args[0] + ".xml.erb" - wrapper = Puppet::Parser::TemplateWrapper.new(self) - wrapper.file = file - begin - wrapper.result - rescue => detail - raise Puppet::ParseError, - "Failed to parse template #{file}: #{detail}" - end - end -end diff --git a/modules/jenkins_jobs/lib/puppet/parser/functions/publisher.rb b/modules/jenkins_jobs/lib/puppet/parser/functions/publisher.rb deleted file mode 100644 index 5fd76a6b4f..0000000000 --- a/modules/jenkins_jobs/lib/puppet/parser/functions/publisher.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Puppet::Parser::Functions - newfunction(:publisher, :type => :rvalue) do |args| - file = "jenkins_jobs/publisher_" + args[0] + ".xml.erb" - wrapper = Puppet::Parser::TemplateWrapper.new(self) - wrapper.file = file - begin - wrapper.result - rescue => detail - raise Puppet::ParseError, - "Failed to parse template #{file}: #{detail}" - end - end -end diff --git a/modules/jenkins_jobs/lib/puppet/parser/functions/scm.rb b/modules/jenkins_jobs/lib/puppet/parser/functions/scm.rb deleted file mode 100644 index 85e49b23fa..0000000000 --- a/modules/jenkins_jobs/lib/puppet/parser/functions/scm.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Puppet::Parser::Functions - newfunction(:scm, :type => :rvalue) do |args| - file = "jenkins_jobs/scm_" + args[0] + ".xml.erb" - wrapper = Puppet::Parser::TemplateWrapper.new(self) - wrapper.file = file - begin - wrapper.result - rescue => detail - raise Puppet::ParseError, - "Failed to parse template #{file}: #{detail}" - end - end -end diff --git a/modules/jenkins_jobs/lib/puppet/parser/functions/trigger.rb b/modules/jenkins_jobs/lib/puppet/parser/functions/trigger.rb deleted file mode 100644 index 13dd279910..0000000000 --- a/modules/jenkins_jobs/lib/puppet/parser/functions/trigger.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Puppet::Parser::Functions - newfunction(:trigger, :type => :rvalue) do |args| - file = "jenkins_jobs/trigger_" + args[0] + ".xml.erb" - wrapper = Puppet::Parser::TemplateWrapper.new(self) - wrapper.file = file - begin - wrapper.result - rescue => detail - raise Puppet::ParseError, - "Failed to parse template #{file}: #{detail}" - end - end -end diff --git a/modules/jenkins_jobs/manifests/build_job.pp b/modules/jenkins_jobs/manifests/build_job.pp deleted file mode 100644 index de18d372cf..0000000000 --- a/modules/jenkins_jobs/manifests/build_job.pp +++ /dev/null @@ -1,50 +0,0 @@ -define jenkins_jobs::build_job($site, $project, $job, $node_group, $triggers="", $builders, $publishers="", $logrotate="", $scm="", $trigger_branches="", $auth_build=false, $upload_project="", $ensure="present") { - - if $ensure == "absent" { - file { "/var/lib/jenkins/jobs/${name}": - ensure => purged, - owner => 'jenkins', - recurse => true, - notify => Exec['jenkins'] - } - } else { - if $ensure == "disabled" { - $disabled = true - } else { - $disabled = false - } - - file { "/var/lib/jenkins/jobs/${name}": - ensure => directory, - owner => 'jenkins', - } - - file { "/var/lib/jenkins/jobs/${name}/builds": - ensure => directory, - owner => 'jenkins', - require => File["/var/lib/jenkins/jobs/${name}"] - } - - file { "/var/lib/jenkins/jobs/${name}/config-history": - ensure => directory, - owner => 'jenkins', - require => File["/var/lib/jenkins/jobs/${name}"] - } - - file { "/var/lib/jenkins/jobs/${name}/config.xml": - ensure => present, - content => template("jenkins_jobs/body.xml.erb"), - owner => 'jenkins', - require => File["/var/lib/jenkins/jobs/${name}"], - notify => Exec["jenkins"] - } - - file { "/var/lib/jenkins/jobs/${name}/nextBuildNumber": - ensure => present, - content => "1", - owner => 'jenkins', - replace => false, - require => File["/var/lib/jenkins/jobs/${name}"] - } - } -} diff --git a/modules/jenkins_jobs/manifests/generic_jobs.pp b/modules/jenkins_jobs/manifests/generic_jobs.pp deleted file mode 100644 index 9e0b3a21ca..0000000000 --- a/modules/jenkins_jobs/manifests/generic_jobs.pp +++ /dev/null @@ -1,41 +0,0 @@ -define jenkins_jobs::generic_jobs($site, $project, $node_group, $ensure="present") { - jenkins_jobs::jobs::docs { $name: - site => $site, - project => $project, - node_group => $node_group, - ensure => $ensure - } - - jenkins_jobs::jobs::merge_check { $name: - site => $site, - project => $project, - node_group => $node_group, - trigger_branches => [[$project, '**']], - ensure => $ensure - } - - jenkins_jobs::jobs::merge_gate { $name: - site => $site, - project => $project, - node_group => $node_group, - trigger_branches => [[$project, '**']], - ensure => $ensure - } - - jenkins_jobs::jobs::ppa { $name: - site => $site, - project => $project, - node_group => $node_group, - ensure => $ensure - } - - jenkins_jobs::jobs::tarball { $name: - site => $site, - project => $project, - node_group => $node_group, - upload_project => $project, - trigger_branches => [[$project, '^(?!refs/).*$']], - ensure => $ensure - } - -} diff --git a/modules/jenkins_jobs/manifests/init.pp b/modules/jenkins_jobs/manifests/init.pp index 91d79ed3d7..8fa3b1ac86 100644 --- a/modules/jenkins_jobs/manifests/init.pp +++ b/modules/jenkins_jobs/manifests/init.pp @@ -1,6 +1,25 @@ -class jenkins_jobs($site) { - exec { "jenkins": - command => "/usr/bin/curl https://jenkins.${site}.org/reload", - refreshonly => true +class jenkins_jobs($site, $projects) { + file { '/usr/local/jenkins_jobs': + owner => 'root', + group => 'root', + mode => 755, + ensure => 'directory', + recurse => true, + source => ['puppet:///modules/jenkins_jobs/'] + } + + file { '/usr/local/jenkins_jobs/jenkins_jobs.ini': + owner => 'root', + group => 'root', + mode => 440, + ensure => 'present', + source => 'file:///root/secret-files/jenkins_jobs.ini', + replace => 'true', + require => File['/usr/local/jenkins_jobs'] + } + + jenkins_jobs::process_projects { $projects: + site => $site, + require => File['/usr/local/jenkins_jobs/jenkins_jobs.ini'] } } diff --git a/modules/jenkins_jobs/manifests/jobs/coverage.pp b/modules/jenkins_jobs/manifests/jobs/coverage.pp deleted file mode 100644 index 505695ca11..0000000000 --- a/modules/jenkins_jobs/manifests/jobs/coverage.pp +++ /dev/null @@ -1,14 +0,0 @@ -define jenkins_jobs::jobs::coverage($site, $project, $node_group, $ensure="present") { - jenkins_jobs::build_job { "${name}-coverage": - ensure => $ensure, - site => $site, - project => $project, - job => "coverage", - node_group => $node_group, - logrotate => misc("logrotate"), - builders => [builder("copy_bundle"), builder("coverage")], - publishers => publisher("coverage"), - triggers => trigger("timed_15mins"), - scm => scm("git") - } -} diff --git a/modules/jenkins_jobs/manifests/jobs/docs.pp b/modules/jenkins_jobs/manifests/jobs/docs.pp deleted file mode 100644 index c9e8d5278c..0000000000 --- a/modules/jenkins_jobs/manifests/jobs/docs.pp +++ /dev/null @@ -1,13 +0,0 @@ -define jenkins_jobs::jobs::docs($site, $project, $node_group, $ensure="present") { - jenkins_jobs::build_job { "${name}-docs": - ensure => $ensure, - site => $site, - project => $project, - job => "docs", - node_group => $node_group, - triggers => trigger("timed_15mins"), - builders => [builder("copy_bundle"), builder("docs")], - publishers => publisher("docs"), - scm => scm("git") - } -} diff --git a/modules/jenkins_jobs/manifests/jobs/merge_check.pp b/modules/jenkins_jobs/manifests/jobs/merge_check.pp deleted file mode 100644 index b10a44ec5c..0000000000 --- a/modules/jenkins_jobs/manifests/jobs/merge_check.pp +++ /dev/null @@ -1,13 +0,0 @@ -define jenkins_jobs::jobs::merge_check($site, $project, $node_group, $trigger_branches, $ensure="present") { - jenkins_jobs::build_job { "check-${name}-merge": - ensure => $ensure, - site => $site, - project => $project, - job => "merge", - node_group => $node_group, - triggers => trigger("gerrit_uploaded_merge"), - builders => builder("gerrit_git_prep"), - trigger_branches => $trigger_branches, - auth_build => true - } -} diff --git a/modules/jenkins_jobs/manifests/jobs/merge_gate.pp b/modules/jenkins_jobs/manifests/jobs/merge_gate.pp deleted file mode 100644 index 72356d01e6..0000000000 --- a/modules/jenkins_jobs/manifests/jobs/merge_gate.pp +++ /dev/null @@ -1,13 +0,0 @@ -define jenkins_jobs::jobs::merge_gate($site, $project, $node_group, $trigger_branches, $ensure="present") { - jenkins_jobs::build_job { "gate-${name}-merge": - ensure => $ensure, - site => $site, - project => $project, - job => "merge", - node_group => $node_group, - triggers => trigger("gerrit_comment_merge"), - builders => builder("gerrit_git_prep"), - trigger_branches => $trigger_branches, - auth_build => true - } -} diff --git a/modules/jenkins_jobs/manifests/jobs/pep8_check.pp b/modules/jenkins_jobs/manifests/jobs/pep8_check.pp deleted file mode 100644 index 41b4eaa427..0000000000 --- a/modules/jenkins_jobs/manifests/jobs/pep8_check.pp +++ /dev/null @@ -1,14 +0,0 @@ -define jenkins_jobs::jobs::pep8_check($site, $project, $node_group, $trigger_branches, $ensure="present") { - jenkins_jobs::build_job { "check-${name}-pep8": - ensure => $ensure, - site => $site, - project => $project, - job => "pep8", - node_group => $node_group, - triggers => trigger("gerrit_uploaded_plain"), - builders => [builder("gerrit_git_prep"), builder("copy_bundle"), builder("pep8")], - publishers => publisher("pep8"), - trigger_branches => $trigger_branches, - auth_build => true - } -} diff --git a/modules/jenkins_jobs/manifests/jobs/pep8_gate.pp b/modules/jenkins_jobs/manifests/jobs/pep8_gate.pp deleted file mode 100644 index ffd3bf7d72..0000000000 --- a/modules/jenkins_jobs/manifests/jobs/pep8_gate.pp +++ /dev/null @@ -1,14 +0,0 @@ -define jenkins_jobs::jobs::pep8_gate($site, $project, $node_group, $trigger_branches, $ensure="present") { - jenkins_jobs::build_job { "gate-${name}-pep8": - ensure => $ensure, - site => $site, - project => $project, - job => "pep8", - node_group => $node_group, - triggers => trigger("gerrit_comment_plain"), - builders => [builder("gerrit_git_prep"), builder("copy_bundle"), builder("pep8")], - publishers => publisher("pep8"), - trigger_branches => $trigger_branches, - auth_build => true - } -} diff --git a/modules/jenkins_jobs/manifests/jobs/ppa.pp b/modules/jenkins_jobs/manifests/jobs/ppa.pp deleted file mode 100644 index 666242fb9d..0000000000 --- a/modules/jenkins_jobs/manifests/jobs/ppa.pp +++ /dev/null @@ -1,11 +0,0 @@ -define jenkins_jobs::jobs::ppa($site, $project, $node_group, $ensure="present") { - jenkins_jobs::build_job { "${name}-ppa": - ensure => $ensure, - site => $site, - project => $project, - job => "ppa", - node_group => $node_group, - builders => builder("ppa"), - publishers => publisher("ppa") - } -} diff --git a/modules/jenkins_jobs/manifests/jobs/python26_check.pp b/modules/jenkins_jobs/manifests/jobs/python26_check.pp deleted file mode 100644 index f7902de2bb..0000000000 --- a/modules/jenkins_jobs/manifests/jobs/python26_check.pp +++ /dev/null @@ -1,13 +0,0 @@ -define jenkins_jobs::jobs::python26_check($site, $project, $node_group, $trigger_branches, $ensure="present") { - jenkins_jobs::build_job { "check-${name}-python26": - ensure => $ensure, - site => $site, - project => $project, - job => "python26", - node_group => $node_group, - triggers => trigger("gerrit_uploaded_plain"), - builders => [builder("gerrit_git_prep"), builder("copy_bundle"), builder("python26")], - trigger_branches => $trigger_branches, - auth_build => true - } -} diff --git a/modules/jenkins_jobs/manifests/jobs/python26_gate.pp b/modules/jenkins_jobs/manifests/jobs/python26_gate.pp deleted file mode 100644 index fa4f0de3e3..0000000000 --- a/modules/jenkins_jobs/manifests/jobs/python26_gate.pp +++ /dev/null @@ -1,13 +0,0 @@ -define jenkins_jobs::jobs::python26_gate($site, $project, $node_group, $trigger_branches, $ensure="present") { - jenkins_jobs::build_job { "gate-${name}-python26": - ensure => $ensure, - site => $site, - project => $project, - job => "python26", - node_group => $node_group, - triggers => trigger("gerrit_comment_plain"), - builders => [builder("gerrit_git_prep"), builder("copy_bundle"), builder("python26")], - trigger_branches => $trigger_branches, - auth_build => true - } -} diff --git a/modules/jenkins_jobs/manifests/jobs/python27_check.pp b/modules/jenkins_jobs/manifests/jobs/python27_check.pp deleted file mode 100644 index baec9bae12..0000000000 --- a/modules/jenkins_jobs/manifests/jobs/python27_check.pp +++ /dev/null @@ -1,13 +0,0 @@ -define jenkins_jobs::jobs::python27_check($site, $project, $node_group, $trigger_branches, $ensure="present") { - jenkins_jobs::build_job { "check-${name}-python27": - ensure => $ensure, - site => $site, - project => $project, - job => "python27", - node_group => $node_group, - triggers => trigger("gerrit_uploaded_plain"), - builders => [builder("gerrit_git_prep"), builder("copy_bundle"), builder("python27")], - trigger_branches => $trigger_branches, - auth_build => true - } -} diff --git a/modules/jenkins_jobs/manifests/jobs/python27_gate.pp b/modules/jenkins_jobs/manifests/jobs/python27_gate.pp deleted file mode 100644 index 0e519700ea..0000000000 --- a/modules/jenkins_jobs/manifests/jobs/python27_gate.pp +++ /dev/null @@ -1,13 +0,0 @@ -define jenkins_jobs::jobs::python27_gate($site, $project, $node_group, $trigger_branches, $ensure="present") { - jenkins_jobs::build_job { "gate-${name}-python27": - ensure => $ensure, - site => $site, - project => $project, - job => "python27", - node_group => $node_group, - triggers => trigger("gerrit_comment_plain"), - builders => [builder("gerrit_git_prep"), builder("copy_bundle"), builder("python27")], - trigger_branches => $trigger_branches, - auth_build => true - } -} diff --git a/modules/jenkins_jobs/manifests/jobs/tarball.pp b/modules/jenkins_jobs/manifests/jobs/tarball.pp deleted file mode 100644 index 6fdefc75a7..0000000000 --- a/modules/jenkins_jobs/manifests/jobs/tarball.pp +++ /dev/null @@ -1,14 +0,0 @@ -define jenkins_jobs::jobs::tarball($site, $project, $node_group, $trigger_branches, $upload_project, $ensure="present") { - jenkins_jobs::build_job { "${name}-tarball": - ensure => $ensure, - site => $site, - project => $project, - job => "tarball", - upload_project => $upload_project, - node_group => $node_group, - triggers => trigger("gerrit_ref_updated"), - builders => [builder("gerrit_git_prep"), builder("copy_bundle"), builder("tarball")], - publishers => publisher("tarball"), - trigger_branches => $trigger_branches - } -} diff --git a/modules/jenkins_jobs/manifests/jobs/venv.pp b/modules/jenkins_jobs/manifests/jobs/venv.pp deleted file mode 100644 index 6eb6afdab7..0000000000 --- a/modules/jenkins_jobs/manifests/jobs/venv.pp +++ /dev/null @@ -1,13 +0,0 @@ -define jenkins_jobs::jobs::venv($site, $project, $node_group, $ensure="present") { - jenkins_jobs::build_job { "${name}-venv": - ensure => $ensure, - site => $site, - project => $project, - job => "venv", - node_group => $node_group, - triggers => trigger("timed_midnight"), - builders => builder("venv"), - publishers => publisher("venv"), - scm => scm("git") - } -} diff --git a/modules/jenkins_jobs/manifests/process_projects.pp b/modules/jenkins_jobs/manifests/process_projects.pp new file mode 100644 index 0000000000..b4734c008f --- /dev/null +++ b/modules/jenkins_jobs/manifests/process_projects.pp @@ -0,0 +1,8 @@ +define process_projects($site) { + exec { 'jenkins_job': + command => "python /usr/local/jenkins_jobs/jenkins_jobs.py update /usr/local/jenkins_jobs/projects/${site}/${name}.yml", + cwd => '/usr/local/jenkins_jobs/', + path => '/bin:/usr/bin' + } + +} diff --git a/modules/jenkins_jobs/manifests/python_jobs.pp b/modules/jenkins_jobs/manifests/python_jobs.pp deleted file mode 100644 index 29fc130e12..0000000000 --- a/modules/jenkins_jobs/manifests/python_jobs.pp +++ /dev/null @@ -1,56 +0,0 @@ -define jenkins_jobs::python_jobs($site, $project, $node_group, $ensure="present") { - jenkins_jobs::jobs::coverage { $name: - site => $site, - project => $project, - node_group => $node_group, - ensure => $ensure - } - jenkins_jobs::jobs::pep8_check { $name: - site => $site, - project => $project, - node_group => $node_group, - trigger_branches => [[$project, '**']], - ensure => $ensure - } - jenkins_jobs::jobs::python26_check { $name: - site => $site, - project => $project, - node_group => $node_group, - trigger_branches => [[$project, '**']], - ensure => $ensure - } - jenkins_jobs::jobs::python27_check { $name: - site => $site, - project => $project, - node_group => $node_group, - trigger_branches => [[$project, '**']], - ensure => $ensure - } - jenkins_jobs::jobs::pep8_gate { $name: - site => $site, - project => $project, - node_group => $node_group, - trigger_branches => [[$project, '**']], - ensure => $ensure - } - jenkins_jobs::jobs::python26_gate { $name: - site => $site, - project => $project, - node_group => $node_group, - trigger_branches => [[$project, '**']], - ensure => $ensure - } - jenkins_jobs::jobs::python27_gate { $name: - site => $site, - project => $project, - node_group => $node_group, - trigger_branches => [[$project, '**']], - ensure => $ensure - } - jenkins_jobs::jobs::venv { $name: - site => $site, - project => $project, - node_group => $node_group, - ensure => $ensure - } -} diff --git a/modules/jenkins_jobs/templates/body.xml.erb b/modules/jenkins_jobs/templates/body.xml.erb deleted file mode 100644 index 960cb2ae47..0000000000 --- a/modules/jenkins_jobs/templates/body.xml.erb +++ /dev/null @@ -1,70 +0,0 @@ - - - - -THIS JOB IS MANAGED BY PUPPET AND WILL BE OVERWRITTEN. - -DON'T EDIT THIS JOB THROUGH THE WEB - -If you would like to make changes to this job, please see: - -https://github.com/openstack/openstack-ci-puppet - -In modules/jenkins_jobs - - <%= logrotate %> - false - - - https://github.com/<%= site %>/<%= project %>/ - - - 0 - 0 - - false - project - 1 - - - - PROJECT=<%= project %> - false - - true - true - true - - - <% if auth_build == true %> - - hudson.model.Item.Build:authenticated - - <% end %> - - <% if scm == "" %> - - <% else %> - <%= scm %> - <% end %> - <%= node_group %> - false - <% if disabled == true %> - true - <% else %> - false - <% end %> - false - false - - <%= triggers %> - - false - - <%= builders %> - - - <%= publishers %> - - - diff --git a/modules/jenkins_jobs/templates/builder_copy_bundle.xml.erb b/modules/jenkins_jobs/templates/builder_copy_bundle.xml.erb deleted file mode 100644 index 5bfe1073a8..0000000000 --- a/modules/jenkins_jobs/templates/builder_copy_bundle.xml.erb +++ /dev/null @@ -1,9 +0,0 @@ - - $PROJECT-venv - - - - - - /usr/local/jenkins/slave_scripts/copy-bundle.sh - diff --git a/modules/jenkins_jobs/templates/builder_coverage.xml.erb b/modules/jenkins_jobs/templates/builder_coverage.xml.erb deleted file mode 100644 index b6728aa623..0000000000 --- a/modules/jenkins_jobs/templates/builder_coverage.xml.erb +++ /dev/null @@ -1,4 +0,0 @@ - - /usr/local/jenkins/slave_scripts/run-cover.sh - - diff --git a/modules/jenkins_jobs/templates/builder_docs.xml.erb b/modules/jenkins_jobs/templates/builder_docs.xml.erb deleted file mode 100644 index 8e27abc875..0000000000 --- a/modules/jenkins_jobs/templates/builder_docs.xml.erb +++ /dev/null @@ -1,4 +0,0 @@ - - /usr/local/jenkins/slave_scripts/run-docs.sh - - diff --git a/modules/jenkins_jobs/templates/builder_gerrit_git_prep.xml.erb b/modules/jenkins_jobs/templates/builder_gerrit_git_prep.xml.erb deleted file mode 100644 index f0007e4af5..0000000000 --- a/modules/jenkins_jobs/templates/builder_gerrit_git_prep.xml.erb +++ /dev/null @@ -1,3 +0,0 @@ - - /usr/local/jenkins/slave_scripts/gerrit-git-prep.sh <%= site %> - diff --git a/modules/jenkins_jobs/templates/builder_pep8.xml.erb b/modules/jenkins_jobs/templates/builder_pep8.xml.erb deleted file mode 100644 index 640930f7c2..0000000000 --- a/modules/jenkins_jobs/templates/builder_pep8.xml.erb +++ /dev/null @@ -1,3 +0,0 @@ - - tox -v -epep8 | tee pep8.txt - diff --git a/modules/jenkins_jobs/templates/builder_ppa.xml.erb b/modules/jenkins_jobs/templates/builder_ppa.xml.erb deleted file mode 100644 index ca4fec9a1e..0000000000 --- a/modules/jenkins_jobs/templates/builder_ppa.xml.erb +++ /dev/null @@ -1,22 +0,0 @@ - - rm -rf build dist.zip -mkdir build - - - - <%= project %>-tarball - dist/*.tar.gz - build - - BUILD_SELECTOR - - - - #!/bin/bash - -#export DO_UPLOAD="no" -export PROJECT="<%= project %>" -export GERRIT_REFNAME=$BRANCH -/usr/local/jenkins/slave_scripts/create-ppa-package.sh - - diff --git a/modules/jenkins_jobs/templates/builder_python26.xml.erb b/modules/jenkins_jobs/templates/builder_python26.xml.erb deleted file mode 100644 index 7cbb1af523..0000000000 --- a/modules/jenkins_jobs/templates/builder_python26.xml.erb +++ /dev/null @@ -1,3 +0,0 @@ - - /usr/local/jenkins/slave_scripts/run-tox.sh 26 - diff --git a/modules/jenkins_jobs/templates/builder_python27.xml.erb b/modules/jenkins_jobs/templates/builder_python27.xml.erb deleted file mode 100644 index 58d2a1e233..0000000000 --- a/modules/jenkins_jobs/templates/builder_python27.xml.erb +++ /dev/null @@ -1,3 +0,0 @@ - - /usr/local/jenkins/slave_scripts/run-tox.sh 27 - diff --git a/modules/jenkins_jobs/templates/builder_tarball.xml.erb b/modules/jenkins_jobs/templates/builder_tarball.xml.erb deleted file mode 100644 index 72f551e21e..0000000000 --- a/modules/jenkins_jobs/templates/builder_tarball.xml.erb +++ /dev/null @@ -1,3 +0,0 @@ - - /usr/local/jenkins/slave_scripts/create-tarball.sh - diff --git a/modules/jenkins_jobs/templates/builder_venv.xml.erb b/modules/jenkins_jobs/templates/builder_venv.xml.erb deleted file mode 100644 index 3c7611f97e..0000000000 --- a/modules/jenkins_jobs/templates/builder_venv.xml.erb +++ /dev/null @@ -1,3 +0,0 @@ - - /usr/local/jenkins/slave_scripts/build-bundle.sh - diff --git a/modules/jenkins_jobs/templates/logrotate.xml.erb b/modules/jenkins_jobs/templates/logrotate.xml.erb deleted file mode 100644 index b617b7e689..0000000000 --- a/modules/jenkins_jobs/templates/logrotate.xml.erb +++ /dev/null @@ -1,7 +0,0 @@ - - 3 - 20 - -1 - -1 - - diff --git a/modules/jenkins_jobs/templates/publisher_coverage.xml.erb b/modules/jenkins_jobs/templates/publisher_coverage.xml.erb deleted file mode 100644 index aa534f3185..0000000000 --- a/modules/jenkins_jobs/templates/publisher_coverage.xml.erb +++ /dev/null @@ -1,53 +0,0 @@ - - **/coverage.xml - false - - - - CONDITIONAL - 70 - - - LINE - 80 - - - METHOD - 80 - - - - - - - CONDITIONAL - 0 - - - LINE - 0 - - - METHOD - 0 - - - - - - - CONDITIONAL - 0 - - - LINE - 0 - - - METHOD - 0 - - - - ASCII - diff --git a/modules/jenkins_jobs/templates/publisher_docs.xml.erb b/modules/jenkins_jobs/templates/publisher_docs.xml.erb deleted file mode 100644 index e8b1bf78bc..0000000000 --- a/modules/jenkins_jobs/templates/publisher_docs.xml.erb +++ /dev/null @@ -1,20 +0,0 @@ - - <%= project %>.<%= site %>.org - - - docs/<%= project %> - doc/build/html/** - false - - - docs/<%= project %>/_static - doc/build/html/_static/** - false - - - docs/<%= project %>/_sources - doc/build/html/_sources/** - false - - - diff --git a/modules/jenkins_jobs/templates/publisher_pep8.xml.erb b/modules/jenkins_jobs/templates/publisher_pep8.xml.erb deleted file mode 100644 index 0fe94351b7..0000000000 --- a/modules/jenkins_jobs/templates/publisher_pep8.xml.erb +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - - checkstyle - - checkstyle - 10 - 999 - 999 - false - - - - - codenarc - - codenarc - 10 - 999 - 999 - false - - - - - cpd - - cpd - 10 - 999 - 999 - false - - - - - cpplint - - cpplint - 10 - 999 - 999 - false - - - - - csslint - - csslint - 10 - 999 - 999 - false - - - - - findbugs - - findbugs - 10 - 999 - 999 - false - - - - - fxcop - - fxcop - 10 - 999 - 999 - false - - - - - gendarme - - gendarme - 10 - 999 - 999 - false - - - - - jcreport - - jcreport - 10 - 999 - 999 - false - - - - - jslint - - jslint - 10 - 999 - 999 - false - - - - - pep8 - - pep8 - 0 - 1 - 1 - false - **/pep8.txt - - - - pmd - - pmd - 10 - 999 - 999 - false - - - - - pylint - - pylint - 10 - 999 - 999 - false - - - - - simian - - simian - 10 - 999 - 999 - false - - - - - stylecop - - stylecop - 10 - 999 - 999 - false - - - - - 100 - - - default - - diff --git a/modules/jenkins_jobs/templates/publisher_ppa.xml.erb b/modules/jenkins_jobs/templates/publisher_ppa.xml.erb deleted file mode 100644 index bab1265788..0000000000 --- a/modules/jenkins_jobs/templates/publisher_ppa.xml.erb +++ /dev/null @@ -1,4 +0,0 @@ - - build/*.dsc,build/*.tar.gz,build/*.changes - false - diff --git a/modules/jenkins_jobs/templates/publisher_tarball.xml.erb b/modules/jenkins_jobs/templates/publisher_tarball.xml.erb deleted file mode 100644 index d95e3d7978..0000000000 --- a/modules/jenkins_jobs/templates/publisher_tarball.xml.erb +++ /dev/null @@ -1,30 +0,0 @@ - - dist/*.tar.gz - false - - - <%= upload_project %>.<%= site %>.org - - - tarballs/<%= upload_project %>/ - dist/*.tar.gz - false - - - - - - - - - BUILD_SELECTOR=<SpecificBuildSelector><buildNumber>$BUILD_NUMBER</buildNumber></SpecificBuildSelector> -BRANCH=$GERRIT_REFNAME - - - - <%= project %>-ppa - SUCCESS - false - - - diff --git a/modules/jenkins_jobs/templates/publisher_venv.xml.erb b/modules/jenkins_jobs/templates/publisher_venv.xml.erb deleted file mode 100644 index 3a114edecc..0000000000 --- a/modules/jenkins_jobs/templates/publisher_venv.xml.erb +++ /dev/null @@ -1,4 +0,0 @@ - - jenkins_venvs/**/.cache.bundle - false - diff --git a/modules/jenkins_jobs/templates/scm_git.xml.erb b/modules/jenkins_jobs/templates/scm_git.xml.erb deleted file mode 100644 index ee026a7e26..0000000000 --- a/modules/jenkins_jobs/templates/scm_git.xml.erb +++ /dev/null @@ -1,34 +0,0 @@ - - 2 - - - origin - +refs/heads/*:refs/remotes/origin/* - git://github.com/<%= site %>/<%= project %>.git - - - - - ** - - - false - false - false - false - false - true - false - false - - Default - - - - - - - - false - - diff --git a/modules/jenkins_jobs/templates/trigger_gerrit_comment_merge.xml.erb b/modules/jenkins_jobs/templates/trigger_gerrit_comment_merge.xml.erb deleted file mode 100644 index 426e7a5d67..0000000000 --- a/modules/jenkins_jobs/templates/trigger_gerrit_comment_merge.xml.erb +++ /dev/null @@ -1,30 +0,0 @@ - - - - <% trigger_branches.each do |trigger| %> - - PLAIN - <%= site %>/<%= trigger[0] %> - - - ANT - <%= trigger[1] %> - - - - <% end %> - - false - true - false - false - true - false - APRV - 1 - - This change was unable to be automatically merged with the current state of the repository. Please rebase your change and upload a new patchset. - - - - diff --git a/modules/jenkins_jobs/templates/trigger_gerrit_comment_plain.xml.erb b/modules/jenkins_jobs/templates/trigger_gerrit_comment_plain.xml.erb deleted file mode 100644 index b30c2ccdc2..0000000000 --- a/modules/jenkins_jobs/templates/trigger_gerrit_comment_plain.xml.erb +++ /dev/null @@ -1,30 +0,0 @@ - - - - <% trigger_branches.each do |trigger| %> - - PLAIN - <%= site %>/<%= trigger[0] %> - - - ANT - <%= trigger[1] %> - - - - <% end %> - - false - true - false - false - true - false - APRV - 1 - - - - - - diff --git a/modules/jenkins_jobs/templates/trigger_gerrit_ref_updated.xml.erb b/modules/jenkins_jobs/templates/trigger_gerrit_ref_updated.xml.erb deleted file mode 100644 index f019dff879..0000000000 --- a/modules/jenkins_jobs/templates/trigger_gerrit_ref_updated.xml.erb +++ /dev/null @@ -1,30 +0,0 @@ - - - - <% trigger_branches.each do |trigger| %> - - PLAIN - <%= site %>/<%= trigger[0] %> - - - REG_EXP - <%= trigger[1] %> - - - - <% end %> - - false - true - false - false - false - true - - - - - - - - diff --git a/modules/jenkins_jobs/templates/trigger_gerrit_uploaded_merge.xml.erb b/modules/jenkins_jobs/templates/trigger_gerrit_uploaded_merge.xml.erb deleted file mode 100644 index 8966cb1739..0000000000 --- a/modules/jenkins_jobs/templates/trigger_gerrit_uploaded_merge.xml.erb +++ /dev/null @@ -1,36 +0,0 @@ - - - - <% trigger_branches.each do |trigger| %> - - PLAIN - <%= site %>/<%= trigger[0] %> - - - ANT - <%= trigger[1] %> - - - - <% end %> - - 0 - 0 - 1 - 0 - -1 - 0 - 0 - -1 - false - true - true - false - false - false - - This change was unable to be automatically merged with the current state of the repository. Please rebase your change and upload a new patchset. - - - - diff --git a/modules/jenkins_jobs/templates/trigger_gerrit_uploaded_plain.xml.erb b/modules/jenkins_jobs/templates/trigger_gerrit_uploaded_plain.xml.erb deleted file mode 100644 index a31478710e..0000000000 --- a/modules/jenkins_jobs/templates/trigger_gerrit_uploaded_plain.xml.erb +++ /dev/null @@ -1,36 +0,0 @@ - - - - <% trigger_branches.each do |trigger| %> - - PLAIN - <%= site %>/<%= trigger[0] %> - - - ANT - <%= trigger[1] %> - - - - <% end %> - - 0 - 0 - 1 - 0 - -1 - 0 - 0 - -1 - false - true - true - false - false - false - - - - - - diff --git a/modules/jenkins_jobs/templates/trigger_timed_15mins.xml.erb b/modules/jenkins_jobs/templates/trigger_timed_15mins.xml.erb deleted file mode 100644 index 183d4b2d40..0000000000 --- a/modules/jenkins_jobs/templates/trigger_timed_15mins.xml.erb +++ /dev/null @@ -1,3 +0,0 @@ - - */15 * * * * - diff --git a/modules/jenkins_jobs/templates/trigger_timed_midnight.xml.erb b/modules/jenkins_jobs/templates/trigger_timed_midnight.xml.erb deleted file mode 100644 index 0bfde74060..0000000000 --- a/modules/jenkins_jobs/templates/trigger_timed_midnight.xml.erb +++ /dev/null @@ -1,3 +0,0 @@ - - @midnight -