Version 2.1 of Jenkins Jobs Builder

* Adds delete support
* Adds check-* job support

Change-Id: Ia7a19cebd32cb348e26b086353a8b5225e1e5837
This commit is contained in:
Andrew Hutchings 2012-05-14 20:10:00 +01:00
parent f212c0895d
commit 5599a3daa8
4 changed files with 201 additions and 20 deletions

View File

@ -153,21 +153,35 @@ class Jenkins(object):
xml = self.jenkins.get_job_config(job_name)
return hashlib.md5(xml).hexdigest()
def delete_job(self, job_name):
if self.jenkins.is_job(job_name):
self.jenkins.delete_job(job_name)
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)
def delete_job():
remote_jenkins = Jenkins(config.get('jenkins','url'), config.get('jenkins','user'), config.get('jenkins','password'))
remote_jenkins.delete_job(options.name)
def update_job():
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
if options.command == 'delete':
delete_job()
elif options.command == 'update':
update_job()
if cache.has_changed(job, md5):
remote_jenkins.update_job(job, xml.output())
cache.set(job, md5)
except StopIteration:
break

View File

@ -42,13 +42,17 @@ class JenkinsTalker(object):
raise JenkinsTalkerException('error posting XML')
curl.close()
def _get_request(self, path, pass_codes):
def _get_request(self, path, pass_codes, post=False):
curl = pycurl.Curl()
response = StringIO()
curl.setopt(pycurl.URL, self.url + path)
if post == True:
curl.setopt(pycurl.POST, 1)
curl.setopt(pycurl.POSTFIELDSIZE, 0)
curl.setopt(pycurl.USERPWD, self.user + ":" + self.password)
curl.setopt(pycurl.WRITEFUNCTION, response.write)
curl.perform()
print response.getvalue()
if curl.getinfo(pycurl.RESPONSE_CODE) not in pass_codes:
raise JenkinsTalkerException('error getting response')
curl.close()
@ -67,7 +71,7 @@ class JenkinsTalker(object):
def delete_job(self, job_name):
path = 'job/' + job_name + '/doDelete'
pass_codes = [ 302 ]
self._get_request(path, pass_codes)
self._get_request(path, pass_codes, True)
def get_job_config(self, job_name):
path = 'job/' + job_name + '/config.xml'

View File

@ -33,6 +33,8 @@
# branchCompareType: 'ANT'
# branchPattern: '**'
# ...
#
# triggerApprovalCategory and triggerApprovalValue only required if triggerOnCommentAddedEvent: 'true'
import xml.etree.ElementTree as XML
@ -61,8 +63,9 @@ class trigger_gerrit(object):
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'])
if trigger_data['triggerOnCommentAddedEvent'] == 'true':
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')

View File

@ -327,3 +327,163 @@ scm:
assignednode:
node: 'oneiric'
---
# pep8-check
modules:
- properties
- scm
- assignednode
- trigger_gerrit
- builders
- publisher_pep8
main:
name: 'check-reddwarf-pep8'
site: 'stackforge'
project: 'reddwarf'
authenticatedBuild: 'true'
disabled: 'true'
trigger:
triggerOnPatchsetUploadedEvent: 'true'
triggerOnChangeMergedEvent: 'false'
triggerOnCommentAddedEvent: 'false'
triggerOnRefUpdatedEvent: 'false'
failureMessage: ''
projects:
- projectCompareType: 'PLAIN'
projectPattern: 'stackforge/reddwarf'
branchCompareType: 'ANT'
branchPattern: '**'
builders:
- gerrit_git_prep
- copy_bundle
- pep8
scm:
scm: 'false'
assignednode:
node: 'oneiric'
---
# python26-check
modules:
- properties
- scm
- assignednode
- trigger_gerrit
- builders
- publisher_none
main:
name: 'check-reddwarf-python26'
site: 'stackforge'
project: 'reddwarf'
authenticatedBuild: 'true'
disabled: 'true'
trigger:
triggerOnPatchsetUploadedEvent: 'true'
triggerOnChangeMergedEvent: 'false'
triggerOnCommentAddedEvent: 'true'
triggerOnRefUpdatedEvent: 'false'
failureMessage: ''
projects:
- projectCompareType: 'PLAIN'
projectPattern: 'stackforge/reddwarf'
branchCompareType: 'ANT'
branchPattern: '**'
builders:
- gerrit_git_prep
- copy_bundle
- python26
scm:
scm: 'true'
assignednode:
node: 'oneiric'
---
# python27-check
modules:
- properties
- scm
- assignednode
- trigger_gerrit
- builders
- publisher_none
main:
name: 'check-reddwarf-python27'
site: 'stackforge'
project: 'reddwarf'
authenticatedBuild: 'true'
disabled: 'true'
trigger:
triggerOnPatchsetUploadedEvent: 'true'
triggerOnChangeMergedEvent: 'false'
triggerOnCommentAddedEvent: 'false'
triggerOnRefUpdatedEvent: 'false'
failureMessage: ''
projects:
- projectCompareType: 'PLAIN'
projectPattern: 'stackforge/reddwarf'
branchCompareType: 'ANT'
branchPattern: '**'
builders:
- gerrit_git_prep
- copy_bundle
- python27
scm:
scm: 'true'
assignednode:
node: 'oneiric'
---
# merge-check
modules:
- properties
- scm
- assignednode
- trigger_gerrit
- builders
- publisher_none
main:
name: 'check-reddwarf-merge'
site: 'stackforge'
project: 'reddwarf'
authenticatedBuild: 'true'
disabled: 'true'
trigger:
triggerOnPatchsetUploadedEvent: 'true'
triggerOnChangeMergedEvent: 'false'
triggerOnCommentAddedEvent: 'false'
triggerOnRefUpdatedEvent: 'false'
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'