diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d01bf2764..b2fd167bf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -156,16 +156,69 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} cache-save-if: ${{ github.ref == 'refs/heads/main' }} + - name: Prepare test evidence + run: | + mkdir -p artifacts/test-and-lint + { + echo "run_id=${GITHUB_RUN_ID}" + echo "job=${GITHUB_JOB}" + echo "runner=${RUNNER_NAME}" + echo "started_at=$(date --utc --iso-8601=seconds)" + } > artifacts/test-and-lint/run-metadata.txt + # Clippy runs before the test pass: lint failures are the most common # CI-only breakage and should surface in minutes, not after 20+ minutes # of tests. - name: Run clippy lints run: cargo clippy --all-targets -- -D warnings - - name: Run tests + - name: Run nextest tests run: | - cargo nextest run --profile ci --all --exclude e2e_test - cargo test --all --doc + mkdir -p artifacts/test-and-lint + set +e + NEXTEST_HIDE_PROGRESS_BAR=1 timeout --verbose --signal=TERM --kill-after=30s 75m \ + cargo nextest run --profile ci --all --exclude e2e_test \ + --status-level all --final-status-level all \ + 2>&1 | tee artifacts/test-and-lint/nextest.log + status=${PIPESTATUS[0]} + { + echo "command=cargo nextest run --profile ci --all --exclude e2e_test" + echo "exit_status=${status}" + echo "finished_at=$(date --utc --iso-8601=seconds)" + echo + echo "Remaining test-related processes:" + pgrep -af 'cargo|nextest|target/.*/deps/' || true + } > artifacts/test-and-lint/nextest-diagnostics.txt + exit "${status}" + + - name: Run documentation tests + run: | + mkdir -p artifacts/test-and-lint + set +e + timeout --verbose --signal=TERM --kill-after=30s 15m \ + cargo test --all --doc \ + 2>&1 | tee artifacts/test-and-lint/doctest.log + status=${PIPESTATUS[0]} + { + echo "command=cargo test --all --doc" + echo "exit_status=${status}" + echo "finished_at=$(date --utc --iso-8601=seconds)" + echo + echo "Remaining test-related processes:" + pgrep -af 'cargo|rustdoc|target/.*/deps/' || true + } > artifacts/test-and-lint/doctest-diagnostics.txt + exit "${status}" + + - name: Upload test reports and diagnostics + if: always() + uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 + with: + name: junit-test-and-lint-${{ github.run_number }} + path: | + target/nextest/ci/junit.xml + artifacts/test-and-lint + retention-days: 3 + if-no-files-found: error # rustfs/backlog#1289: fail if a seed rule's log anchor no longer exists # verbatim in the source tree (log message drifted without updating the @@ -174,15 +227,6 @@ jobs: - name: Check log-analyzer rule anchors run: ./scripts/check_log_analyzer_rules.sh - - name: Upload test junit report - if: always() - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 - with: - name: junit-test-and-lint-${{ github.run_number }} - path: target/nextest/ci/junit.xml - retention-days: 3 - if-no-files-found: ignore - # Explicit gate for migration-critical suites. These tests already ran in # the full nextest pass above; a single filtered nextest invocation keeps # the named gate without rebuilding or re-running them one package at a time.