name: Rust CI
on:
pull_request:
types: [opened, synchronize, reopened, labeled, unlabeled, edited]
branches:
- main
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
RUSTFLAGS: "-D warnings"
RUSTDOCFLAGS: "-D warnings"
jobs:
filter-changes:
runs-on: ubuntu-latest
outputs:
src-changed: ${{ steps.filter.outputs.src }}
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
- name: Detect Changes
uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d
id: filter
with:
predicate-quantifier: 'every'
filters: |
src:
- 'src/**'
- 'Cargo.toml'
test:
runs-on: ${{ matrix.os }}
needs: filter-changes
if: ${{ needs.filter-changes.outputs.src-changed == 'true' }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
rust:
- stable
- beta
steps:
- uses: actions/checkout@v7
- uses: dtolnay/rust-toolchain@1.89
- uses: actions/setup-python@v6
with:
python-version: '3.x'
- name: Install Python test dependencies
run: pip install --group test -e .
- uses: actions-rs/cargo@v1
with:
command: build
args: --all-targets --features python
- uses: actions-rs/cargo@v1
with:
command: test
- uses: actions-rs/cargo@v1
with:
command: test
args: --features python
- name: Run Python tests
run: pytest tests/
lint:
runs-on: ubuntu-latest
needs: filter-changes
if: ${{ needs.filter-changes.outputs.src-changed == 'true' }}
steps:
- uses: actions/checkout@v7
- uses: dtolnay/rust-toolchain@1.89
with:
components: clippy, rustfmt
- uses: actions-rs/cargo@v1
with:
command: fmt
args: --all -- --check
- uses: actions-rs/cargo@v1
if: always()
with:
command: clippy
args: --all-features
- uses: actions-rs/cargo@v1
if: always()
with:
command: doc
fuzzer:
runs-on: ubuntu-latest
needs: filter-changes
if: ${{ needs.filter-changes.outputs.src-changed == 'true' }}
steps:
- uses: actions/checkout@v7
- uses: dtolnay/rust-toolchain@1.89
- name: Run fuzzer
env:
HANNOY_FUZZ_DURATION_SEC: 1800
run: cargo test -- random_read_writes
ci-pass:
runs-on: ubuntu-latest
if: always()
needs: [test, lint, fuzzer]
steps:
- name: Verify CI results
run: |
if [[ "${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }}" == "true" ]]; then
echo "One or more jobs failed or were cancelled"
exit 1
fi