name: CI
permissions:
actions: read
contents: read
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
CARGO_NET_RETRY: 10
CARGO_TERM_COLOR: always
CI: 1
RUSTUP_MAX_RETRIES: 10
RUST_BACKTRACE: short
jobs:
build-test:
name: Build+Test
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 20
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- name: Install just
uses: extractions/setup-just@v3
- name: Cache Dependencies
uses: Swatinem/rust-cache@v2
- name: CI (check + test)
run: just ci
msrv:
name: MSRV
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Determine MSRV from Cargo.toml
id: msrv
run: |
msrv=$(sed -n 's/^rust-version *= *"\(.*\)"/\1/p' Cargo.toml)
if [ -z "$msrv" ]; then
echo "::error::rust-version not found in Cargo.toml"
exit 1
fi
echo "version=$msrv" >> "$GITHUB_OUTPUT"
- name: Install MSRV toolchain (${{ steps.msrv.outputs.version }})
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ steps.msrv.outputs.version }}
- name: Cache Dependencies
uses: Swatinem/rust-cache@v2
- name: Build (MSRV)
run: cargo build --lib
- name: Check (no-std, MSRV)
run: cargo check --lib --no-default-features
fuzz:
name: Fuzz
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Install nightly toolchain
uses: dtolnay/rust-toolchain@nightly
- name: Install cargo-fuzz
run: cargo install cargo-fuzz --locked
- name: Install just
uses: extractions/setup-just@v3
- name: Cache Dependencies
uses: Swatinem/rust-cache@v2
with:
workspaces: fuzz
- name: Generate seed corpus
run: just generate-corpus
- name: Fuzz all targets (2 minutes each)
run: just fuzz-all
- name: Upload fuzz artifacts
if: failure()
uses: actions/upload-artifact@v4
with:
name: fuzz-artifacts
path: |
fuzz/artifacts/
target/fuzz-logs/