12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- # -*- coding: utf-8 -*-
- import fedmsg.consumers
- from pagure.hooks import jenkins_hook
- import pagure.lib
- from pagure.lib import pagure_ci
- from pagure.lib.model import BASE, Project, User
- from pagure import APP, SESSION
- import pagure.exceptions
- PAGURE_MAIN_REPO = '{base}{name}.git'
- PAGURE_FORK_REPO = '{base}forks/{user}/{name}.git'
- class Integrator(fedmsg.consumers.FedmsgConsumer):
- ''' Integrates Jenkins with Pagure. '''
- topic = [
- 'io.pagure.prod.pagure.pull-request.comment.added',
- 'io.pagure.prod.pagure.pull-request.new',
- 'org.fedoraproject.prod.jenkins.build',
- ]
- config_key = 'integrator.enabled'
- def __init__(self, hub):
- super(Integrator, self).__init__(hub)
- def consume(self, msg):
- ''' Pagure CI consumer which consumes message from
- fedmsg and triggers Jenkins build.
- '''
- topic, msg = msg['topic'], msg['body']
- self.log.info("Received %r, %r", topic, msg.get('msg_id', None))
- msg = msg['msg']
- try:
- if topic.endswith('.pull-request.comment.added'):
- if is_rebase(msg):
- self.trigger_build(msg)
- elif topic.endswith('.pull-request.new'):
- self.trigger_build(msg)
- else:
- self.process_build(msg)
- except jenkins_hook.ConfigNotFound as exc:
- self.log.info('Unconfigured project %r', str(exc))
- except pagure.exceptions.HookInactiveException as exc:
- self.log.info('Hook Inactive for project %r', str(exc))
- def trigger_build(self, msg):
- ''' Triggers or requests to start a build in Jenkins. '''
- pr_id = msg['pullrequest']['id']
- project = msg['pullrequest']['project']['name']
- branch = msg['pullrequest']['branch_from']
- for cfg in jenkins_hook.get_configs(project, jenkins_hook.Service.PAGURE):
- repo = msg['pullrequest'].get('remote_git') or get_repo(cfg, msg)
- self.log.info("Trigger on %s PR #%s from %s: %s",
- project, pr_id, repo, branch)
- pagure_ci.process_pr(self.log, cfg, pr_id, repo, branch)
- def process_build(self, msg):
- ''' Extracts the information from the build and flag the pull-request. '''
- for cfg in jenkins_hook.get_configs(msg['project'], jenkins_hook.Service.JENKINS):
- pagure_ci.process_build(self.log, cfg, msg['build'])
- def get_repo(cfg, msg):
- ''' Formats the URL for pagure repo. '''
- url = PAGURE_MAIN_REPO
- if msg['pullrequest']['repo_from']['parent']:
- url = PAGURE_FORK_REPO
- return url.format(
- base=APP.config['APP_URL'],
- user=msg['pullrequest']['repo_from']['user']['name'],
- name=msg['pullrequest']['repo_from']['name'])
- def is_rebase(msg):
- ''' Returns Rebase if the Pull-request is rebased. '''
- if msg['pullrequest']['status'] != 'Open':
- return False
- try:
- return msg['pullrequest']['comments'][-1]['notification']
- except (IndexError, KeyError):
- return False
|