name: CI
on:
push:
branches: [ main, master ]
pull_request:
branches: [ main, master ]
env:
CARGO_TERM_COLOR: always
jobs:
test:
name: Test
runs-on: ${{ matrix.os }}
strategy:
matrix:
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
- os: macos-latest
target: x86_64-apple-darwin
- os: windows-latest
target: x86_64-pc-windows-msvc
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Cache dependencies
uses: Swatinem/rust-cache@v2
- name: Run tests
run: cargo test --target ${{ matrix.target }}
- name: Run tests (no_std)
run: cargo test --target ${{ matrix.target }} --no-default-features --features no_std
- name: Run tests (no SIMD)
run: cargo test --target ${{ matrix.target }} --features no_std,std --no-default-features
msrv:
name: MSRV
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain (MSRV)
uses: dtolnay/rust-toolchain@master
with:
toolchain: 1.70.0
- name: Cache dependencies
uses: Swatinem/rust-cache@v2
- name: Run tests (MSRV)
run: cargo test
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- name: Cache dependencies
uses: Swatinem/rust-cache@v2
- name: Check formatting
run: cargo fmt --all -- --check
- name: Run clippy
run: cargo clippy --all-targets --all-features -- -D warnings
- name: Run clippy (no_std)
run: cargo clippy --all-targets --no-default-features --features no_std -- -D warnings
security:
name: Security Audit
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Install cargo-audit
run: cargo install cargo-audit
- name: Cache dependencies
uses: Swatinem/rust-cache@v2
- name: Run security audit
run: cargo audit
fuzz:
name: Fuzzing
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@nightly
- name: Cache dependencies
uses: Swatinem/rust-cache@v2
- name: Install cargo-fuzz
run: cargo install cargo-fuzz
- name: Build fuzz targets
run: |
cd fuzz
cargo fuzz build
- name: Run fuzz tests (comprehensive)
run: |
cd fuzz
# Run fuzzing for longer periods with multiple strategies
timeout 300 cargo fuzz run clockhash256_fuzz -- -max_total_time=240 -dict=fuzz.dict
continue-on-error: true
- name: Run fuzz tests with regression corpus
run: |
cd fuzz
# Test against known regression cases
if [ -d "fuzz/corpus/clockhash256_fuzz" ]; then
cargo fuzz run clockhash256_fuzz fuzz/corpus/clockhash256_fuzz -- -runs=10000
fi
continue-on-error: true
- name: Generate and test minimal reproducers
run: |
cd fuzz
# Generate minimal test cases from crashes (if any)
cargo fuzz run clockhash256_fuzz -- -max_total_time=30 -minimize_crash=1
continue-on-error: true
docs:
name: Documentation
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache dependencies
uses: Swatinem/rust-cache@v2
- name: Check documentation
run: cargo doc --no-deps --document-private-items
- name: Check documentation (no_std)
run: cargo doc --no-deps --document-private-items --no-default-features --features no_std
bench:
name: Benchmarks
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache dependencies
uses: Swatinem/rust-cache@v2
- name: Run benchmarks (check compilation)
run: cargo bench --no-run