name: CI
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
jobs:
build-test:
name: Build & Test (${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
rust: [stable]
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 code
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ matrix.rust }}
targets: ${{ matrix.target }}
components: rustfmt, clippy
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-
- name: Build (debug)
run: cargo build --verbose
- name: Build (release)
run: cargo build --release --verbose
- name: Run tests
run: cargo test --workspace --verbose
- name: Run tests (release mode)
run: cargo test --workspace --release --verbose
feature-test:
name: Feature Testing
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
features:
- ""
- tokio
- async-std
- metrics
- console
- json-logs
- "tokio metrics"
- "async-std metrics"
- "tokio console json-logs"
- "async-std console json-logs metrics"
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Test feature combination
run: |
echo "Testing with features: ${{ matrix.features }}"
if [ -z "${{ matrix.features }}" ]; then
cargo test --workspace --no-default-features
else
cargo test --workspace --no-default-features --features "${{ matrix.features }}"
fi
quality:
name: Code Quality
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- name: Check formatting
run: cargo fmt --all -- --check
- name: Clippy analysis
run: cargo clippy --workspace --all-features --all-targets -- -D warnings
security:
name: Security Audit
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Security audit
uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- name: Install cargo-audit
run: cargo install cargo-audit
- name: Run security audit
run: cargo audit
docs:
name: Documentation
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Check documentation
env:
RUSTDOCFLAGS: -D warnings
run: cargo doc --workspace --all-features --no-deps
- name: Test documentation examples
run: cargo test --workspace --all-features --doc
benchmarks:
name: Performance Benchmarks
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Run benchmarks
run: |
if [ -f "benches/daemon_bench.rs" ]; then
cargo bench --workspace --all-features
else
echo "No benchmarks found, skipping..."
fi
miri:
name: Miri (Memory Safety)
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust nightly with Miri
uses: dtolnay/rust-toolchain@nightly
with:
components: miri
- name: Setup Miri
run: cargo miri setup
- name: Run Miri tests
run: cargo miri test --workspace
env:
MIRIFLAGS: -Zmiri-strict-provenance -Zmiri-symbolic-alignment-check
msrv:
name: MSRV Check
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install MSRV Rust
uses: dtolnay/rust-toolchain@1.82.0
with:
components: rustfmt, clippy
- name: Delete existing Cargo.lock
run: rm -f Cargo.lock
- name: Regenerate Cargo.lock with MSRV
run: cargo generate-lockfile
- name: Check MSRV compatibility (lib only, no default features)
run: cargo check --lib --no-default-features
- name: Check MSRV compatibility (lib only, minimal features)
run: cargo check --lib --no-default-features --features "tokio toml"