1 |
commit: 0486f29cc0842870d85029553f2c229799896fa5 |
2 |
Author: Magnus Granberg <zorry <AT> gentoo <DOT> org> |
3 |
AuthorDate: Mon Jul 4 17:43:38 2022 +0000 |
4 |
Commit: Magnus Granberg <zorry <AT> gentoo <DOT> org> |
5 |
CommitDate: Mon Jul 4 17:43:38 2022 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/tinderbox-cluster.git/commit/?id=0486f29c |
7 |
|
8 |
Add support for search bugs on b.g.o |
9 |
|
10 |
Signed-off-by: Magnus Granberg <zorry <AT> gentoo.org> |
11 |
|
12 |
buildbot_gentoo_ci/steps/bugs.py | 124 +++++++++++++++++++++++++++++++++++++++ |
13 |
buildbot_gentoo_ci/steps/logs.py | 14 ++++- |
14 |
2 files changed, 135 insertions(+), 3 deletions(-) |
15 |
|
16 |
diff --git a/buildbot_gentoo_ci/steps/bugs.py b/buildbot_gentoo_ci/steps/bugs.py |
17 |
new file mode 100644 |
18 |
index 0000000..e43c926 |
19 |
--- /dev/null |
20 |
+++ b/buildbot_gentoo_ci/steps/bugs.py |
21 |
@@ -0,0 +1,124 @@ |
22 |
+# Copyright 2022 Gentoo Authors |
23 |
+# Distributed under the terms of the GNU General Public License v2 |
24 |
+ |
25 |
+import re |
26 |
+ |
27 |
+from twisted.internet import defer |
28 |
+ |
29 |
+from buildbot.process.buildstep import BuildStep |
30 |
+from buildbot.process.results import SUCCESS |
31 |
+from buildbot.process.results import FAILURE |
32 |
+from buildbot.process.results import SKIPPED |
33 |
+ |
34 |
+from bugz.cli import check_bugz_token, login, list_bugs |
35 |
+from bugz.cli_argparser import make_arg_parser |
36 |
+from bugz.configfile import load_config |
37 |
+from bugz.settings import Settings |
38 |
+from bugz.exceptions import BugzError |
39 |
+from bugz.log import log_error, log_info |
40 |
+ |
41 |
+from portage.versions import cpv_getversion, pkgsplit, catpkgsplit |
42 |
+ |
43 |
+# Origins: bugz.cli |
44 |
+# Modifyed by Gentoo Authors. |
45 |
+# main |
46 |
+def main_bugz(args): |
47 |
+ ArgParser = make_arg_parser() |
48 |
+ opt = ArgParser.parse_args(args) |
49 |
+ |
50 |
+ ConfigParser = load_config(getattr(opt, 'config_file', None)) |
51 |
+ |
52 |
+ check_bugz_token() |
53 |
+ settings = Settings(opt, ConfigParser) |
54 |
+ return settings |
55 |
+ |
56 |
+# search |
57 |
+def search_bugz(args): |
58 |
+ settings = main_bugz(args) |
59 |
+ valid_keys = ['alias', 'assigned_to', 'component', 'creator', |
60 |
+ 'limit', 'offset', 'op_sys', 'platform', |
61 |
+ 'priority', 'product', 'resolution', 'severity', |
62 |
+ 'version', 'whiteboard', 'cc'] |
63 |
+ |
64 |
+ params = {} |
65 |
+ d = vars(settings) |
66 |
+ for key in d: |
67 |
+ if key in valid_keys: |
68 |
+ params[key] = d[key] |
69 |
+ if 'search_statuses' in d: |
70 |
+ if 'all' not in d['search_statuses']: |
71 |
+ params['status'] = d['search_statuses'] |
72 |
+ if 'terms' in d: |
73 |
+ params['summary'] = d['terms'] |
74 |
+ |
75 |
+ if not params: |
76 |
+ raise BugzError('Please give search terms or options.') |
77 |
+ |
78 |
+ log_info('Searching for bugs meeting the following criteria:') |
79 |
+ for key in params: |
80 |
+ log_info(' {0:<20} = {1}'.format(key, params[key])) |
81 |
+ |
82 |
+ login(settings) |
83 |
+ |
84 |
+ result = settings.call_bz(settings.bz.Bug.search, params)['bugs'] |
85 |
+ |
86 |
+ if not len(result): |
87 |
+ log_info('No bugs found.') |
88 |
+ return [] |
89 |
+ else: |
90 |
+ list_bugs(result, settings) |
91 |
+ return result |
92 |
+ |
93 |
+class GetBugs(BuildStep): |
94 |
+ |
95 |
+ name = 'GetBugs' |
96 |
+ description = 'Running' |
97 |
+ descriptionDone = 'Ran' |
98 |
+ descriptionSuffix = None |
99 |
+ haltOnFailure = True |
100 |
+ flunkOnFailure = True |
101 |
+ |
102 |
+ def __init__(self, **kwargs): |
103 |
+ super().__init__(**kwargs) |
104 |
+ |
105 |
+ @defer.inlineCallbacks |
106 |
+ def find_match(self, buglist): |
107 |
+ log = yield self.addLog('Bugs') |
108 |
+ yield log.addStdout('Open Bugs\n') |
109 |
+ match = False |
110 |
+ for bug in buglist: |
111 |
+ yield log.addStdout('Bug: ' + str(bug['id']) + ' Summary: ' + bug['summary'] +'\n') |
112 |
+ if re.search(self.getProperty('error_dict')['title_phase'][:20], bug['summary']): |
113 |
+ print('Bug found') |
114 |
+ print(bug) |
115 |
+ match = {} |
116 |
+ match['id'] = bug['id'] |
117 |
+ match['summary'] = bug['summary'] |
118 |
+ if match: |
119 |
+ yield log.addStdout('Match bug found\n') |
120 |
+ yield log.addStdout('Bug: ' + str(match['id']) + ' Summary: ' + match['summary'] +'\n') |
121 |
+ self.setProperty("bgo", match, 'bgo') |
122 |
+ return |
123 |
+ yield log.addStdout('NO Match bug found\n') |
124 |
+ self.setProperty("bgo", False, 'bgo') |
125 |
+ |
126 |
+ @defer.inlineCallbacks |
127 |
+ def run(self): |
128 |
+ # self.gentooci = self.master.namedServices['services'].namedServices['gentooci'] |
129 |
+ cpv = self.getProperty('error_dict')['cpv'] |
130 |
+ c = yield catpkgsplit(cpv)[0] |
131 |
+ p = yield catpkgsplit(cpv)[1] |
132 |
+ cp = c + '/' + p |
133 |
+ # search for open bugs |
134 |
+ args = [] |
135 |
+ args.append('--skip-auth') |
136 |
+ args.append('search') |
137 |
+ # set limit |
138 |
+ # set date last 30 days |
139 |
+ # search for cp |
140 |
+ args.append(cp) |
141 |
+ print(args) |
142 |
+ buglist = search_bugz(args) |
143 |
+ print(buglist) |
144 |
+ self.find_match(buglist) |
145 |
+ return SUCCESS |
146 |
|
147 |
diff --git a/buildbot_gentoo_ci/steps/logs.py b/buildbot_gentoo_ci/steps/logs.py |
148 |
index d6ee705..7a63658 100644 |
149 |
--- a/buildbot_gentoo_ci/steps/logs.py |
150 |
+++ b/buildbot_gentoo_ci/steps/logs.py |
151 |
@@ -22,6 +22,7 @@ from buildbot.plugins import steps |
152 |
|
153 |
from buildbot_gentoo_ci.steps import minio |
154 |
from buildbot_gentoo_ci.steps import master as master_steps |
155 |
+from buildbot_gentoo_ci.steps import bugs |
156 |
|
157 |
def PersOutputOfLogParser(rc, stdout, stderr): |
158 |
build_summery_output = {} |
159 |
@@ -299,6 +300,7 @@ class MakeIssue(BuildStep): |
160 |
cpv = self.getProperty('faild_cpv') |
161 |
else: |
162 |
cpv = self.getProperty('cpv') |
163 |
+ self.error_dict['cpv'] = cpv |
164 |
yield log.addStdout('Titel:' + '\n') |
165 |
yield log.addStdout(separator2.join([cpv, '-', self.error_dict['title']]) + separator1) |
166 |
yield log.addStdout('Summary:' + '\n') |
167 |
@@ -358,10 +360,11 @@ class MakeIssue(BuildStep): |
168 |
warning = False |
169 |
self.summary_log_list = [] |
170 |
self.error_dict = {} |
171 |
- self.error_dict['hash'] = hashlib.sha256() |
172 |
+ self.aftersteps_list = [] |
173 |
+ #self.error_dict['hash'] = hashlib.sha256() |
174 |
for k, v in sorted(self.summary_log_dict.items()): |
175 |
self.summary_log_list.append(v['text']) |
176 |
- self.error_dict['hash'].update(v['text'].encode('utf-8')) |
177 |
+ #self.error_dict['hash'].update(v['text'].encode('utf-8')) |
178 |
if v['status'] == 'warning': |
179 |
warning = True |
180 |
# check if the build did fail |
181 |
@@ -377,9 +380,14 @@ class MakeIssue(BuildStep): |
182 |
print(self.error_dict) |
183 |
yield self.logIssue() |
184 |
self.setProperty("status", 'failed', 'status') |
185 |
- self.setProperty("summary_log_list", self.summary_log_list, 'summary_log_list') |
186 |
+ self.setProperty("error_dict", self.error_dict, 'error_dict') |
187 |
+ self.aftersteps_list.append(bugs.GetBugs()) |
188 |
if warning: |
189 |
self.setProperty("status", 'warning', 'status') |
190 |
+ self.setProperty("bgo", False, 'bgo') |
191 |
+ self.setProperty("summary_log_list", self.summary_log_list, 'summary_log_list') |
192 |
+ if self.aftersteps_list is not []: |
193 |
+ yield self.build.addStepsAfterCurrentStep(self.aftersteps_list) |
194 |
return SUCCESS |
195 |
|
196 |
class setBuildbotLog(BuildStep): |