name: Rust CI
on:
pull_request:
branches: [master]
paths:
- "Cargo.lock"
- "Cargo.toml"
- "flake.lock"
- "flake.nix"
- ".github/workflows/ci.yml"
- "**/*.rs"
push:
branches: [master]
paths:
- "Cargo.lock"
- "Cargo.toml"
- "flake.lock"
- "flake.nix"
- ".github/workflows/ci.yml"
- "**/*.rs"
env:
CARGO_TERM_COLOR: always
jobs:
test:
name: Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Cache cargo registry
uses: actions/cache@v5
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-
- uses: dtolnay/rust-toolchain@stable
- name: Run tests
run: cargo test
fmt:
name: Format
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- name: Enforce formatting
run: cargo fmt --check
clippy:
name: Clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Cache cargo registry
uses: actions/cache@v5
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- name: Linting
run: cargo clippy -- -D warnings
machete:
name: Detect unused dependencies
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Machete
uses: bnjbvr/cargo-machete@main
coverage:
name: Code coverage
runs-on: ubuntu-latest
container:
image: xd009642/tarpaulin
options: --security-opt seccomp=unconfined
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Cache cargo registry
uses: actions/cache@v5
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-
- name: Generate code coverage
run: |
cargo tarpaulin --verbose --workspace -o lcov -o html
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v6
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: lcov.info
fail_ci_if_error: false
verbose: true
flags: unittests
name: codecov-umbrella
- name: Upload coverage artifact
uses: actions/upload-artifact@v7
with:
name: coverage-report
path: |
lcov.info
tarpaulin-report.html
retention-days: 30