diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 9fd79be..4ccc5b5 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1259,7 +1259,7 @@ def add_pull_request_comment(session, request, commit, tree_id, filename, and request.project.ci_hook \ and not request.project.private: pagure.lib.tasks_services.trigger_ci_build.delay( - pr_uid=request.uid, + project_name=request.project_from.fullname, pr_id=request.id, branch=request.branch_from, ci_type=request.project.ci_hook.ci_type @@ -1280,7 +1280,7 @@ def add_pull_request_comment(session, request, commit, tree_id, filename, and pagure_config.get('PAGURE_CI_SERVICES') \ and request.project.ci_hook: pagure.lib.tasks_services.trigger_ci_build.delay( - pr_uid=request.uid, + project_name=request.project_from.fullname, pr_id=request.id, branch=request.branch_from, ci_type=request.project.ci_hook.ci_type @@ -1759,7 +1759,7 @@ def new_pull_request(session, branch_from, and request.project.ci_hook \ and not request.project.private: pagure.lib.tasks_services.trigger_ci_build.delay( - pr_uid=request.uid, + project_name=request.project_from.fullname, pr_id=request.id, branch=request.branch_from, ci_type=request.project.ci_hook.ci_type diff --git a/pagure/lib/lib_ci.py b/pagure/lib/lib_ci.py index bba8d1e..12e6fa4 100644 --- a/pagure/lib/lib_ci.py +++ b/pagure/lib/lib_ci.py @@ -85,7 +85,7 @@ def process_jenkins_build(session, project, build_id, requestfolder): session.commit() -def trigger_jenkins_build(project_name, branch, pr_id): +def trigger_jenkins_build(project_path, url, token, branch, pr_id): """ Trigger a build on a jenkins instance.""" try: import jenkins @@ -94,16 +94,13 @@ def trigger_jenkins_build(project_name, branch, pr_id): 'Pagure-CI: Failed to load the jenkins module, bailing') return - session = pagure.lib.create_session(pagure_config['DB_URL']) _log.info('Jenkins CI') - project = pagure.lib.get_authorized_project(session, project_name) - repo = '%s/%s' % ( pagure_config['GIT_URL_GIT'].rstrip('/'), - project.path) + project_path) - url = project.ci_hook.ci_url.rstrip('/') + url = url.rstrip('/') # Jenkins Base URL base_url, name = url.split('/job/', 1) jenkins_name = name.rstrip('/').replace('/job/', '/') @@ -121,11 +118,8 @@ def trigger_jenkins_build(project_name, branch, pr_id): server.build_job( name=jenkins_name, parameters=data, - token=project.ci_hook.pagure_ci_token + token=token ) _log.info('Pagure-CI: Build triggered') except Exception as err: _log.info('Pagure-CI:An error occured: %s', err) - session.close() - - session.close() diff --git a/pagure/lib/tasks_services.py b/pagure/lib/tasks_services.py index 3661cd1..3b7eefe 100644 --- a/pagure/lib/tasks_services.py +++ b/pagure/lib/tasks_services.py @@ -30,6 +30,7 @@ from pagure.config import config as pagure_config from pagure.lib.tasks import pagure_task from pagure.mail_logging import format_callstack from pagure.lib.lib_ci import trigger_jenkins_build +from pagure.utils import split_project_fullname # logging.config.dictConfig(pagure_config.get('LOGGING') or {'version': 1}) _log = logging.getLogger(__name__) @@ -332,30 +333,47 @@ def load_json_commits_to_db( @conn.task(queue=pagure_config.get('CI_CELERY_QUEUE', None), bind=True) @pagure_task -def trigger_ci_build(self, session, pr_uid, pr_id, branch, ci_type): +def trigger_ci_build(self, project_name, pr_id, branch, ci_type): + ''' Triggers a new run of the CI system on the specified pull-request. ''' pagure.lib.plugins.get_plugin('Pagure CI') - _log.info('Pagure-CI: Looking for PR: %s', pr_uid) - request = pagure.lib.get_request_by_uid(session, pr_uid) + user, namespace, project_name = split_project_fullname(project_name) - _log.info('Pagure-CI: PR retrieved: %s', request) + _log.info('Pagure-CI: Looking for project: %s', project_name) + project = pagure.lib.get_authorized_project(session=session, + project_name=project_name, + user=user, + namespace=namespace) - if not request: - _log.warning( - 'Pagure-CI: No request could be found for the uid %s', pr_uid) + if project is None: + _log.warning('Pagure-CI: No project could be found for the name %s', + project_name) session.close() return + _log.info('Pagure-CI: project retrieved: %s', project.fullname) + _log.info( - "Pagure-CI: Trigger on %s PR #%s from %s: %s", - request.project.fullname, pr_id, - request.project_from.fullname, branch) + "Pagure-CI: Trigger from %s PR #%s branch: %s", + project.fullname, pr_id, branch) if ci_type == 'jenkins': - trigger_jenkins_build(request.project.fullname, branch, pr_id) + + if project.is_fork: + url = project.parent.ci_hook.ci_url + token = project.parent.ci_hook.pagure_ci_token + else: + url = project.ci_hook.ci_url + token = project.ci_hook.pagure_ci_token + + trigger_jenkins_build(project_path=project.path, + url=url, + token=token, + branch=branch, + pr_id=pr_id) else: _log.warning('Pagure-CI:Un-supported CI type') diff --git a/pagure/utils.py b/pagure/utils.py index f58057a..0a82058 100644 --- a/pagure/utils.py +++ b/pagure/utils.py @@ -338,3 +338,22 @@ def wait_for_task_post(taskid, form, endpoint, initial=False, **kwargs): form_data=form.data, csrf=form.csrf_token, initial=initial) + + +def split_project_fullname(project_name): + """Returns the user, namespace and + project name from a project fullname""" + + user = None + namespace = None + if '/' in project_name: + project_items = project_name.split('/') + + if len(project_items) == 2: + namespace, project_name = project_items + elif len(project_items) == 3: + _, user, project_name = project_items + elif len(project_items) == 4: + _, user, namespace, project_name = project_items + + return (user, namespace, project_name)