name: Release
on:
push:
tags:
- "v*"
permissions:
contents: read
jobs:
verify:
name: Verify release (Rust ${{ matrix.toolchain }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
toolchain:
- "1.85.0"
- stable
steps:
- name: Check out tagged commit
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.toolchain }}
components: rustfmt, clippy
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
- name: Verify tag matches package version
shell: bash
run: |
package_version="$(
cargo metadata --no-deps --format-version 1 |
python3 -c 'import json, sys; print(json.load(sys.stdin)["packages"][0]["version"])'
)"
expected_tag="v${package_version}"
if [[ "${GITHUB_REF_NAME}" != "${expected_tag}" ]]; then
echo "::error::tag ${GITHUB_REF_NAME} does not match package version ${package_version}"
exit 1
fi
- name: Check formatting
if: matrix.toolchain == 'stable'
run: cargo fmt --all -- --check
- name: Check compilation
run: cargo check --all-targets --locked
- name: Run Clippy
run: cargo clippy --all-targets --all-features --locked -- -D warnings
- name: Check public Rustdoc
if: matrix.toolchain == 'stable'
run: cargo rustdoc --lib --locked -- -D missing_docs
- name: Run tests
run: cargo test --locked
- name: Check publish package
if: matrix.toolchain == 'stable'
run: cargo publish --dry-run --locked
publish:
name: Publish to crates.io
needs: verify
runs-on: ubuntu-latest
steps:
- name: Check out tagged commit
uses: actions/checkout@v4
- name: Install stable Rust
uses: dtolnay/rust-toolchain@stable
- name: Publish package
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
run: cargo publish --locked