diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ab741d9..1d4b51d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,3 +33,67 @@ jobs: - name: Clippy run: cargo clippy --all-targets --all-features -- -D warnings + + coverage: + name: Code coverage (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ ubuntu-latest, macOS-latest, windows-latest ] + steps: + - uses: actions/checkout@v4 + + - name: Initialize workflow variables + id: vars + shell: bash + run: | + ## VARs setup + outputs() { step_id="vars"; for var in "$@" ; do echo steps.${step_id}.outputs.${var}="${!var}"; echo "${var}=${!var}" >> $GITHUB_OUTPUT; done; } + # CODECOV_FLAGS + CODECOV_FLAGS=$( echo "${{ matrix.os }}" | sed 's/[^[:alnum:]]/_/g' ) + outputs CODECOV_FLAGS + + - name: Install Rust (nightly) + uses: dtolnay/rust-toolchain@nightly + - run: rustup component add llvm-tools-preview + + - name: Test + run: cargo test --no-fail-fast + env: + CARGO_INCREMENTAL: "0" + RUSTC_WRAPPER: "" + RUSTFLAGS: "-Cinstrument-coverage -Zcoverage-options=branch -Ccodegen-units=1 -Copt-level=0 -Coverflow-checks=off -Zpanic_abort_tests -Cpanic=abort" + RUSTDOCFLAGS: "-Cpanic=abort" + LLVM_PROFILE_FILE: "grep-%p-%m.profraw" + + - name: Install grcov + shell: bash + run: | + git clone https://github.com/mozilla/grcov.git ~/grcov/ + cd ~/grcov + cargo install --path . + + - name: Generate coverage data (via grcov) + id: coverage + shell: bash + run: | + set -v + ## Generate coverage data + COVERAGE_REPORT_DIR="target/debug" + COVERAGE_REPORT_FILE="${COVERAGE_REPORT_DIR}/lcov.info" + mkdir -p "${COVERAGE_REPORT_DIR}" + # display coverage files + grcov . --output-type files --binary-path "${COVERAGE_REPORT_DIR}" --source-dir . --keep-only "src/*" | sort --unique + # generate coverage report + grcov . --output-type lcov --output-path "${COVERAGE_REPORT_FILE}" --binary-path "${COVERAGE_REPORT_DIR}" --source-dir . --keep-only "src/*" --branch + echo "report=${COVERAGE_REPORT_FILE}" >> $GITHUB_OUTPUT + + - name: Upload coverage results (to Codecov.io) + uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: ${{ steps.coverage.outputs.report }} + flags: ${{ steps.vars.outputs.CODECOV_FLAGS }} + name: codecov-umbrella + fail_ci_if_error: false