Remove the pbuilder code
[buildd-scripts.git] / bin / analyze_results
index cad3f4f..70c5e2f 100755 (executable)
@@ -9,40 +9,57 @@ use warnings;
 my $logs = "/home/build/logs";
 my $logs_fail = "$logs/FAIL";
 my $num_fail = 0;
+my $existing_bugs = 0;
 
 # Known failure modes to look for
 my @logcheck = (
     {
-       # Couldn't install build-deps
-       string   => '^Unable to resolve dependencies',
-       pstring  => '.*',
-       message  => 'build-deps failed',
+       # "rchitecture mismatch" -> should never build on this arch
+       # Stop working on this log at this point
+       string   => 'rchitecture mismatch',
+       message  => 'Architecture mismatch',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
     },
     {
-       # "rchitecture mismatch" -> should never build on this arch
-       # Stop working on this log at this point
-       string   => 'rchitecture mismatch',
-       pstring  => '.*',
-       message  => 'architecture mismatch',
+       string   => 'not in arch list or does not match any',
+       message  => 'Architecture mismatch',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
     },
     {
-       string   => 'not in arch list or does not match any',
-       pstring  => '.*',
-       message  => 'architecture mismatch',
+       string   => 'schroot.*File is not owned by user root',
+       message  => 'Schroot setup failure',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
     },
     {
        string   => 'No space left on device',
-       pstring  => '.*',
-       message  => 'ran out of disk space',
+       message  => 'Build ran out of disk space',
+       check    => 1,
+       stop     => 1,
+       timeout  => 0, # This is a real error, not a build timeout
+    },
+    {
+       string   => 'aarch64-unknown-linux-gnu',
+       message  => 'Wrong arch detected',
+       check    => 1,
+       stop     => 1,
+       timeout  => 0, # This is a real error, not a build timeout
+    },
+    {
+       string   => 'binutils-aarch64',
+       message  => 'Wrong arch detected',
+       check    => 1,
+       stop     => 1,
+       timeout  => 0, # This is a real error, not a build timeout
+    },
+    {
+       string   => 'lib.linux-aarch64',
+       message  => 'Wrong arch detected',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -52,8 +69,7 @@ my @logcheck = (
        # built. Why not picked up already above?.
        # Stop working on this log at this point
        string   => 'binary build with no binary artifacts found',
-       pstring  => '.*',
-       message  => 'no binaries built',
+       message  => 'No binaries built',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -61,8 +77,7 @@ my @logcheck = (
     {
        # "Bus error" -> alignment bug
        string   => 'Bus error',
-       pstring  => '.*',
-       message  => 'alignment problem',
+       message  => 'Alignment problem',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -70,8 +85,8 @@ my @logcheck = (
     {
        # "Segmentation fault" -> code problem
        string   => 'Segmentation fault',
-       pstring  => 'Setting up libglib2.0-cil',
-       message  => 'Segmentation fault (mono)',
+       pstring  => 'Setting up (\S+)',
+       message  => 'Segmentation fault when installing RESULT',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -79,7 +94,6 @@ my @logcheck = (
     {
        # "Segmentation fault" -> code problem
        string   => 'Segmentation fault',
-       pstring  => '.*',
        message  => 'Segmentation fault',
        check    => 1,
        stop     => 1,
@@ -88,8 +102,8 @@ my @logcheck = (
     {
        # "Illegal instruction" -> bad build target?
        string   => 'Illegal instruction',
-       pstring  => 'Setting up ghc',
-       message  => 'Illegal instruction (ghc)',
+       pstring  => 'Setting up (\S+)',
+       message  => 'Illegal instruction when installing RESULT',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -97,7 +111,6 @@ my @logcheck = (
     {
        # "Illegal instruction" -> bad build target?
        string   => 'Illegal instruction',
-       pstring  => '.*',
        message  => 'Illegal instruction',
        check    => 1,
        stop     => 1,
@@ -105,9 +118,16 @@ my @logcheck = (
     },
     {
        # Installing build-deps failed
-       string   => 'dpkg: error processing package',
-       pstring  => '.*',
-       message  => 'build-deps failed',
+       string   => 'dpkg: error processing package (\S+)',
+       message  => 'Build-dep failed to install (RESULT)',
+       check    => 1,
+       stop     => 0,
+       timeout  => 0, # This is a real error, not a build timeout
+    },
+    {
+       # Installing build-deps failed
+       string   => 'E: pbuilder-satisfydepends failed.',
+       message  => 'Pbuilder build-deps failed',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -115,17 +135,15 @@ my @logcheck = (
     {
        # Installing build-deps failed
        string   => 'E: Unmet dependencies',
-       pstring  => '.*',
-       message  => 'build-deps failed',
+       message  => 'Build-deps failed',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
     },
     {
        # Installing build-deps failed
-       string   => 'unsat-dependency:',
-       pstring  => '.*',
-       message  => 'build-deps failed',
+       string   => 'unsat-dependency: (\S+)',
+       message  => 'Missing build-dep (RESULT)',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -133,8 +151,7 @@ my @logcheck = (
     {
        # Build failed - missing build-dep?
        string   => 'build dependencies/conflicts unsatisfied',
-       pstring  => '.*',
-       message  => 'build-deps not satisfiable',
+       message  => 'Build-deps not satisfiable',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -142,8 +159,7 @@ my @logcheck = (
     {
        # Build failed - missing build-dep?
        string   => 'ld: cannot find',
-       pstring  => '.*',
-       message  => 'build failure: missing library - missing build-dep?',
+       message  => 'Build failure: missing library - missing build-dep?',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -151,8 +167,7 @@ my @logcheck = (
     {
        # Build failed - missing build-dep?
        string   => 'fatal error:.*No such file or directory',
-       pstring  => '.*',
-       message  => 'build failure: missing header - missing build-dep?',
+       message  => 'Build failure: missing header - missing build-dep?',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -160,8 +175,7 @@ my @logcheck = (
     {
        # Build failed - missing build-dep?
        string   => 'SEVERE: Cannot resolve dependencies',
-       pstring  => '.*',
-       message  => 'build failure - missing build-dep?',
+       message  => 'Build failure - missing build-dep?',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -169,8 +183,15 @@ my @logcheck = (
     {
        # Build failed - can't exec something...
        string   => 'error trying to exec.*execvp: No',
-       pstring  => '.*',
-       message  => 'build failure (missing binary)',
+       message  => 'Build failure (missing binary)',
+       check    => 1,
+       stop     => 1,
+       timeout  => 0, # This is a real error, not a build timeout
+    },
+    {
+       # Build failed
+       string   => 'BUILD FAILED',
+       message  => 'Build failure (java/javadoc))',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -178,8 +199,7 @@ my @logcheck = (
     {
        # Build failed
        string   => 'make.*returned exit code',
-       pstring  => '.*',
-       message  => 'build failure (other)',
+       message  => 'Build failure (other)',
        check    => 1,
        stop     => 0,
        timeout  => 0, # This is a real error, not a build timeout
@@ -187,8 +207,7 @@ my @logcheck = (
     {
        # Build failed
        string   => '^make.*\*\*\*.* \[debian/rules.*Error \d+$',
-       pstring  => '.*',
-       message  => 'build failure (other)',
+       message  => 'Build failure (other)',
        check    => 1,
        stop     => 0,
        timeout  => 0, # This is a real error, not a build timeout
@@ -196,7 +215,6 @@ my @logcheck = (
     {
        # Build failed
        string   => 'dpkg-source: error: unrepresentable changes to source',
-       pstring  => '.*',
        message  => 'dpkg-source failure',
        check    => 1,
        stop     => 1,
@@ -205,16 +223,37 @@ my @logcheck = (
     {
        # Build failed
        string   => 'fakeroot debian/rules binary',
-       pstring  => '.*',
-       message  => 'build failure (other)',
+       message  => 'Build failure (other)',
        check    => 0,
        stop     => 1,
     },
+    {
+       # Test failure
+       string   => 'OSError: \[Errno 13\] Permission denied',
+       message  => 'Python EPERM test failure',
+       check    => 1,
+       stop     => 1,
+    },
+    {
+       # Test failure
+       string   => 'dh_auto_test:.*returned exit code \d+',
+       message  => 'Test failure',
+       check    => 1,
+       stop     => 1,
+    },
     {
        # Timeout. pbuilder is too dumb to do this properly :-(
        string   => 'I: Terminating build process due to timeout',
-       pstring  => '.*',
-       message  => 'build timeout',
+       message  => 'Pbuilder build timeout',
+       check    => 1,
+       stop     => 1,
+       timeout  => 1, # This is a build timeout. If this happened
+                      # before other errors, then we should retry
+    },
+    {
+       # Timeout from sbuild
+       string   => 'Build killed with signal TERM after \d+ minutes of inactivity',
+       message  => 'Sbuild build timeout',
        check    => 1,
        stop     => 1,
        timeout  => 1, # This is a build timeout. If this happened
@@ -238,6 +277,7 @@ print "<title>Build log analysis</title>\n";
 print "</head>\n";
 print "<body>\n";
 print "<h1>Build log analysis</h1>\n";
+print "<p><a href=\"#summary\">Summary</a></p>\n";
 print "<h2>Packages</h2>\n";
 print "<ol>\n";
 
@@ -257,14 +297,18 @@ foreach my $input (@ARGV) {
            my %check = %$checktmp;
            if ($check{check}) {
                if (!$stop
-                   and $line =~ m/$check{string}/
-                   and $oldline =~ m/$check{pstring}/) {
+                   and ($line =~ m/$check{string}/)
+                   and (!$check{pstring} or $oldline =~ m/$check{pstring}/)) {
 #                  print "  Line $lineno: found \"$check{string}\"\n";
-                   $file_results{$check{message}} = 1;
+                   my $match = $1;
+                   my $message = $check{message};
+                   $message =~ s,RESULT,$match,g;
+                   $file_results{$message} = 1;
                    if ($check{timeout} and $errors == 0) {
+                       print "  <li>Line $lineno: $message\n";
                        print "  <li>Build killed by timeout before any errors at line $lineno\n";
                    } else {
-                       print "  <li>Line $lineno: $check{message}\n";
+                       print "  <li>Line $lineno: $message\n";
                        $errors++;
                    }
                    if ($check{stop}) {
@@ -276,11 +320,30 @@ foreach my $input (@ARGV) {
        }
        $oldline = $line;
     }
+    close IN;
     # End of checking this package
-    print "  <li><strong>found errors: $errors</strong>\n";
+    print "  <li><strong>Found errors: $errors</strong>\n";
     if (!$errors) {
        print " (maybe just timed out during build?)\n";
     }
+
+    # Look for a note for manually-added logfile analysis
+    my $note = $input;
+    $note =~ s,\.log$,.note,;
+    if (-f $note) {
+       open (IN, "< $note") or die "Can't open $note for reading: $!\n";
+       while (defined (my $line = <IN>)) {
+           chomp $line;
+           if ($line =~ m,#(\d+),) {
+               my $bugno = $1;
+               $existing_bugs++;
+               $line =~ s,#(\d+),<a href="https://bugs.debian.org/$1">#$1</a>,g;
+           }
+           print "  <li>$line\n";
+       }
+       close IN;
+    }
+
     print "</ul>\n";
     foreach my $key (keys %file_results) {
        $log_results{$key} += 1;
@@ -289,11 +352,13 @@ foreach my $input (@ARGV) {
 }
 print "</ol>\n";
 
+print "<a name=\"summary\"</a>\n";
 print "<h2>Summary of results from $num_fail failed builds:</h2>\n";
-print "<ol>\n";
-foreach my $key (keys %log_results) {
+print "<ul>\n";
+print "<li>Found $existing_bugs existing bugs</li>\n";
+foreach my $key (sort { $log_results{$b} <=> $log_results{$a} } keys %log_results) {
     print "  <li>Found $log_results{$key} logs showing $key\n";
 }
-print "</ol>\n";
+print "</ul>\n";
 print "</body>\n";
 print "</html>\n";