From 5599a3daa8a9a4d34403896becd395c99e8ffd3a Mon Sep 17 00:00:00 2001 From: Andrew Hutchings Date: Mon, 14 May 2012 20:10:00 +0100 Subject: [PATCH] Version 2.1 of Jenkins Jobs Builder * Adds delete support * Adds check-* job support Change-Id: Ia7a19cebd32cb348e26b086353a8b5225e1e5837 --- modules/jenkins_jobs/files/jenkins_jobs.py | 46 +++-- modules/jenkins_jobs/files/jenkins_talker.py | 8 +- .../files/modules/trigger_gerrit.py | 7 +- .../files/projects/stackforge/reddwarf.yml | 160 ++++++++++++++++++ 4 files changed, 201 insertions(+), 20 deletions(-) diff --git a/modules/jenkins_jobs/files/jenkins_jobs.py b/modules/jenkins_jobs/files/jenkins_jobs.py index dd9a08f494..b476b15786 100644 --- a/modules/jenkins_jobs/files/jenkins_jobs.py +++ b/modules/jenkins_jobs/files/jenkins_jobs.py @@ -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 diff --git a/modules/jenkins_jobs/files/jenkins_talker.py b/modules/jenkins_jobs/files/jenkins_talker.py index ec64b89aa8..84f2ac57c8 100644 --- a/modules/jenkins_jobs/files/jenkins_talker.py +++ b/modules/jenkins_jobs/files/jenkins_talker.py @@ -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' diff --git a/modules/jenkins_jobs/files/modules/trigger_gerrit.py b/modules/jenkins_jobs/files/modules/trigger_gerrit.py index 895aaeba77..057a6b4c72 100644 --- a/modules/jenkins_jobs/files/modules/trigger_gerrit.py +++ b/modules/jenkins_jobs/files/modules/trigger_gerrit.py @@ -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') diff --git a/modules/jenkins_jobs/files/projects/stackforge/reddwarf.yml b/modules/jenkins_jobs/files/projects/stackforge/reddwarf.yml index 0d3f29cb80..afad964d3c 100644 --- a/modules/jenkins_jobs/files/projects/stackforge/reddwarf.yml +++ b/modules/jenkins_jobs/files/projects/stackforge/reddwarf.yml @@ -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' + +