From ebf17a164d6a4cd6eb8955a16b77c7e93dd6ace5 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Jul 26 2016 07:41:45 +0000 Subject: Fist cut for having CI work from inside Pagure --- diff --git a/pagure/consumer.py b/pagure/consumer.py index b01496b..738ead4 100644 --- a/pagure/consumer.py +++ b/pagure/consumer.py @@ -41,10 +41,10 @@ class Integrator(fedmsg.consumers.FedmsgConsumer): pr_id = msg['pullrequest']['id'] project = msg['pullrequest']['project']['name'] branch = msg['pullrequest']['branch_from'] - print project, jenkins_hook.Service.PAGURE + for cfg in jenkins_hook.get_configs(project, jenkins_hook.Service.PAGURE): repo = msg['pullrequest'].get('remote_git') or get_repo(cfg, msg) - + print repo self.log.info("Trigger on %s PR #%s from %s: %s", project, pr_id, repo, branch) diff --git a/pagure/hooks/jenkins_hook.py b/pagure/hooks/jenkins_hook.py index 902c87d..348ee44 100644 --- a/pagure/hooks/jenkins_hook.py +++ b/pagure/hooks/jenkins_hook.py @@ -19,7 +19,7 @@ from sqlalchemy.orm import backref from sqlalchemy.ext.declarative import declarative_base from pagure.hooks import BaseHook, RequiredIf -from pagure.lib.model import BASE, Project, User +from pagure.lib.model import BASE, Project from pagure import get_repo_path @@ -79,11 +79,6 @@ class PagureCI(BASE): def __repr__(self): return ''.format(self) -def init_db(db): - from sqlalchemy import create_engine - engine = create_engine(db, convert_unicode=True) - BASE.metadata.create_all(bind=engine) - class ConfigNotFound(Exception): pass @@ -98,7 +93,7 @@ def get_configs(project_name, service): :raises ConfigNotFound: when no configuration matches """ - cfg = BASE.query(PagureCI).filter(service == project_name).all() + cfg = BASE.metadata.bind.query(PagureCI).filter(service == project_name).all() if len(cfg) == 0: raise ConfigNotFound(project_name) return cfg diff --git a/pagure/lib/pagure_ci.py b/pagure/lib/pagure_ci.py index b6e2723..d4ddf9d 100644 --- a/pagure/lib/pagure_ci.py +++ b/pagure/lib/pagure_ci.py @@ -5,6 +5,7 @@ from sqlalchemy.orm import scoped_session, sessionmaker from sqlalchemy import create_engine from pagure.hooks import jenkins_hook from pagure.lib import model +from pagure import APP import json import logging @@ -67,7 +68,7 @@ def process_build(logger, cfg, build_id): # Comment in Pagure logger.info('Updating %s PR %d: %s', cfg.pagure_name, pr_id, result) try: - post_flag(logger, cfg.display_name, cfg.pagure_url, cfg.pagure_token, + post_flag(logger, "Jenkins", cfg.pagure_url, cfg.pagure_token, cfg.pagure_name, pr_id, result, url) except KeyError as exc: logger.warning('Unknown build status', exc_info=exc) @@ -94,23 +95,6 @@ def post_data(logger, *args, **kwargs): if resp.status_code < 200 or resp.status_code >= 300: logger.error('Network request failed: %d: %s', resp.status_code, resp.text) - -@app.route('/hooks//build-finished', methods=['POST']) -def hook_finished(token): - try: - data = json.loads(flask.request.get_data()) - cfg = jenkins_hook.get_configs(data['name'], jenkins_hook.Service.JENKINS)[0] - build_id = data['build']['number'] - if token != cfg.hook_token: - raise ValueError('Token mismatch') - except (TypeError, ValueError, KeyError, models.ConfigNotFound) as exc: - app.logger.error('Error processing jenkins notification', exc_info=exc) - return ('Bad request...\n', 400, {'Content-Type': 'text/plain'}) - app.logger.info('Received jenkins notification') - process_build(app.logger, cfg, build_id) - return ('', 204) - - @app.errorhandler(403) def forbidden(e): return flask.render_template('forbidden.html'), 403 diff --git a/pagure/ui/app.py b/pagure/ui/app.py index a395e4a..7e4996f 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -13,6 +13,10 @@ from math import ceil from sqlalchemy.exc import SQLAlchemyError +from pagure.hooks import jenkins_hook +import json +from pagure.lib import pagure_ci + import pagure.exceptions import pagure.lib import pagure.lib.git @@ -667,3 +671,21 @@ def ssh_hostkey(): return flask.render_template( 'doc_ssh_keys.html', ) + + +@APP.route('/hooks//build-finished', methods=['POST']) +def hook_finished(token): + print "Hello" + try: + data = json.loads(flask.request.get_data()) + cfg = jenkins_hook.get_configs(data['name'], jenkins_hook.Service.JENKINS)[0] + build_id = data['build']['number'] + print data , cfg, build_id + if token != cfg.hook_token: + raise ValueError('Token mismatch') + except (TypeError, ValueError, KeyError, jenkins_hook.ConfigNotFound) as exc: + APP.logger.error('Error processing jenkins notification', exc_info=exc) + return ('Bad request...\n', 400, {'Content-Type': 'text/plain'}) + APP.logger.info('Received jenkins notification') + pagure_ci.process_build(APP.logger, cfg, build_id) + return ('', 204)