diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..6b65838 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,164 @@ +name: CI + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + CARGO_TERM_COLOR: always + +jobs: + rustfmt: + name: Check style + runs-on: ubuntu-latest + + permissions: + contents: read + + steps: + - name: Checkout the code + uses: actions/checkout@v3 + + - name: Install toolchain + id: toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: nightly + target: x86_64-unknown-linux-musl + components: rustfmt + profile: minimal + override: true + + - name: Check style + uses: actions-rs/cargo@v1 + with: + command: fmt + args: --all -- --check + + clippy: + name: Run Clippy + runs-on: ubuntu-latest + + permissions: + contents: read + + steps: + - name: Checkout the code + uses: actions/checkout@v3 + + - name: Install toolchain + id: toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: x86_64-unknown-linux-musl + components: clippy + profile: minimal + override: true + + - name: Setup cache + uses: Swatinem/rust-cache@v2 + + - name: Run Clippy + uses: actions-rs/cargo@v1 + with: + command: clippy + args: --workspace -- -D warnings + + test: + name: Run test suite with Rust ${{ matrix.toolchain }} + needs: [rustfmt, clippy] + runs-on: ubuntu-latest + + permissions: + contents: read + + strategy: + fail-fast: false # Continue other jobs if one fails to help filling the cache + matrix: + toolchain: + - "1.61.0" # MSRV + - stable + - beta + - nightly + + steps: + - name: Checkout the code + uses: actions/checkout@v3 + + - name: Install toolchain + id: toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: x86_64-unknown-linux-musl + components: clippy + profile: minimal + override: true + + - name: Setup cache + uses: Swatinem/rust-cache@v2 + + - name: Test + id: test + uses: actions-rs/cargo@v1 + with: + command: test + args: --workspace + + coverage: + name: Code coverage + needs: [rustfmt, clippy] + runs-on: ubuntu-latest + + permissions: + contents: read + + steps: + - name: Checkout the code + uses: actions/checkout@v3 + + - name: Install toolchain + id: toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: x86_64-unknown-linux-musl + override: true + components: llvm-tools-preview + + - name: Setup cache + uses: Swatinem/rust-cache@v2 + + - name: Download grcov + run: | + mkdir -p "${HOME}/.local/bin" + curl -sL https://github.com/mozilla/grcov/releases/download/v0.8.11/grcov-x86_64-unknown-linux-gnu.tar.bz2 | tar jxf - -C "${HOME}/.local/bin" + echo "$HOME/.local/bin" >> $GITHUB_PATH + + - name: Run test suite with profiling enabled + uses: actions-rs/cargo@v1 + with: + command: test + args: --no-fail-fast --workspace + env: + CARGO_INCREMENTAL: '0' + RUSTFLAGS: '-Cinstrument-coverage' + LLVM_PROFILE_FILE: "cargo-test-%p-%m.profraw" + + - name: Build grcov report + run: | + mkdir -p target/coverage + grcov . --binary-path ./target/debug/deps/ -s . -t lcov --branch --ignore-not-existing --ignore '../*' --ignore "/*" -o target/coverage/tests.lcov + + - name: Upload to codecov.io + uses: codecov/codecov-action@v3 + with: + files: target/coverage/*.lcov + flags: unit