name: MSRV
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
CARGO_TERM_COLOR: always
jobs:
changes:
name: Detect Changes
runs-on: ubuntu-latest
outputs:
rust: ${{ steps.filter.outputs.rust }}
steps:
- uses: actions/checkout@v7
- uses: dorny/paths-filter@v4
id: filter
with:
filters: |
rust:
- 'src/**'
- 'Cargo.toml'
- 'Cargo.lock'
- 'rust-toolchain.toml'
msrv-check:
name: MSRV Check
needs: changes
if: needs.changes.outputs.rust == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- name: Install cargo-msrv
run: cargo install cargo-msrv --locked
- name: Find MSRV
id: msrv
run: |
MSRV=$(cargo msrv find --min 1.75.0 2>&1 | grep -oP 'Minimum Supported Rust Version \(MSRV\): \K[0-9.]+' || echo "unknown")
echo "msrv=$MSRV" >> $GITHUB_OUTPUT
echo "MSRV: $MSRV"
- name: Report MSRV
run: |
echo "## MSRV Report" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "Minimum Supported Rust Version: **${{ steps.msrv.outputs.msrv }}**" >> $GITHUB_STEP_SUMMARY
msrv-verify:
name: Verify MSRV (${{ matrix.rust }})
needs: changes
if: needs.changes.outputs.rust == 'true'
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
rust:
- "1.85.0" - stable
- beta
steps:
- uses: actions/checkout@v7
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust }}
- uses: Swatinem/rust-cache@v2
with:
key: ${{ matrix.rust }}
- name: Check
run: cargo check --all-features
- name: Build
run: cargo build --all-features
- name: Test
run: cargo test --all-features
msrv-result:
name: MSRV Result
needs: [changes, msrv-check, msrv-verify]
if: always()
runs-on: ubuntu-latest
steps:
- name: Check results
run: |
if [[ "${{ needs.changes.outputs.rust }}" != "true" ]]; then
echo "No relevant changes detected, skipping MSRV checks"
exit 0
fi
if [[ "${{ needs.msrv-check.result }}" == "failure" || \
"${{ needs.msrv-verify.result }}" == "failure" ]]; then
echo "MSRV check failed"
exit 1
fi
echo "MSRV checks passed"