name: Release
on:
workflow_dispatch:
inputs:
version:
description: "Version to release (e.g. 0.1.0, 0.2.0)"
required: true
type: string
dry_run:
description: "Dry run (skip publish and release creation)"
required: false
type: boolean
default: false
env:
CARGO_TERM_COLOR: always
jobs:
release:
name: Release
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: Verify version matches Cargo.toml
run: |
CARGO_VERSION=$(grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/')
if [ "$CARGO_VERSION" != "${{ inputs.version }}" ]; then
echo "::error::Version mismatch: Cargo.toml has $CARGO_VERSION but release requested ${{ inputs.version }}"
exit 1
fi
- name: Run tests
run: cargo test
- name: Run clippy
run: cargo clippy --all-targets -- -D warnings
- name: Package
run: cargo package
- name: Publish to crates.io
if: ${{ !inputs.dry_run }}
run: cargo publish --token ${{ secrets.CARGO_REGISTRY_TOKEN }}
- name: Create GitHub Release
if: ${{ !inputs.dry_run }}
uses: softprops/action-gh-release@v2
with:
tag_name: v${{ inputs.version }}
name: v${{ inputs.version }}
generate_release_notes: true