name: CI
on:
push:
branches:
- main
pull_request:
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: ${{ github.ref_name != github.event.repository.default_branch }}
permissions: {}
jobs:
set-matrix:
runs-on: ubuntu-latest
outputs:
rust: ${{ steps.set-values.outputs.rust }}
os: ${{ steps.set-values.outputs.os }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de with:
toolchain: stable
- uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 - name: Set matrix values
id: set-values
run: |
msrv="$(./scripts/print-msrv)"
rust="$(jq -c <<< "[\"stable\", \"${msrv}\"]")"
echo "rust=${rust}" >> "$GITHUB_OUTPUT"
os="$(jq -c <<< '["ubuntu-latest", "macos-latest", "windows-latest"]')"
echo "os=${os}" >> "$GITHUB_OUTPUT"
jq -n --argjson rust "${rust}" --argjson os "${os}" '{ rust: $rust, os: $os }'
shell: bash
check-rust:
name: Check (rust)
needs: set-matrix
strategy:
fail-fast: true
matrix:
rust: ${{ fromJSON(needs.set-matrix.outputs.rust) }}
os: ${{ fromJSON(needs.set-matrix.outputs.os) }}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de with:
toolchain: ${{ matrix.rust }}
- uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 - run: mise run ci:check-rust
shell: bash
check-rustdoc:
name: Check (rustdoc)
needs: set-matrix
strategy:
fail-fast: true
matrix:
rust: [stable]
os: ${{ fromJSON(needs.set-matrix.outputs.os) }}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de with:
toolchain: ${{ matrix.rust }}
- uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 - run: mise run ci:check-rustdoc
shell: bash
check-unused-deps:
name: Check (unused dependencies)
needs: set-matrix
strategy:
fail-fast: true
matrix:
rust: [stable]
os: ${{ fromJSON(needs.set-matrix.outputs.os) }}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de with:
toolchain: ${{ matrix.rust }}
- uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 - run: mise run ci:check-unused-deps
shell: bash
lint-rustfmt:
name: Lint (rustfmt)
strategy:
fail-fast: true
matrix:
rust: [stable]
os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de with:
toolchain: ${{ matrix.rust }}
- uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 - run: mise run ci:lint-rustfmt
shell: bash
lint-rust:
name: Lint (rust)
needs: set-matrix
strategy:
fail-fast: true
matrix:
rust: [stable]
os: ${{ fromJSON(needs.set-matrix.outputs.os) }}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de with:
toolchain: ${{ matrix.rust }}
- uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 - run: mise run ci:lint-rust
shell: bash
test-rust:
name: Test (rust)
needs: set-matrix
strategy:
fail-fast: true
matrix:
rust: ${{ fromJSON(needs.set-matrix.outputs.rust) }}
os: ${{ fromJSON(needs.set-matrix.outputs.os) }}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de with:
toolchain: ${{ matrix.rust }}
- uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - run: mise run install-toolchains-for-rust-test
shell: bash
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 - run: mise run ci:test-rust
shell: bash
coverage-rust-test:
name: Coverage (rust test)
needs: set-matrix
strategy:
fail-fast: true
matrix:
rust: [stable]
os: ${{ fromJSON(needs.set-matrix.outputs.os) }}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de with:
toolchain: ${{ matrix.rust }}
- uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - run: mise run install-toolchains-for-rust-test
shell: bash
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 - run: mise run ci:coverage-rust-test
shell: bash
- uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 with:
token: ${{ secrets.CODECOV_TOKEN }}
files: target/codecov-test.json
fail_ci_if_error: false
coverage-rust-run:
name: Coverage (rust run)
needs: set-matrix
strategy:
fail-fast: true
matrix:
rust: [stable]
os: ${{ fromJSON(needs.set-matrix.outputs.os) }}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de with:
toolchain: ${{ matrix.rust }}
- uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - run: mise run install-toolchains-for-rust-run
shell: bash
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 - run: mise run ci:coverage-rust-run
shell: bash
- uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 with:
token: ${{ secrets.CODECOV_TOKEN }}
files: target/codecov-run.json
fail_ci_if_error: false
check-release:
name: Check (release)
strategy:
fail-fast: true
matrix:
rust: [stable]
os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de with:
toolchain: ${{ matrix.rust }}
- uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 - run: mise run check:release --skip-ci
shell: bash
build-book:
name: Build (book)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - run: mise run ci:build-book
shell: bash
test-book:
name: Test (book)
strategy:
fail-fast: true
matrix:
rust: [stable]
os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de with:
toolchain: ${{ matrix.rust }}
- uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 - run: mise run ci:test-book
shell: bash
lint-toml:
name: Lint (toml)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - run: mise run ci:lint-toml
shell: bash
lint-workflow:
name: Lint (workflow)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - run: mise run ci:lint-workflow
shell: bash
lint-spelling:
name: Lint (spelling)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - run: mise run ci:lint-spelling
shell: bash
sync-markdown:
name: Sync (markdown)
needs: set-matrix
strategy:
fail-fast: true
matrix:
rust: [stable]
os: ${{ fromJSON(needs.set-matrix.outputs.os) }}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de with:
toolchain: ${{ matrix.rust }}
- uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - run: mise run install-toolchains-for-sync-markdown
shell: bash
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 - run: mise run ci:sync-markdown
shell: bash
lint-markdown:
name: Lint (markdown)
strategy:
fail-fast: true
matrix:
rust: [stable]
os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de with:
toolchain: ${{ matrix.rust }}
- uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 - run: mise run ci:lint-markdown
shell: bash
lint-editorconfig:
name: Lint (editorconfig)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - run: mise run ci:lint-editorconfig
shell: bash
lint-shell:
name: Lint (shell scripts)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - run: mise run ci:lint-shell
shell: bash
lint-renovate:
name: Lint (renovate)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c - run: mise run ci:lint-renovate
shell: bash
ci-complete:
needs:
- set-matrix
- lint-rustfmt
- check-rust
- check-rustdoc
- check-unused-deps
- lint-rust
- test-rust
- coverage-rust-test
- coverage-rust-run
- check-release
- build-book
- test-book
- lint-toml
- lint-workflow
- lint-spelling
- sync-markdown
- lint-markdown
- lint-editorconfig
- lint-shell
- lint-renovate
runs-on: ubuntu-latest
if: ${{ always() }}
steps:
- name: CI complete
run: |
if ${{ !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') }}; then
echo "CI succeeded"
else
echo "CI failed"
exit 1
fi
shell: bash