From d380ba0394566ca3a493c9cee363bf6117ca7ee9 Mon Sep 17 00:00:00 2001 From: Ed Santiago Date: Thu, 1 Oct 2020 11:53:31 -0600 Subject: logformatter: add Synopsis at top of each page At the top of each generated page, add a Synopsis table with: PR number/name, and link to github Author name(s) Test name (fedora/ubuntu, rootless, etc) Cirrus build ID (usually uninteresting) Cirrus task ID (usu. important), with link to Cirrus The value of $SPECIALMODE This is all we can get from the Cirrus environment in which logformatter runs; we can't get things like cgroup manager or username that the test runs under. Note that the table is at the top, which is usually unseen because we autoscroll to the bottom on page load. I tentatively think that top is a more natural place for this info than bottom, but am willing to listen to arguments against. Also, one minor tweak: highlight podman commands in the BATS output. The idea is to make it easier for the eye to spot those, then copy/paste them to find a reproducer. And, sigh, disable the new 'podman network create' system test. It is flaking much too much. Signed-off-by: Ed Santiago --- contrib/cirrus/logformatter | 105 ++++++++++++++++++++++++++++++++++++++-- contrib/cirrus/logformatter.t | 10 ++-- test/system/500-networking.bats | 2 + 3 files changed, 109 insertions(+), 8 deletions(-) diff --git a/contrib/cirrus/logformatter b/contrib/cirrus/logformatter index f97638b6f..2ab8aa117 100755 --- a/contrib/cirrus/logformatter +++ b/contrib/cirrus/logformatter @@ -31,6 +31,12 @@ our $CSS = <<'END_CSS'; /* wrap long lines - don't require user to scroll right */ pre { line-break: normal; overflow-wrap: normal; white-space: pre-wrap; } +/* synopsis table at top */ +table.synopsis { border: none; border-collapse: collapse; margin-left: 2em; margin-top: 2ex; } +.synopsis th { font-weight: normal; font-size: 110%; text-align: right; } +.synopsis td { font-weight: bold; font-size: 120%; font-family: monospace; } + +/* test results */ .boring { color: #999; } .timestamp { color: #999; } .log-debug { color: #999; } @@ -171,9 +177,20 @@ window.addEventListener("load", scrollToBottom, false); -
 
 END_HTML
 
+    # Synopsis of this job: show job environment, links to PR and Cirrus
+    print { $out_fh } "

Synopsis

\n
\n", + job_synopsis($test_name), "
\n"; + + # FOR DEBUGGING: dump environment, but in HTML comments to not clutter + print { $out_fh } "\n"; + for my $e (sort keys %ENV) { + my $val = escapeHTML($ENV{$e}); + $val =~ s/--/--/g; # double dash not valid in comments + printf { $out_fh } "\n", $e, $val; + } + # State variables my $previous_timestamp = ''; # timestamp of previous line my $cirrus_task; # Cirrus task number, used for linking @@ -185,6 +202,8 @@ END_HTML my $looks_like_bats; # binary flag: for detecting BATS results my %bats_count; # For summary line: count of pass/fail/skip + print { $out_fh } "
 \n";
+
     # Main loop: read input, one line at a time, and write out reformatted
   LINE:
     while (my $line = ) {
@@ -232,8 +251,9 @@ END_HTML
             my $css;
 
             # Readability: /long/path/to/podman -> podman (hover for full path)
-            $line =~ s{^(#\s+(#|\$)\s+)(\S+/)(podman\S*)\s}
-                      {$1$4 };
+            # Also make it boldface, to make commands stand out
+            $line =~ s{^(#\s+(#|\$)\s+)(\S+/)(podman\S*)(\s.*)}
+                      {$1$4$5};
 
             if    ($line =~ /^ok\s.*\s# skip/) { $css = 'skipped' }
             elsif ($line =~ /^ok\s/)           { $css = 'passed'  }
@@ -470,6 +490,83 @@ sub make_id {
 }
 
 
+###############################################################################
+# BEGIN job_synopsis and related helpers
+
+##################
+#  job_synopsis  #  Job details, links to github/cirrus
+##################
+sub job_synopsis {
+    my $subtest_name = shift;           # e.g. integration_test
+
+    my $s = <<"END_SYNOPSIS";
+
+END_SYNOPSIS
+
+    # PR 1234 - title of the pr
+    my $pr_title = escapeHTML(_env_replace("{CIRRUS_CHANGE_TITLE}"));
+    $s .= _tr("Github PR", sprintf("%s - %s",
+                                   _a("{CIRRUS_PR}", "https://{CIRRUS_REPO_CLONE_HOST}/{CIRRUS_REPO_FULL_NAME}/pull/{CIRRUS_PR}"),
+                                   $pr_title));
+
+    # PR author, if signed-off-by
+    if (my $msg = _env_replace("{CIRRUS_COMMIT_MESSAGE}")) {
+        while ($msg =~ /^Signed-off-by:\s+(\S.*\S)$/gmi) {
+            $s .= _tr("Author", escapeHTML($1));
+        }
+    }
+
+    # eg "test fedora", "special_testing_rootless"
+    my $test_name = _env_replace("{CIRRUS_TASK_NAME}");
+    if (my $rcli = $ENV{RCLI}) {
+        $test_name .= " [remote]" if $rcli eq 'true';
+    }
+    else {
+        $test_name .= " [no RCLI; cannot determine remote/local]";
+    }
+    $s .= _tr("Test name", $test_name);
+
+    # Subtest, e.g. system_test
+    $s .= _tr("Subtest", $subtest_name);
+
+    # Link to further Cirrus results, e.g. other runs.
+    # Build is mostly boring, it's usually TASK that we want to see.
+    $s .= _tr("Cirrus Build ID", "" . _a("{CIRRUS_BUILD_ID}", "https://cirrus-ci.com/build/{CIRRUS_BUILD_ID}") . "");
+    $s .= _tr("Cirrus Task ID", _a("{CIRRUS_TASK_ID}", "https://cirrus-ci.com/task/{CIRRUS_TASK_ID}"));
+
+    # "none", "rootless"
+    $s .= _tr("Special mode", _env_replace("{SPECIALMODE}"));
+
+    $s .= "
\n"; + return $s; +} + + +sub _tr { + my ($th, $td) = @_; + return "$th:$td\n"; +} + +sub _a { + my ($name, $href) = map { _env_replace($_) } @_; + + if ($href =~ /UNDEFINED/) { + return "$name ($href)"; + } + return "$name"; +} + +sub _env_replace { + my $s_in = shift; + + $s_in =~ s[\{(.*?)\}][$ENV{$1} || "[$1 UNDEFINED]"]ge; + + return $s_in; +} + +# END job_synopsis and related helpers +############################################################################### +# BEGIN html-formatting helpers sub escapeHTML { my $s = shift; @@ -492,5 +589,7 @@ sub unescapeHTML { return $s; } +# END html-formatting helpers +############################################################################### 1; diff --git a/contrib/cirrus/logformatter.t b/contrib/cirrus/logformatter.t index 2075bff96..bd4179b5e 100755 --- a/contrib/cirrus/logformatter.t +++ b/contrib/cirrus/logformatter.t @@ -96,7 +96,7 @@ ok 4 blah ok 1 hi ok 2 bye # skip no reason not ok 3 fail -# $ podman foo -bar +# $ podman foo -bar # #| FAIL: exit code is 123; expected 321 ok 4 blah
Summary: 2 Passed, 1 Failed, 1 Skipped. Total tests: 4 @@ -147,11 +147,11 @@ $SCRIPT_BASE/integration_test.sh |& ${TIMESTAMP}
 [+0103s] Podman pod restart
          

podman pod restart single empty pod

- /var/tmp/go/src/github.com/containers/libpod/test/e2e/pod_restart_test.go:41 + /var/tmp/go/src/github.com/containers/podman/test/e2e/pod_restart_test.go:41 [BeforeEach] Podman pod restart - /var/tmp/go/src/github.com/containers/libpod/test/e2e/pod_restart_test.go:18 + /var/tmp/go/src/github.com/containers/podman/test/e2e/pod_restart_test.go:18 [It] podman pod restart single empty pod - /var/tmp/go/src/github.com/containers/libpod/test/e2e/pod_restart_test.go:41 + /var/tmp/go/src/github.com/containers/podman/test/e2e/pod_restart_test.go:41 Running: podman Error: no containers in pod 4810be0cfbd42241e349dbe7d50fbc54405cd320a6637c65fd5323f34d64af89 have no dependencies, cannot start pod: no such container output: [AfterEach] Podman pod restart - /var/tmp/go/src/github.com/containers/libpod/test/e2e/pod_restart_test.go:28 + /var/tmp/go/src/github.com/containers/podman/test/e2e/pod_restart_test.go:28 Running: podman