Skip to content

Commit 1feaafe

Browse files
committed
output structured comments for build events
1 parent 2b46a6d commit 1feaafe

File tree

3 files changed

+136
-27
lines changed

3 files changed

+136
-27
lines changed

homu/comments.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import json
2+
3+
4+
class Comment:
5+
def __init__(self, **args):
6+
if len(args) != len(self.params):
7+
raise KeyError("different number of params")
8+
for key, value in args.items():
9+
if key in self.params:
10+
setattr(self, key, value)
11+
else:
12+
raise KeyError("unknown attribute: %s" % key)
13+
14+
def jsonify(self):
15+
out = {"type": self.__class__.__name__}
16+
for param in self.params:
17+
out[param] = getattr(self, param)
18+
return json.dumps(out, separators=(',', ':'))
19+
20+
21+
class BuildStarted(Comment):
22+
params = ["head_sha", "merge_sha"]
23+
24+
def render(self):
25+
return ":hourglass: Testing commit %s with merge %s..." % (
26+
self.head_sha, self.merge_sha,
27+
)
28+
29+
30+
class TryBuildStarted(Comment):
31+
params = ["head_sha", "merge_sha"]
32+
33+
def render(self):
34+
return ":hourglass: Trying commit %s with merge %s..." % (
35+
self.head_sha, self.merge_sha,
36+
)
37+
38+
39+
class BuildCompleted(Comment):
40+
params = ["approved_by", "base_ref", "builders", "merge_sha"]
41+
42+
def render(self):
43+
urls = ", ".join(
44+
"[%s](%s)" % kv for kv in sorted(self.builders.items())
45+
)
46+
return (
47+
":sunny: Test successful - %s\n"
48+
"Approved by: %s\n"
49+
"Pushing %s to %s..."
50+
% (
51+
urls, self.approved_by, self.merge_sha, self.base_ref,
52+
)
53+
)
54+
55+
56+
class TryBuildCompleted(Comment):
57+
params = ["builders", "merge_sha"]
58+
59+
def render(self):
60+
urls = ", ".join(
61+
"[%s](%s)" % kv for kv in sorted(self.builders.items())
62+
)
63+
return ":sunny: Try build successful - %s\nBuild commit: %s" % (
64+
urls, self.merge_sha,
65+
)
66+
67+
68+
class BuildFailed(Comment):
69+
params = ["builder_url", "builder_name"]
70+
71+
def render(self):
72+
return ":broken_heart: Test failed - [%s](%s)" % (
73+
self.builder_name, self.builder_url
74+
)
75+
76+
77+
class TryBuildFailed(Comment):
78+
params = ["builder_url", "builder_name"]
79+
80+
def render(self):
81+
return ":broken_heart: Test failed - [%s](%s)" % (
82+
self.builder_name, self.builder_url
83+
)

homu/main.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import json
55
import re
66
import functools
7+
from . import comments
78
from . import utils
89
from .utils import lazy_debug
910
import logging
@@ -177,8 +178,12 @@ def get_issue(self):
177178
issue = self.issue = self.get_repo().issue(self.num)
178179
return issue
179180

180-
def add_comment(self, text):
181-
self.get_issue().create_comment(text)
181+
def add_comment(self, comment):
182+
if issubclass(comment.__class__, comments.Comment):
183+
comment = "%s\n<!-- homu: %s -->" % (
184+
comment.render(), comment.jsonify(),
185+
)
186+
self.get_issue().create_comment(comment)
182187

183188
def change_labels(self, event):
184189
event = self.label_events.get(event.value, {})
@@ -1289,7 +1294,16 @@ def start_build(state, repo_cfgs, buildbot_slots, logger, db, git_cfg):
12891294
desc,
12901295
context='homu')
12911296

1292-
state.add_comment(':hourglass: ' + desc)
1297+
if state.try_:
1298+
state.add_comment(comments.TryBuildStarted(
1299+
head_sha=state.head_sha,
1300+
merge_sha=state.merge_sha,
1301+
))
1302+
else:
1303+
state.add_comment(comments.BuildStarted(
1304+
head_sha=state.head_sha,
1305+
merge_sha=state.merge_sha,
1306+
))
12931307

12941308
return True
12951309

homu/server.py

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
synchronize,
1010
LabelEvent,
1111
)
12+
from . import comments
1213
from . import utils
1314
from .utils import lazy_debug
1415
import github3
@@ -558,19 +559,20 @@ def report_build_res(succ, url, builder, state, logger, repo_cfg):
558559
if succ:
559560
if all(x['res'] for x in state.build_res.values()):
560561
state.set_status('success')
561-
desc = 'Test successful'
562-
utils.github_create_status(state.get_repo(), state.head_sha,
563-
'success', url, desc, context='homu')
564-
565-
urls = ', '.join('[{}]({})'.format(builder, x['url']) for builder, x in sorted(state.build_res.items())) # noqa
566-
test_comment = ':sunny: {} - {}'.format(desc, urls)
562+
utils.github_create_status(
563+
state.get_repo(), state.head_sha,
564+
'success', url, "Test successful", context='homu'
565+
)
567566

568567
if state.approved_by and not state.try_:
569-
comment = (test_comment + '\n' +
570-
'Approved by: {}\nPushing {} to {}...'
571-
).format(state.approved_by, state.merge_sha,
572-
state.base_ref)
573-
state.add_comment(comment)
568+
state.add_comment(comments.BuildCompleted(
569+
approved_by=state.approved_by,
570+
base_ref=state.base_ref,
571+
builders=dict(
572+
(k, v["url"]) for k, v in state.build_res.items()
573+
),
574+
merge_sha=state.merge_sha,
575+
))
574576
state.change_labels(LabelEvent.SUCCEED)
575577
try:
576578
try:
@@ -598,24 +600,34 @@ def report_build_res(succ, url, builder, state, logger, repo_cfg):
598600

599601
state.add_comment(':eyes: ' + desc)
600602
else:
601-
comment = (test_comment + '\n' +
602-
'State: approved={} try={}'
603-
).format(state.approved_by, state.try_)
604-
state.add_comment(comment)
603+
state.add_comment(comments.TryBuildCompleted(
604+
builders=dict(
605+
(k, v["url"]) for k, v in state.build_res.items()
606+
),
607+
merge_sha=state.merge_sha,
608+
))
605609
state.change_labels(LabelEvent.TRY_SUCCEED)
606610

607611
else:
608612
if state.status == 'pending':
609613
state.set_status('failure')
610-
desc = 'Test failed'
611-
utils.github_create_status(state.get_repo(), state.head_sha,
612-
'failure', url, desc, context='homu')
613-
614-
state.add_comment(':broken_heart: {} - [{}]({})'.format(desc,
615-
builder,
616-
url))
617-
event = LabelEvent.TRY_FAILED if state.try_ else LabelEvent.FAILED
618-
state.change_labels(event)
614+
utils.github_create_status(
615+
state.get_repo(), state.head_sha,
616+
'failure', url, "Test failed", context='homu'
617+
)
618+
619+
if state.try_:
620+
state.add_comment(comments.TryBuildFailed(
621+
builder_url=url,
622+
builder_name=builder,
623+
))
624+
state.change_labels(LabelEvent.TRY_FAILED)
625+
else:
626+
state.add_comment(comments.BuildFailed(
627+
builder_url=url,
628+
builder_name=builder,
629+
))
630+
state.change_labels(LabelEvent.FAILED)
619631

620632
g.queue_handler()
621633

0 commit comments

Comments
 (0)