name: CI
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
env:
CARGO_TERM_COLOR: always
jobs:
fmt:
name: Formatting
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- name: Check formatting
run: cargo fmt --all -- --check
msrv:
name: MSRV
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust (MSRV)
uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.65.0"
- name: Build (MSRV)
run: cargo build --verbose
- name: Run tests (MSRV)
run: cargo test --verbose
no-std:
name: no_std
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Build without default features
run: cargo build --no-default-features --verbose
test:
name: Test Suite
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
rust: [stable, beta, nightly]
exclude:
- os: macos-latest
rust: beta
- os: windows-latest
rust: beta
- os: macos-latest
rust: nightly
- os: windows-latest
rust: nightly
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust }}
components: rustfmt, clippy
- name: Cache dependencies
uses: actions/cache@v3
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-
- name: Run clippy
run: cargo clippy --all-targets -- -D warnings
- name: Build
run: cargo build --verbose
- name: Run tests
run: cargo test --verbose
coverage:
name: Code Coverage
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
components: llvm-tools-preview
- name: Install cargo-llvm-cov
uses: taiki-e/install-action@cargo-llvm-cov
- name: Generate coverage report
run: cargo llvm-cov --all-features --workspace --lcov --output-path lcov.info
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
with:
files: lcov.info
fail_ci_if_error: false
verbose: true
benchmark:
name: Benchmarks
runs-on: ubuntu-latest
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache dependencies
uses: actions/cache@v3
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-bench-${{ hashFiles('**/Cargo.lock') }}
- name: Run tests instead of benchmarks (benchmarks temporarily disabled)
run: cargo test --lib --release
security:
name: Security Audit
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Install cargo-audit
run: cargo install cargo-audit
- name: Run security audit
run: cargo audit
integration:
name: Integration Tests
runs-on: ubuntu-latest
needs: [fmt, msrv, no-std, test]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache dependencies
uses: actions/cache@v3
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-integration-${{ hashFiles('**/Cargo.lock') }}
- name: Run library tests (integration tests temporarily disabled)
run: cargo test --lib --all-features
publish:
name: Publish to crates.io
runs-on: ubuntu-latest
if: github.event_name == 'push' && github.ref == 'refs/heads/main' && startsWith(github.event.head_commit.message, 'Release ')
needs: [fmt, msrv, no-std, test, security, integration]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Login to crates.io
run: cargo login ${{ secrets.CRATES_IO_TOKEN }}
- name: Publish to crates.io
run: cargo publish --all-features
performance-regression:
name: Performance Regression Check
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache dependencies
uses: actions/cache@v3
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-perf-${{ hashFiles('**/Cargo.lock') }}
- name: Build benchmark target
run: cargo build --release --example performance_benchmark
- name: Run baseline performance tests
run: |
git checkout origin/main
cargo build --release --example performance_benchmark
echo "Running baseline performance tests..."
timeout 60s cargo run --release --example performance_benchmark > baseline_output.txt 2>&1 || echo "Baseline tests completed"
- name: Run PR branch performance tests
run: |
git checkout ${{ github.sha }}
cargo build --release --example performance_benchmark
echo "Running PR branch performance tests..."
timeout 60s cargo run --release --example performance_benchmark > pr_output.txt 2>&1 || echo "PR tests completed"
- name: Compare performance results
run: |
echo "Performance regression analysis:"
echo "==============================="
# Extract throughput metrics if available
if [ -f baseline_output.txt ] && [ -f pr_output.txt ]; then
echo "Baseline results:"
grep -E "(Throughput|ops/sec)" baseline_output.txt | head -5 || echo "No baseline throughput data found"
echo -e "\nPR branch results:"
grep -E "(Throughput|ops/sec)" pr_output.txt | head -5 || echo "No PR throughput data found"
# Simple regression detection (would need more sophisticated analysis in production)
echo -e "\nRegression check completed"
else
echo "Performance test outputs not available for comparison"
fi
# Always succeed for now, but this could be enhanced to fail on significant regressions
echo "Performance regression check completed - tests executed successfully"