Blob Blame Raw
# -*- coding: utf-8 -*-

"""
 (c) 2016 - Copyright Red Hat Inc

 Authors:
   Pierre-Yves Chibon <pingou@pingoured.fr>

"""

import flask

from sqlalchemy.exc import SQLAlchemyError

import pagure
import pagure.exceptions
import pagure.lib
import pagure.lib.lib_ci as lib_ci
from pagure import APP, SESSION
from pagure.api import API, APIERROR


@API.route('/ci/jenkins/<pagure_ci_token>/build-finished', methods=['POST'])
def jenkins_ci_notification(pagure_ci_token):
    """
    Jenkins Build Notification
    --------------------------
    At the end of a build on Jenkins, this URL is used (if the project is
    rightly configured) to flag a pull-request with the result of the build.

    ::

        POST /api/0/ci/jenkins/<token>/build-finished

    """

    project = lib_ci.get_project_by_ci_token(SESSION, pagure_ci_token)
    if not project:
        flask.abort(404, 'No project corresponding to this CI token')

    data = flask.request.get_json()
    if not data:
        flask.abort(400, "Bad Request: No JSON retrived")

    build_id = data.get('build', {}).get('number')
    if not build_id:
        flask.abort(400, "Bad Request: No build ID retrived")

    try:
        lib_ci.process_jenkins_build(project, build_id)
    except pagure.exceptions.PagureException as err:
        APP.logger.error('Error processing jenkins notification', exc_info=err)
        flask.abort(400, "Bad Request: %s" % err)

    APP.logger.info('Successfully proccessed jenkins notification')
    return ('', 204)