name: Publish to crates.io
on:
release:
types: [published]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache cargo
uses: Swatinem/rust-cache@v2
- name: Extract version from tag (strip v prefix)
id: tag
run: |
TAG="${{ github.event.release.tag_name }}"
VERSION="${TAG#v}"
echo "tag=$TAG"
echo "version=$VERSION"
echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Check Cargo.toml version matches tag
run: |
CARGO_VERSION=$(cargo metadata --no-deps --format-version=1 \
| jq -r '.packages[0].version')
if [ "$CARGO_VERSION" != "${{ steps.tag.outputs.version }}" ]; then
echo "❌ Version mismatch!"
echo "Cargo.toml: $CARGO_VERSION"
echo "Tag: ${{ steps.tag.outputs.version }}"
exit 1
fi
echo "✅ Version check passed"
- name: Publish to crates.io
run: cargo publish --verbose
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CRATES_IO_TOKEN }}