name: Release
on:
push:
tags:
- 'v*.*.*'
permissions:
contents: write
id-token: write
jobs:
lints:
name: Lints
env:
RUSTFLAGS: "-D warnings"
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
arch: x86_64
- os: ubuntu-24.04-arm
arch: aarch64
- os: macos-15-intel
arch: x86_64
- os: macos-latest
arch: aarch64
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v5
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable
- uses: Swatinem/rust-cache@v2
with:
key: rust-${{ runner.os }}-${{ matrix.arch }}-stable
- name: Cargo check (lib)
run: cargo check --release --all-features
- name: Cargo check (tests)
run: cargo check --tests --release --all-features
release:
needs: lints
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable
- name: Read CHANGELOG
id: changelog
run: |
body=$(awk 'NR>=3 && /^##/ { if (seen) exit; seen=1 } seen' CHANGELOG.md)
{
echo "body<<EOF"
echo "$body"
echo "EOF"
} >> "$GITHUB_OUTPUT"
- name: Draft Release
uses: softprops/action-gh-release@v1
with:
prerelease: true
generate_release_notes: true
tag_name: ${{ github.ref_name }}
name: Release ${{ github.ref_name }}
body: ${{ steps.changelog.outputs.body }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
publish:
needs: lints
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable
- name: Auth
uses: rust-lang/crates-io-auth-action@v1
id: auth
- name: Dry Run
run: cargo publish --dry-run --locked
- name: Publish to `crates.io`
run: cargo publish --locked
env:
CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}