|
| 1 | +from flask import send_file, Blueprint, current_app |
| 2 | +import requests |
| 3 | +import io |
| 4 | +from six.moves.urllib_parse import urljoin |
| 5 | +from jenkins_badges.coverage_badge import send_error_badge |
| 6 | + |
| 7 | +status_badge = Blueprint('status_badge', __name__) |
| 8 | + |
| 9 | + |
| 10 | +@status_badge.route("/status/<path:job_name>", methods=['GET']) |
| 11 | +def send_status_badge(job_name): |
| 12 | + if job_name == "favicon.ico": |
| 13 | + return "", 200 |
| 14 | + |
| 15 | + jenkins_api_url = generate_jenkins_api_url(job_name) |
| 16 | + auth = (current_app.config['JENKINS_USERNAME'], |
| 17 | + current_app.config['JENKINS_TOKEN']) |
| 18 | + auth = None if auth == (None, None) else auth |
| 19 | + jenkins_resp = requests.get(jenkins_api_url, auth=auth) |
| 20 | + print("GET {} {}".format(jenkins_resp.status_code, jenkins_api_url)) |
| 21 | + if jenkins_resp.status_code != 200: |
| 22 | + return send_error_badge() |
| 23 | + |
| 24 | + status = extract_status(jenkins_resp) |
| 25 | + colour = "brightgreen" if status == "SUCCESS" else "red" |
| 26 | + status_shield_url = generate_shield_url(status, colour) |
| 27 | + shield_resp = requests.get(status_shield_url, stream=True) |
| 28 | + print("GET {} {}".format(shield_resp.status_code, status_shield_url)) |
| 29 | + if shield_resp.status_code != 200: |
| 30 | + return send_error_badge() |
| 31 | + |
| 32 | + path = io.BytesIO(shield_resp.content) |
| 33 | + print("SENDING {} build status badge of {}".format(colour, status)) |
| 34 | + return send_file(path, mimetype="image/svg+xml", cache_timeout=30), 200 |
| 35 | + |
| 36 | + |
| 37 | +def generate_jenkins_api_url(job_name): |
| 38 | + api_endpoint = "job/{}/lastBuild/api/json".format(job_name) |
| 39 | + return urljoin(current_app.config["JENKINS_BASE_URL"] + "/", api_endpoint) |
| 40 | + |
| 41 | + |
| 42 | +def extract_status(jresp): |
| 43 | + jenkins_resp = jresp.json() |
| 44 | + status = jenkins_resp["result"] |
| 45 | + return status |
| 46 | + |
| 47 | + |
| 48 | +def generate_shield_url(status, colour): |
| 49 | + return "https://img.shields.io/badge/build%20status-{}-{}.svg".format(status, colour) |
0 commit comments