Skip to content

Cargo

Cargo #751

Workflow file for this run

on: [push, pull_request, merge_group]
name: Cargo
jobs:
fmt:
name: Fmt
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Install toolchain
uses: dtolnay/rust-toolchain@v1
with:
toolchain: 1.80.0 # MSRV
components: rustfmt
- name: Run cargo fmt
run: cargo fmt --check
check:
name: Check
runs-on: ubuntu-latest
strategy:
matrix:
rust:
- 1.80.0 # MSRV
- stable
- beta
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Install toolchain
uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ matrix.rust }}
- uses: swatinem/rust-cache@v2
with:
shared-key: "ci"
- name: Run cargo check
run: cargo check --all-targets
test:
needs: [check]
name: Test
runs-on: ubuntu-latest
strategy:
matrix:
rust:
- 1.80.0 # MSRV
- stable
- beta
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Install toolchain
uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ matrix.rust }}
- uses: swatinem/rust-cache@v2
with:
shared-key: "ci"
- name: Run cargo test
run: cargo test
deny:
name: Deny
runs-on: ubuntu-latest
strategy:
matrix:
checks:
- advisories
- bans licenses sources
# Prevent sudden announcement of a new advisory from failing CI:
continue-on-error: ${{ matrix.checks == 'advisories' }}
steps:
- uses: actions/checkout@v4
# https://github.com/EmbarkStudios/cargo-deny-action:
- uses: EmbarkStudios/cargo-deny-action@v2
with:
command: check ${{ matrix.checks }}
clippy:
needs: [check]
name: Clippy
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.optional }}
strategy:
fail-fast: false
matrix:
include:
- rust: 1.80.0 # MSRV
optional: false
- rust: beta
optional: true
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@v1
with:
toolchain: ${{ matrix.rust }}
components: clippy
- uses: swatinem/rust-cache@v2
with:
shared-key: "ci"
- name: cargo clippy
run: cargo clippy --all-targets -- -D warnings
# This "accumulation" job is used as the required CI check for PRs.
# We could require multiple jobs but the MSRV is subject to change and makes
# it into the job names when using the matrix strategy (e.g., "Check (1.65.0)").
# This approach seems to be the easiest solution for now.
# Ideally, it would be enough to set "needs" accordingly but GitHub will
# accept the "skipped" status as a "success" when merging (which is very
# bad!). Therefore, we need to always run this job and have to manually check
# if all required jobs did return "success".
result:
name: Result
if: ${{ always() }}
runs-on: ubuntu-latest
needs:
- fmt
- check
- test
- deny
- clippy
steps:
- run: |
echo "Error: A required CI check failed!" >&2
exit 1
if: >-
${{
contains(needs.*.result, 'failure') ||
contains(needs.*.result, 'cancelled') ||
contains(needs.*.result, 'skipped')
}}