Classify errors found into groups
authorSteve McIntyre <steve@einval.com>
Mon, 29 Oct 2018 15:27:01 +0000 (15:27 +0000)
committerSteve McIntyre <steve@einval.com>
Mon, 29 Oct 2018 15:27:01 +0000 (15:27 +0000)
And then sort by group in the summary

bin/analyze_results

index 6b983ea..70bac97 100755 (executable)
@@ -5,11 +5,32 @@
 
 use strict;
 use warnings;
+use Data::Dumper;
 
 my $logs = "/home/build/logs";
 my $logs_fail = "$logs/FAIL";
 my $num_fail = 0;
 my $existing_bugs = 0;
+use constant {
+    ERR_ARCH_MISMATCH      => 1,
+    ERR_INFRA              => 2,
+    ERR_BD_PROBLEM         => 3,
+    ERR_DETECT_WRONG_ARCH  => 4,
+    ERR_CRASH              => 5,
+    ERR_BUILD_PROBLEM      => 6,
+    ERR_TEST_PROBLEM       => 7,
+    ERR_BUILD_TIMEOUT      => 8,
+};
+
+my @err_descriptions;
+$err_descriptions [ERR_ARCH_MISMATCH]     = "Architecture mismatches";
+$err_descriptions [ERR_INFRA]             = "Infrastructure errors";
+$err_descriptions [ERR_BD_PROBLEM]        = "Problems with build-deps";
+$err_descriptions [ERR_DETECT_WRONG_ARCH] = "Builds detected wrong architecture";
+$err_descriptions [ERR_CRASH]             = "Crashes detected";
+$err_descriptions [ERR_BUILD_PROBLEM]     = "Problems detected during build phase";
+$err_descriptions [ERR_TEST_PROBLEM]      = "Problems detected during test phase";
+$err_descriptions [ERR_BUILD_TIMEOUT]     = "Package builds timed out";
 
 # Known failure modes to look for
 my @logcheck = (
@@ -20,59 +41,59 @@ my @logcheck = (
        message  => 'Architecture mismatch',
        check    => 1,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_ARCH_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
+       type     => ERR_ARCH_MISMATCH,
+    },
+    {
+       # "binary build with no binary artifacts found" -> no packages
+       # built. Why not picked up already above?.
+       # Stop working on this log at this point
+       string   => 'binary build with no binary artifacts found',
+       message  => 'No binaries built',
+       check    => 1,
+       stop     => 1,
+       type     => ERR_ARCH_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
+       type     => ERR_INFRA,
     },
     {
        string   => 'No space left on device',
        message  => 'Build ran out of disk space',
        check    => 1,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_INFRA,
     },
     {
        string   => 'aarch64-unknown-linux-gnu',
        message  => 'Wrong arch detected',
        check    => 1,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_DETECT_WRONG_ARCH,
     },
     {
        string   => 'binutils-aarch64',
        message  => 'Wrong arch detected',
        check    => 0,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_DETECT_WRONG_ARCH,
     },
     {
        string   => 'lib.linux-aarch64',
        message  => 'Wrong arch detected',
        check    => 1,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
-    },
-    {
-       # "binary build with no binary artifacts found" -> no packages
-       # built. Why not picked up already above?.
-       # Stop working on this log at this point
-       string   => 'binary build with no binary artifacts found',
-       message  => 'No binaries built',
-       check    => 1,
-       stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_DETECT_WRONG_ARCH,
     },
     {
        # "Bus error" -> alignment bug
@@ -80,7 +101,7 @@ my @logcheck = (
        message  => 'Alignment problem',
        check    => 1,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_CRASH,
     },
     {
        # "Segmentation fault" -> code problem
@@ -89,7 +110,7 @@ my @logcheck = (
        message  => 'Segmentation fault when installing RESULT',
        check    => 1,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_CRASH,
     },
     {
        # "Segmentation fault" -> code problem
@@ -97,7 +118,7 @@ my @logcheck = (
        message  => 'Segmentation fault',
        check    => 1,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_CRASH,
     },
     {
        # "Illegal instruction" -> bad build target?
@@ -106,7 +127,7 @@ my @logcheck = (
        message  => 'Illegal instruction when installing RESULT',
        check    => 1,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_CRASH,
     },
     {
        # "Illegal instruction" -> bad build target?
@@ -114,7 +135,7 @@ my @logcheck = (
        message  => 'Illegal instruction',
        check    => 1,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_CRASH,
     },
     {
        # Installing build-deps failed
@@ -122,7 +143,7 @@ my @logcheck = (
        message  => 'Build-dep failed to install (RESULT)',
        check    => 1,
        stop     => 0,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_BD_PROBLEM,
     },
     {
        # Installing build-deps failed
@@ -130,7 +151,7 @@ my @logcheck = (
        message  => 'Pbuilder build-deps failed',
        check    => 1,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_BD_PROBLEM,
     },
     {
        # Installing build-deps failed
@@ -138,7 +159,7 @@ my @logcheck = (
        message  => 'Build-deps failed',
        check    => 1,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_BD_PROBLEM,
     },
     {
        # Installing build-deps failed
@@ -146,7 +167,7 @@ my @logcheck = (
        message  => 'Missing build-dep (RESULT)',
        check    => 1,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_BD_PROBLEM,
     },
     {
        # Build failed - missing build-dep?
@@ -154,7 +175,7 @@ my @logcheck = (
        message  => 'Build-deps not satisfiable',
        check    => 1,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_BD_PROBLEM,
     },
     {
        # Build failed - missing build-dep?
@@ -162,7 +183,7 @@ my @logcheck = (
        message  => 'Build failure: missing library - missing build-dep?',
        check    => 1,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_BUILD_PROBLEM,
     },
     {
        # Build failed - missing build-dep?
@@ -170,7 +191,7 @@ my @logcheck = (
        message  => 'Build failure: missing header - missing build-dep?',
        check    => 1,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_BUILD_PROBLEM,
     },
     {
        # Build failed - missing build-dep?
@@ -178,7 +199,7 @@ my @logcheck = (
        message  => 'Build failure - missing build-dep?',
        check    => 1,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_BUILD_PROBLEM,
     },
     {
        # Build failed - can't exec something...
@@ -186,7 +207,7 @@ my @logcheck = (
        message  => 'Build failure (missing binary)',
        check    => 1,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_BUILD_PROBLEM,
     },
     {
        # Build failed
@@ -194,7 +215,7 @@ my @logcheck = (
        message  => 'Build failure (java/javadoc)',
        check    => 1,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_BUILD_PROBLEM,
     },
     {
        # Build failed
@@ -202,7 +223,7 @@ my @logcheck = (
        message  => 'Build failure (other)',
        check    => 1,
        stop     => 0,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_BUILD_PROBLEM,
     },
     {
        # Build failed
@@ -210,7 +231,7 @@ my @logcheck = (
        message  => 'Build failure (other)',
        check    => 1,
        stop     => 0,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_BUILD_PROBLEM,
     },
     {
        # Build failed
@@ -218,7 +239,7 @@ my @logcheck = (
        message  => 'dpkg-source failure',
        check    => 1,
        stop     => 1,
-       timeout  => 0, # This is a real error, not a build timeout
+       type     => ERR_BUILD_PROBLEM,
     },
     {
        # Build failed
@@ -226,6 +247,7 @@ my @logcheck = (
        message  => 'Build failure (other)',
        check    => 0,
        stop     => 1,
+       type     => ERR_BUILD_PROBLEM,
     },
     {
        # Test failure
@@ -233,6 +255,7 @@ my @logcheck = (
        message  => 'Python EPERM test failure',
        check    => 1,
        stop     => 1,
+       type     => ERR_TEST_PROBLEM,
     },
     {
        # Test failure
@@ -240,6 +263,7 @@ my @logcheck = (
        message  => 'Test failure',
        check    => 1,
        stop     => 1,
+       type     => ERR_TEST_PROBLEM,
     },
     {
        # Timeout. pbuilder is too dumb to do this properly :-(
@@ -247,8 +271,7 @@ my @logcheck = (
        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
+       type     => ERR_BUILD_TIMEOUT,
     },
     {
        # Timeout from sbuild
@@ -256,8 +279,7 @@ my @logcheck = (
        message  => 'Sbuild build timeout',
        check    => 1,
        stop     => 1,
-       timeout  => 1, # This is a build timeout. If this happened
-                      # before other errors, then we should retry
+       type     => ERR_BUILD_TIMEOUT,
     },
 );
 
@@ -303,8 +325,8 @@ foreach my $input (@ARGV) {
                    my $match = $1;
                    my $message = $check{message};
                    $message =~ s,RESULT,$match,g;
-                   $file_results{$message} = 1;
-                   if ($check{timeout} and $errors == 0) {
+                   $file_results{$message} = $check{type};
+                   if ($check{type} == ERR_BUILD_TIMEOUT and $errors == 0) {
                        print "  <li>Line $lineno: $message\n";
                        print "  <li>Build killed by timeout before any errors at line $lineno\n";
                    } else {
@@ -346,7 +368,7 @@ foreach my $input (@ARGV) {
 
     print "</ul>\n";
     foreach my $key (keys %file_results) {
-       $log_results{$key} += 1;
+       $log_results{$file_results{$key}}{$key} += 1;
 #      print "now have $log_results{$key} for \"$key\"\n";
     }
 }
@@ -355,9 +377,14 @@ print "</ol>\n";
 print "<a name=\"summary\"</a>\n";
 print "<h2>Summary of results from $num_fail failed builds:</h2>\n";
 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 "<li>  Found $existing_bugs existing bugs in the Debian BTS</li>\n";
+foreach my $type (sort keys %log_results) {
+    print "  <h3>$err_descriptions[$type]</h3>\n";
+    my $tmp = $log_results{$type};
+    my %result = %$tmp;
+    foreach my $key (sort { $result{$b} <=> $result{$a} }keys %result) {
+       print "  <li>Found $result{$key} log(s) showing $key\n";
+    }
 }
 print "</ul>\n";
 print "</body>\n";