From 7644e8bae18a683e4a93c22d27787929e8cfe74a Mon Sep 17 00:00:00 2001 From: Martin Vogel Date: Fri, 2 Oct 2026 21:19:51 +0200 Subject: [PATCH] ci: upload failing suite logs when a test job fails The job log of a red test job carries a summary of each failing suite, not its log, and the only artifact was shard-manifest.txt. A failure whose summary was not enough could only be understood by reproducing it. The four jobs in .github/workflows/_test.yml that run the parallel harness (test-unix, test-windows, test-diag, test-lsan-macos) get one more step, "Failing suite logs". It runs only when the job failed and uploads build/c/test-logs/failed/: the logs of the suites that did not end green, plus results.txt, as the harness leaves them there. One red suite is typically a few kilobytes; a whole run's logs are about 25 MB. Retention is 7 days. The artifact names follow the shard-manifest ones (suite-logs---, suite-logs-diag, suite-logs-lsan-macos), and the step uses the upload-artifact reference the file already pins. A job that failed outside the suite waves has no such directory; the step then warns and uploads nothing. The step cannot change a job's result: it is skipped on a green job, and a failed job stays failed whatever the upload does. Triggers, permissions, job dependencies, timeouts, the matrix and the shard-completeness download pattern are unchanged. Signed-off-by: Martin Vogel --- .github/workflows/_test.yml | 50 +++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/.github/workflows/_test.yml b/.github/workflows/_test.yml index 88ed9498a..0a1f0c488 100644 --- a/.github/workflows/_test.yml +++ b/.github/workflows/_test.yml @@ -256,6 +256,23 @@ jobs: # shard-completeness job still gates the cross-shard union. if-no-files-found: warn + # The job log carries a red suite's SUMMARY; these are the complete logs + # behind it, so a failure can be read instead of re-run. The harness + # copies the log of every suite that did not end green, plus results.txt, + # into test-logs/failed/ (scripts/suite-failure-report.sh) — typically a + # few kilobytes for a red suite, not the ~25 MB of a whole run's logs. + # Runs only on a failed job. warn, not error: a job that failed OUTSIDE + # the suite wave (contract step, build, prod-binary guards) has no such + # directory, and a second error would only bury the first. + - name: Failing suite logs + if: failure() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: suite-logs-${{ matrix.os }}-${{ matrix.cc }}-${{ strategy.job-index }} + path: build/c/test-logs/failed/ + retention-days: 7 + if-no-files-found: warn + - name: Compiler cache (save) if: always() && (matrix.shard == null || startsWith(matrix.shard, '1/')) uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 @@ -375,6 +392,17 @@ jobs: scripts/test.sh CC=clang-21 CXX=clang++-21 \ SANITIZE="-fsanitize=address,undefined -fno-omit-frame-pointer -fno-optimize-sibling-calls" + # Same step as in test-unix: the complete logs of the suites that did + # not end green, only when the job failed. + - name: Failing suite logs + if: failure() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: suite-logs-diag + path: build/c/test-logs/failed/ + retention-days: 7 + if-no-files-found: warn + - name: Compiler cache (save) if: always() uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 @@ -462,6 +490,17 @@ jobs: LLVM_PREFIX="$(brew --prefix llvm@22)" scripts/test.sh CC="$LLVM_PREFIX/bin/clang" CXX="$LLVM_PREFIX/bin/clang++" + # Same step as in test-unix: the complete logs of the suites that did + # not end green, only when the job failed. + - name: Failing suite logs + if: failure() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: suite-logs-lsan-macos + path: build/c/test-logs/failed/ + retention-days: 7 + if-no-files-found: warn + - name: Compiler cache (save) if: always() uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 @@ -636,6 +675,17 @@ jobs: # shard-completeness job still gates the cross-shard union. if-no-files-found: warn + # Same step as in test-unix: the complete logs of the suites that did + # not end green, only when the job failed. + - name: Failing suite logs + if: failure() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: suite-logs-${{ matrix.os }}-${{ matrix.msystem }}-${{ strategy.job-index }} + path: build/c/test-logs/failed/ + retention-days: 7 + if-no-files-found: warn + # Shard 1 (or the unsharded job) saves the compiler cache; every shard # builds the identical runner, so one cache carries the full object set. - name: Compiler cache (save)