name: CI
on:
push:
branches: ["main", "master"]
pull_request:
branches: ["main", "master"]
schedule:
- cron: "0 3 * * *"
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
env:
RUSTFLAGS: -Dwarnings
RUST_BACKTRACE: 1
MSRV: "1.85"
permissions:
contents: read
jobs:
ci:
name: CI
if: ${{ always() }}
needs: [fmt, clippy, docs, msrv, test, test-sql]
runs-on: ubuntu-latest
steps:
- name: Result
run: |
results='${{ toJSON(needs) }}'
if echo "$results" | grep -qv '"result": "success"' | grep -q '"result":'; then
echo "One or more required jobs failed." && exit 1
fi
echo "All required jobs passed."
fmt:
name: fmt
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- name: cargo fmt --check
run: cargo fmt --all -- --check
clippy:
name: clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- uses: Swatinem/rust-cache@v2
- name: clippy (no default features)
run: cargo clippy --no-default-features -- -Dclippy::all
- name: clippy (all features except sql)
run: cargo clippy --features full,serde -- -Dclippy::all
- name: clippy (all features)
run: cargo clippy --all-features -- -Dclippy::all
docs:
name: docs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@nightly
- uses: Swatinem/rust-cache@v2
- name: cargo doc
run: cargo doc --no-deps --all-features
env:
RUSTDOCFLAGS: --cfg docsrs -Dwarnings
msrv:
name: msrv (1.85)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ env.MSRV }}
- uses: Swatinem/rust-cache@v2
- name: cargo check (no default features)
run: cargo check --no-default-features
- name: cargo check (full + serde)
run: cargo check --features full,serde
test:
name: test (${{ matrix.os }} / ${{ matrix.rust }})
needs: [fmt, clippy]
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
rust: [stable, beta]
include:
- os: ubuntu-latest
rust: nightly
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ matrix.rust }}
- uses: Swatinem/rust-cache@v2
with:
key: ${{ matrix.os }}-${{ matrix.rust }}
- name: cargo test (no default features)
run: cargo test --no-default-features
- name: cargo test (feature contact)
run: cargo test --features contact
- name: cargo test (feature serde)
run: cargo test --features serde
- name: cargo test (full + serde)
run: cargo test --features full,serde
- name: cargo test --doc
run: cargo test --doc --features full,serde
test-sql:
name: test-sql (ubuntu-latest / stable)
needs: [fmt, clippy]
runs-on: ubuntu-latest
services:
postgres:
image: postgres:16
env:
POSTGRES_USER: arvo
POSTGRES_PASSWORD: arvo
POSTGRES_DB: arvo_test
ports:
- 5432:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
env:
DATABASE_URL: postgres://arvo:arvo@localhost:5432/arvo_test
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
key: sql
- name: cargo test (sql)
run: cargo test --features sql
- name: cargo test (all features)
run: cargo test --all-features
minimal-versions:
name: minimal-versions
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@nightly
- uses: Swatinem/rust-cache@v2
- name: Install cargo-minimal-versions and cargo-hack
uses: taiki-e/install-action@v2
with:
tool: cargo-hack,cargo-minimal-versions
- name: cargo minimal-versions check
run: cargo minimal-versions check --features full,serde