Fix java message
[buildd-scripts.git] / bin / analyze_results
1 #! /usr/bin/perl
2
3 # Script to analyze failed build logs. Look for specific regexps to
4 # classify things
5
6 use strict;
7 use warnings;
8
9 my $logs = "/home/build/logs";
10 my $logs_fail = "$logs/FAIL";
11 my $num_fail = 0;
12 my $existing_bugs = 0;
13
14 # Known failure modes to look for
15 my @logcheck = (
16     {
17         # "rchitecture mismatch" -> should never build on this arch
18         # Stop working on this log at this point
19         string   => 'rchitecture mismatch',
20         message  => 'Architecture mismatch',
21         check    => 1,
22         stop     => 1,
23         timeout  => 0, # This is a real error, not a build timeout
24     },
25     {
26         string   => 'not in arch list or does not match any',
27         message  => 'Architecture mismatch',
28         check    => 1,
29         stop     => 1,
30         timeout  => 0, # This is a real error, not a build timeout
31     },
32     {
33         string   => 'schroot.*File is not owned by user root',
34         message  => 'Schroot setup failure',
35         check    => 1,
36         stop     => 1,
37         timeout  => 0, # This is a real error, not a build timeout
38     },
39     {
40         string   => 'No space left on device',
41         message  => 'Build ran out of disk space',
42         check    => 1,
43         stop     => 1,
44         timeout  => 0, # This is a real error, not a build timeout
45     },
46     {
47         string   => 'aarch64-unknown-linux-gnu',
48         message  => 'Wrong arch detected',
49         check    => 1,
50         stop     => 1,
51         timeout  => 0, # This is a real error, not a build timeout
52     },
53     {
54         string   => 'binutils-aarch64',
55         message  => 'Wrong arch detected',
56         check    => 1,
57         stop     => 1,
58         timeout  => 0, # This is a real error, not a build timeout
59     },
60     {
61         string   => 'lib.linux-aarch64',
62         message  => 'Wrong arch detected',
63         check    => 1,
64         stop     => 1,
65         timeout  => 0, # This is a real error, not a build timeout
66     },
67     {
68         # "binary build with no binary artifacts found" -> no packages
69         # built. Why not picked up already above?.
70         # Stop working on this log at this point
71         string   => 'binary build with no binary artifacts found',
72         message  => 'No binaries built',
73         check    => 1,
74         stop     => 1,
75         timeout  => 0, # This is a real error, not a build timeout
76     },
77     {
78         # "Bus error" -> alignment bug
79         string   => 'Bus error',
80         message  => 'Alignment problem',
81         check    => 1,
82         stop     => 1,
83         timeout  => 0, # This is a real error, not a build timeout
84     },
85     {
86         # "Segmentation fault" -> code problem
87         string   => 'Segmentation fault',
88         pstring  => 'Setting up (\S+)',
89         message  => 'Segmentation fault when installing RESULT',
90         check    => 1,
91         stop     => 1,
92         timeout  => 0, # This is a real error, not a build timeout
93     },
94     {
95         # "Segmentation fault" -> code problem
96         string   => 'Segmentation fault',
97         message  => 'Segmentation fault',
98         check    => 1,
99         stop     => 1,
100         timeout  => 0, # This is a real error, not a build timeout
101     },
102     {
103         # "Illegal instruction" -> bad build target?
104         string   => 'Illegal instruction',
105         pstring  => 'Setting up (\S+)',
106         message  => 'Illegal instruction when installing RESULT',
107         check    => 1,
108         stop     => 1,
109         timeout  => 0, # This is a real error, not a build timeout
110     },
111     {
112         # "Illegal instruction" -> bad build target?
113         string   => 'Illegal instruction',
114         message  => 'Illegal instruction',
115         check    => 1,
116         stop     => 1,
117         timeout  => 0, # This is a real error, not a build timeout
118     },
119     {
120         # Installing build-deps failed
121         string   => 'dpkg: error processing package (\S+)',
122         message  => 'Build-dep failed to install (RESULT)',
123         check    => 1,
124         stop     => 0,
125         timeout  => 0, # This is a real error, not a build timeout
126     },
127     {
128         # Installing build-deps failed
129         string   => 'E: pbuilder-satisfydepends failed.',
130         message  => 'Pbuilder build-deps failed',
131         check    => 1,
132         stop     => 1,
133         timeout  => 0, # This is a real error, not a build timeout
134     },
135     {
136         # Installing build-deps failed
137         string   => 'E: Unmet dependencies',
138         message  => 'Build-deps failed',
139         check    => 1,
140         stop     => 1,
141         timeout  => 0, # This is a real error, not a build timeout
142     },
143     {
144         # Installing build-deps failed
145         string   => 'unsat-dependency: (\S+)',
146         message  => 'Missing build-dep (RESULT)',
147         check    => 1,
148         stop     => 1,
149         timeout  => 0, # This is a real error, not a build timeout
150     },
151     {
152         # Build failed - missing build-dep?
153         string   => 'build dependencies/conflicts unsatisfied',
154         message  => 'Build-deps not satisfiable',
155         check    => 1,
156         stop     => 1,
157         timeout  => 0, # This is a real error, not a build timeout
158     },
159     {
160         # Build failed - missing build-dep?
161         string   => 'ld: cannot find',
162         message  => 'Build failure: missing library - missing build-dep?',
163         check    => 1,
164         stop     => 1,
165         timeout  => 0, # This is a real error, not a build timeout
166     },
167     {
168         # Build failed - missing build-dep?
169         string   => 'fatal error:.*No such file or directory',
170         message  => 'Build failure: missing header - missing build-dep?',
171         check    => 1,
172         stop     => 1,
173         timeout  => 0, # This is a real error, not a build timeout
174     },
175     {
176         # Build failed - missing build-dep?
177         string   => 'SEVERE: Cannot resolve dependencies',
178         message  => 'Build failure - missing build-dep?',
179         check    => 1,
180         stop     => 1,
181         timeout  => 0, # This is a real error, not a build timeout
182     },
183     {
184         # Build failed - can't exec something...
185         string   => 'error trying to exec.*execvp: No',
186         message  => 'Build failure (missing binary)',
187         check    => 1,
188         stop     => 1,
189         timeout  => 0, # This is a real error, not a build timeout
190     },
191     {
192         # Build failed
193         string   => 'BUILD FAILED',
194         message  => 'Build failure (java/javadoc)',
195         check    => 1,
196         stop     => 1,
197         timeout  => 0, # This is a real error, not a build timeout
198     },
199     {
200         # Build failed
201         string   => 'make.*returned exit code',
202         message  => 'Build failure (other)',
203         check    => 1,
204         stop     => 0,
205         timeout  => 0, # This is a real error, not a build timeout
206     },
207     {
208         # Build failed
209         string   => '^make.*\*\*\*.* \[debian/rules.*Error \d+$',
210         message  => 'Build failure (other)',
211         check    => 1,
212         stop     => 0,
213         timeout  => 0, # This is a real error, not a build timeout
214     },
215     {
216         # Build failed
217         string   => 'dpkg-source: error: unrepresentable changes to source',
218         message  => 'dpkg-source failure',
219         check    => 1,
220         stop     => 1,
221         timeout  => 0, # This is a real error, not a build timeout
222     },
223     {
224         # Build failed
225         string   => 'fakeroot debian/rules binary',
226         message  => 'Build failure (other)',
227         check    => 0,
228         stop     => 1,
229     },
230     {
231         # Test failure
232         string   => 'OSError: \[Errno 13\] Permission denied',
233         message  => 'Python EPERM test failure',
234         check    => 1,
235         stop     => 1,
236     },
237     {
238         # Test failure
239         string   => 'dh_auto_test:.*returned exit code \d+',
240         message  => 'Test failure',
241         check    => 1,
242         stop     => 1,
243     },
244     {
245         # Timeout. pbuilder is too dumb to do this properly :-(
246         string   => 'I: Terminating build process due to timeout',
247         message  => 'Pbuilder build timeout',
248         check    => 1,
249         stop     => 1,
250         timeout  => 1, # This is a build timeout. If this happened
251                        # before other errors, then we should retry
252     },
253     {
254         # Timeout from sbuild
255         string   => 'Build killed with signal TERM after \d+ minutes of inactivity',
256         message  => 'Sbuild build timeout',
257         check    => 1,
258         stop     => 1,
259         timeout  => 1, # This is a build timeout. If this happened
260                        # before other errors, then we should retry
261     },
262 );
263
264 my %log_results;
265
266 #foreach my $checktmp (@logcheck) {
267 #    my %check = %$checktmp;
268 #    print "looking for \"$check{string}\"\n";
269 #    print "  with log message \"$check{message}\"\n";
270 #    print "  check this regexp: $check{check}\n";
271 #    print "  stop if found: $check{stop}\n";
272 #}
273
274 print "<html>\n";
275 print "<head>\n";
276 print "<title>Build log analysis</title>\n";
277 print "</head>\n";
278 print "<body>\n";
279 print "<h1>Build log analysis</h1>\n";
280 print "<p><a href=\"#summary\">Summary</a></p>\n";
281 print "<h2>Packages</h2>\n";
282 print "<ol>\n";
283
284 foreach my $input (@ARGV) {
285     open (IN, "< $input") or die "Can't read $input: $!\n";
286     $num_fail++;
287     my $stop = 0;
288     my $lineno = 0;
289     my $errors = 0;
290     my $oldline = "";
291     my %file_results;
292     print "<li>Looking at <a href=\"$input\">$input</a>:\n";
293     print "<ul>\n";
294     while (defined (my $line = <IN>) and !$stop) {
295         $lineno++;
296         foreach my $checktmp (@logcheck) {
297             my %check = %$checktmp;
298             if ($check{check}) {
299                 if (!$stop
300                     and ($line =~ m/$check{string}/)
301                     and (!$check{pstring} or $oldline =~ m/$check{pstring}/)) {
302 #                   print "  Line $lineno: found \"$check{string}\"\n";
303                     my $match = $1;
304                     my $message = $check{message};
305                     $message =~ s,RESULT,$match,g;
306                     $file_results{$message} = 1;
307                     if ($check{timeout} and $errors == 0) {
308                         print "  <li>Line $lineno: $message\n";
309                         print "  <li>Build killed by timeout before any errors at line $lineno\n";
310                     } else {
311                         print "  <li>Line $lineno: $message\n";
312                         $errors++;
313                     }
314                     if ($check{stop}) {
315 #                       print "  stopping processing\n";
316                         $stop = 1;
317                     }
318                 }
319             }
320         }
321         $oldline = $line;
322     }
323     close IN;
324     # End of checking this package
325     print "  <li><strong>Found errors: $errors</strong>\n";
326     if (!$errors) {
327         print " (maybe just timed out during build?)\n";
328     }
329
330     # Look for a note for manually-added logfile analysis
331     my $note = $input;
332     $note =~ s,\.log$,.note,;
333     if (-f $note) {
334         open (IN, "< $note") or die "Can't open $note for reading: $!\n";
335         while (defined (my $line = <IN>)) {
336             chomp $line;
337             if ($line =~ m,#(\d+),) {
338                 my $bugno = $1;
339                 $existing_bugs++;
340                 $line =~ s,#(\d+),<a href="https://bugs.debian.org/$1">#$1</a>,g;
341             }
342             print "  <li>$line\n";
343         }
344         close IN;
345     }
346
347     print "</ul>\n";
348     foreach my $key (keys %file_results) {
349         $log_results{$key} += 1;
350 #       print "now have $log_results{$key} for \"$key\"\n";
351     }
352 }
353 print "</ol>\n";
354
355 print "<a name=\"summary\"</a>\n";
356 print "<h2>Summary of results from $num_fail failed builds:</h2>\n";
357 print "<ul>\n";
358 print "<li>Found $existing_bugs existing bugs</li>\n";
359 foreach my $key (sort { $log_results{$b} <=> $log_results{$a} } keys %log_results) {
360     print "  <li>Found $log_results{$key} logs showing $key\n";
361 }
362 print "</ul>\n";
363 print "</body>\n";
364 print "</html>\n";