Skip to content

ci: quiet Codacy code scanning noise #1349

ci: quiet Codacy code scanning noise

ci: quiet Codacy code scanning noise #1349

Workflow file for this run

name: Codecov
concurrency:
# This concurrency group ensures that only one Codecov analysis runs at a time
group: codecov-${{ github.ref_name }}
cancel-in-progress: true
on:
push:
branches: ["main"]
pull_request:
branches: ["main"]
# Least-privilege permissions
permissions:
contents: read
checks: write
pull-requests: write
jobs:
coverage:
name: Code Coverage
runs-on: ubuntu-latest
env:
CARGO_LLVM_COV_VERSION: "0.8.5"
JUST_VERSION: "1.50.0"
NEXTEST_VERSION: "0.9.133"
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0 # Needed for codecov to analyze diff
- name: Install Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@2b1f5e9b395427c92ee4e3331786ca3c37afe2d7 # v1.16.0
with:
cache: true
# toolchain, components, etc. are specified in rust-toolchain.toml
- name: Install LLVM coverage tools
run: rustup component add llvm-tools-preview
- name: Cache cargo-llvm-cov
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: ~/.cargo/bin/cargo-llvm-cov
key: cargo-llvm-cov-${{ runner.os }}-${{ env.CARGO_LLVM_COV_VERSION }}
restore-keys: |
cargo-llvm-cov-${{ runner.os }}-
- name: Install cargo-llvm-cov
run: |
installed_version=""
if command -v cargo-llvm-cov &> /dev/null; then
installed_version="$(cargo llvm-cov --version)"
installed_version="${installed_version#cargo-llvm-cov }"
fi
if [ "${installed_version}" != "${CARGO_LLVM_COV_VERSION}" ]; then
cargo install cargo-llvm-cov --locked --version "${CARGO_LLVM_COV_VERSION}"
fi
- name: Install just
uses: taiki-e/install-action@b651345a718c8f44efa2460560b3dbf29cbd7ee1 # v2.75.26
with:
tool: just@${{ env.JUST_VERSION }}
- name: Install nextest
uses: taiki-e/install-action@b651345a718c8f44efa2460560b3dbf29cbd7ee1 # v2.75.26
with:
tool: nextest@${{ env.NEXTEST_VERSION }}
- name: Run tests with nextest (for JUnit XML)
run: |
# Note: We run tests twice in this workflow (nextest + cargo-llvm-cov).
# This is intentional and necessary because:
# 1. nextest: Fast parallel execution → high-quality JUnit XML for test analytics
# 2. cargo-llvm-cov: LLVM-instrumented execution → accurate code coverage metrics
# Trade-off: ~1-2 extra minutes of CI time for significantly better data quality.
echo "::group::Running tests with nextest"
# Generate JUnit XML for Codecov Test Analytics
# JUnit path is configured in .config/nextest.toml [profile.ci.junit]
# Release mode is required: exact-predicate arithmetic makes 3D+ proptests
# exceed timeout limits in debug mode (>60s debug vs <1s release).
# Avoid --all-features: it enables slow-tests and count-allocations which
# are special-purpose features not suitable for general test runs.
cargo nextest run --release --profile ci
echo "::endgroup::"
# Verify JUnit XML was generated at the expected location
# Nextest outputs to target/nextest/<profile>/<path-from-config>
if [ ! -f target/nextest/ci/test-results/junit.xml ]; then
echo "::error::target/nextest/ci/test-results/junit.xml not found"
exit 2
else
echo "::notice::Test results generated: $(wc -l < target/nextest/ci/test-results/junit.xml) lines"
fi
env:
RUST_BACKTRACE: 1
- name: Run coverage
run: |
# Create coverage directory with proper permissions
mkdir -p coverage
chmod 755 coverage
echo "::group::Running coverage"
# Use just coverage-ci for single source of truth
# Configuration is maintained in justfile to avoid duplication
just coverage-ci
echo "::endgroup::"
# Detailed sanity check: verify coverage report was generated
echo "::group::Coverage verification"
echo "Directory listing:"
ls -la coverage/ || echo "Coverage directory not found"
printf "\nSearching for XML files:\n"
find . -name "*.xml" -type f -ls 2>/dev/null || echo "No XML files found"
printf "\nSearching for cobertura files:\n"
find . -name "*cobertura*" -type f -ls 2>/dev/null || echo "No cobertura files found"
if [ ! -f coverage/cobertura.xml ]; then
echo "::error::coverage/cobertura.xml not found. cargo-llvm-cov failed to generate XML output."
echo "::error::Check cargo-llvm-cov logs above for errors."
exit 2
else
coverage_bytes=$(wc -c < coverage/cobertura.xml)
coverage_newlines=$(wc -l < coverage/cobertura.xml)
coverage_lines_covered=$(
grep -oE 'lines-covered="[0-9]+"' coverage/cobertura.xml \
| head -n1 \
| cut -d'"' -f2 || true
)
coverage_lines_valid=$(
grep -oE 'lines-valid="[0-9]+"' coverage/cobertura.xml \
| head -n1 \
| cut -d'"' -f2 || true
)
coverage_line_rate=$(
grep -oE 'line-rate="[0-9.]+"' coverage/cobertura.xml \
| head -n1 \
| cut -d'"' -f2 || true
)
if [ -n "${coverage_lines_covered}" ] \
&& [ -n "${coverage_lines_valid}" ] \
&& [ -n "${coverage_line_rate}" ]; then
echo "::notice::Coverage report generated successfully:"
echo "::notice:: bytes=${coverage_bytes}, xml_newlines=${coverage_newlines}"
echo "::notice:: covered=${coverage_lines_covered}, valid=${coverage_lines_valid}"
echo "::notice:: rate=${coverage_line_rate}"
else
echo "::warning::Coverage report generated (${coverage_bytes} bytes),"
echo "::warning:: could not parse Cobertura metrics; XML newlines=${coverage_newlines}"
fi
fi
# Sanity: ensure benches/examples aren't present (defense-in-depth with .codecov.yml)
if command -v rg >/dev/null 2>&1; then
if rg -n '(^|/)(benches|examples)/' coverage/cobertura.xml; then
echo "::warning::benches/ or examples/ paths detected in coverage report"
fi
else
if grep -nE '(^|/)(benches|examples)/' coverage/cobertura.xml; then
echo "::warning::benches/ or examples/ paths detected in coverage report"
fi
fi
echo "::endgroup::"
env:
RUST_BACKTRACE: 1
DELAUNAY_PROPTEST_COVERAGE_LOGS: 1
- name: Upload coverage to Codecov
if: ${{ success() && hashFiles('coverage/cobertura.xml') != '' }}
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: coverage/cobertura.xml
flags: unittests
name: codecov-umbrella
fail_ci_if_error: false
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
- name: Upload test results to Codecov
if: ${{ success() && hashFiles('target/nextest/ci/test-results/junit.xml') != '' }}
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: target/nextest/ci/test-results/junit.xml
flags: unittests
name: test-results
report_type: test_results
fail_ci_if_error: false
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
- name: Upload coverage to Codacy
if: ${{ success() && hashFiles('coverage/cobertura.xml') != '' }}
uses: codacy/codacy-coverage-reporter-action@89d6c85cfafaec52c72b6c5e8b2878d33104c699 # v1.3.0
with:
project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
coverage-reports: coverage/cobertura.xml
language: rust
continue-on-error: true
- name: Archive coverage results
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: always()
with:
name: coverage-report
path: coverage/
- name: Archive test results
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: always()
with:
name: test-results
path: target/nextest/ci/test-results/