name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
gates:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- name: Format
run: cargo fmt --all -- --check
- name: Clippy (all targets, all features)
run: cargo clippy --locked --all-targets --all-features -- -D warnings
- name: Clippy (no default features)
run: cargo clippy --locked --all-targets --no-default-features -- -D warnings
- name: Tests
run: cargo test --locked --all-features
- name: Tests (no default features)
run: cargo test --locked --no-default-features
- name: Documentation
env:
RUSTDOCFLAGS: -D warnings
run: cargo doc --locked --no-deps --all-features
- name: Benchmarks compile
run: cargo bench --locked --bench codec --no-run
msrv:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@1.85.0
- name: MSRV check (every feature, every target)
run: cargo check --locked --all-targets --all-features
- name: MSRV check (no default features)
run: cargo check --locked --no-default-features
api-surface:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@nightly
- name: Generate rustdoc JSON
run: cargo +nightly rustdoc --locked --lib --all-features -- -Zunstable-options --output-format json
- name: No public secret accessor
run: python3 scripts/api_surface.py target/doc/active_infinity.json
hardening-status:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Validate the hardening matrix
run: python3 scripts/hardening_status.py --check
negative-controls:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Every security-critical check must fail on a broken build
run: python3 scripts/negative_controls.py --check
package:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Package (the tarball must build on its own)
run: cargo package --locked
fuzz:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@nightly
- name: Install clang (libFuzzer runtime)
run: sudo apt-get update && sudo apt-get install -y clang
- name: Install cargo-fuzz
run: cargo install cargo-fuzz --locked
- name: Bounded fuzz campaign (every target)
run: |
for target in \
fuzz_decode_infinity \
fuzz_stream_reassembly \
fuzz_canonical_roundtrip \
fuzz_layout_sections \
fuzz_graph_cycles \
fuzz_secret_positions \
fuzz_unit_discriminants \
fuzz_projection_agreement; do
echo "== $target =="
cargo fuzz run "$target" -- -runs=2000
done
supply-chain:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Install audit tools
run: cargo install cargo-audit cargo-deny --locked
- name: Advisory audit
run: cargo audit
- name: Dependency policy
run: cargo deny check
sbom:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Generate and verify the SBOM
run: |
mkdir -p dist
python3 scripts/sbom.py --output dist/active-infinity.cdx.json
python3 scripts/sbom.py --check dist/active-infinity.cdx.json
- uses: actions/upload-artifact@v4
with:
name: sbom
path: dist/*.cdx.json