name: Check
on:
push:
branches: [main]
pull_request:
branches: [main]
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@v6
- name: Install toolchain
run: |
rustup toolchain install nightly
rustup default nightly
rustup component add rustfmt
- name: Check style
run: cargo fmt --all -- --check
clippy:
name: Run Clippy
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout the code
uses: actions/checkout@v6
- name: Install toolchain
run: |
rustup toolchain install 1.92.0
rustup default 1.92.0
rustup component add clippy
- name: Setup Rust cache
uses: Swatinem/rust-cache@v2
- name: Run Clippy
run: |
run_clippy () {
echo "::group::cargo clippy $@"
cargo clippy --bins --tests $@ -- -D warnings
echo "::endgroup::"
}
run_clippy --all-features
run_clippy --no-default-features
sed -e 's/#.*//' -e '/^\s*$/d' -e 's/\s\+/,/g' features.txt | while read -r FEATURES; do
run_clippy --no-default-features --features "${FEATURES}"
done
test:
name: Run test suite with Rust ${{ matrix.toolchain }}
needs: [rustfmt, clippy]
runs-on: ubuntu-latest
permissions:
contents: read
continue-on-error: "${{ matrix.toolchain == 'beta' || matrix.toolchain == 'nightly' }}"
strategy:
fail-fast: false matrix:
toolchain:
- stable
- beta
- nightly
steps:
- name: Checkout the code
uses: actions/checkout@v6
- name: Install toolchain
run: |
rustup toolchain install ${{ matrix.toolchain }}
rustup default ${{ matrix.toolchain }}
- name: Setup Rust cache
uses: Swatinem/rust-cache@v2
- name: Setup OPA
uses: open-policy-agent/setup-opa@v2
with:
version: latest
- name: Build OPA bundles for test
run: make build-opa
- name: Test
run: cargo test --all-features
minimal-versions:
name: Run test suite with minimal versions
needs: [rustfmt, clippy]
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout the code
uses: actions/checkout@v6
- name: Install toolchain
run: |
rustup toolchain install 1.91.0 # MSRV
rustup default 1.91.0 # MSRV
- name: Setup Rust cache
uses: Swatinem/rust-cache@v2
- name: Setup OPA
uses: open-policy-agent/setup-opa@v2
with:
version: latest
- name: Build OPA bundles for test
run: make build-opa
- name: Install minimal versions
env:
RUSTC_BOOTSTRAP: "1"
run: |
cargo update -Z minimal-versions
- name: Test
run: cargo test --all-features --locked
coverage:
name: Code coverage
needs: [rustfmt, clippy]
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout the code
uses: actions/checkout@v6
- name: Install toolchain
run: |
rustup toolchain install stable
rustup default stable
- name: Setup Rust cache
uses: Swatinem/rust-cache@v2
- name: Install cargo-llvm-cov
uses: taiki-e/install-action@cargo-llvm-cov
- name: Setup OPA
uses: open-policy-agent/setup-opa@v2
with:
version: latest
- name: Build OPA bundles for test
run: make build-opa
- name: Run test suite with profiling enabled
run: |
cargo llvm-cov --all-features --no-fail-fast --tests --codecov --output-path codecov.json
- name: Upload to codecov.io
uses: codecov/codecov-action@v6
with:
files: codecov.json
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true
tests-done:
name: Tests done
if: ${{ always() }}
needs:
- rustfmt
- clippy
- test
- coverage
- minimal-versions
runs-on: ubuntu-latest
steps:
- uses: matrix-org/done-action@v3
with:
needs: ${{ toJSON(needs) }}