# Adapted from https://github.com/joshka/github-workflows/blob/main/.github/workflows/rust-check.yml # Thanks to joshka for permission to use this template! on: push: branches: - main pull_request: name: Check env: CARGO_TERM_COLOR: always concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true jobs: fmt: name: stable / fmt runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v5 - name: Install Rust stable uses: dtolnay/rust-toolchain@stable with: components: rustfmt - name: Run cargo fmt run: cargo fmt -- --check - name: Cache Cargo dependencies uses: Swatinem/rust-cache@v2 clippy: name: ${{ matrix.toolchain }} / clippy runs-on: ubuntu-latest permissions: checks: write strategy: fail-fast: false matrix: # Get early warnings about new lints introduced in the beta channel toolchain: [stable, beta] steps: - name: Checkout uses: actions/checkout@v5 - name: Install Rust stable uses: dtolnay/rust-toolchain@stable with: components: clippy - name: Run clippy action uses: clechasseur/rs-clippy-check@v5 - name: Cache Cargo dependencies uses: Swatinem/rust-cache@v2 doc: # run docs generation on nightly rather than stable. This enables features like # https://doc.rust-lang.org/beta/unstable-book/language-features/doc-cfg.html which allows an # API be documented as only available in some specific platforms. name: nightly / doc runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - name: Install Rust nightly uses: dtolnay/rust-toolchain@nightly - name: Run cargo doc run: cargo doc --no-deps --all-features env: RUSTDOCFLAGS: --cfg docsrs msrv: # check that we can build using the minimal rust version that is specified by this crate name: 1.95.0 / check runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - name: Install 1.95.0 uses: dtolnay/rust-toolchain@master with: toolchain: 1.95.0 - name: cargo +1.95.0 check run: cargo check dockerfile-msrv: # The Dockerfile's pinned Rust image is only built at release time, so a # rust-version bump that misses it fails silently until the next release. # Catch the drift on every push instead. name: dockerfile / msrv runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - name: Check Dockerfile Rust image against Cargo.toml rust-version run: | set -euo pipefail msrv=$(sed -nE 's/^rust-version = "([0-9.]+)"$/\1/p' Cargo.toml) image_tag=$(sed -nE 's/^FROM rust:([0-9.]+) AS builder$/\1/p' Dockerfile) : "${msrv:?failed to extract rust-version from Cargo.toml}" : "${image_tag:?failed to extract the rust image tag from the Dockerfile}" # The rust image tag pins major.minor, so compare on major.minor only msrv_mm=$(echo "$msrv" | cut -d. -f1,2) image_mm=$(echo "$image_tag" | cut -d. -f1,2) if [ "$(printf '%s\n' "$msrv_mm" "$image_mm" | sort -V | head -n1)" != "$msrv_mm" ]; then echo "Dockerfile builds with rust:$image_tag, but Cargo.toml declares rust-version = \"$msrv\"." echo "Cargo refuses to build under an older toolchain, so the release Docker publish step will fail." echo "Update the FROM rust:* line in the Dockerfile to at least $msrv_mm." exit 1 fi echo "OK: Dockerfile rust:$image_tag satisfies rust-version $msrv"