name: CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
env:
CARGO_TERM_COLOR: always
permissions:
contents: write
actions: write
issues: write
pull-requests: write
checks: write security-events: write
jobs:
check:
name: Quick Check
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache dependencies
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-check-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-check-
${{ runner.os }}-cargo-
- name: Run cargo check
run: cargo check --all-features --all-targets
lint:
name: Format & Lint
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- name: Cache dependencies
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-lint-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-lint-
${{ runner.os }}-cargo-
- name: Check formatting
run: cargo fmt -- --check
- name: Run clippy
run: cargo clippy --all-targets --all-features -- -D warnings
test-and-coverage:
name: Test & Coverage
runs-on: ubuntu-latest
timeout-minutes: 30
needs: [check, lint]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache dependencies
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-test-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-test-
${{ runner.os }}-cargo-
- name: Cache cargo-tarpaulin
uses: actions/cache@v4
id: cache-tarpaulin
with:
path: ~/.cargo/bin/cargo-tarpaulin
key: ${{ runner.os }}-tarpaulin-0.30.0
- name: Install cargo-tarpaulin
if: steps.cache-tarpaulin.outputs.cache-hit != 'true'
run: cargo install cargo-tarpaulin --version 0.30.0
- name: Run tests
run: cargo test --all-features --workspace
- name: Build and test with coverage
run: cargo tarpaulin --verbose --all-features --workspace --timeout 300 --out xml
- name: Run doc tests
run: cargo test --doc --all-features
- name: Check documentation
run: cargo doc --no-deps --all-features --document-private-items
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
with:
file: ./cobertura.xml
fail_ci_if_error: false
token: ${{ secrets.CODECOV_TOKEN }}
security:
name: Security Audit
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Run security audit
run: |
cargo install cargo-audit --locked
cargo audit
rust-versions:
name: Rust ${{ matrix.rust }}
runs-on: ubuntu-latest
timeout-minutes: 20
strategy:
matrix:
rust: [stable, beta]
fail-fast: false
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust ${{ matrix.rust }}
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust }}
- name: Cache dependencies
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ matrix.rust }}-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-${{ matrix.rust }}-
${{ runner.os }}-cargo-
- name: Build
run: cargo build --all-features
- name: Test
run: cargo test --all-features