Skip to content

Commit d407384

Browse files
author
Idi Eradiri
committed
feat: add a build status badge
1 parent 5dadb44 commit d407384

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

jenkins_badges/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ def create_app(from_envvar=False, base_url=None, username=None, token=None,
5353
raise ValueError("must supply a valid base url for the jenkins instance")
5454

5555
from jenkins_badges.coverage_badge import coverage_badge
56+
from jenkins_badges.status_badge import status_badge
5657
app.register_blueprint(coverage_badge)
58+
app.register_blueprint(status_badge)
5759

5860
return app
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
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

Comments
 (0)