name: Release
on:
push:
tags: ["v*"]
workflow_dispatch:
inputs:
version:
required: true
description: "Semver version without v prefix (e.g. 0.10.0)"
jobs:
setup:
name: Resolve release version
runs-on: ubuntu-latest
outputs:
version: ${{ steps.resolve.outputs.value }}
steps:
- name: Resolve version
id: resolve
env:
INPUT_VERSION: ${{ inputs.version }}
REF_NAME: ${{ github.ref_name }}
run: |
if [ -n "$INPUT_VERSION" ]; then
VERSION="$INPUT_VERSION"
else
VERSION="${REF_NAME#v}"
fi
if ! printf '%s' "$VERSION" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$'; then
echo "::error::Resolved version ($VERSION) is not valid semver"
exit 1
fi
echo "value=$VERSION" >> "$GITHUB_OUTPUT"
publish:
name: Publish to crates.io
needs: setup
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: v${{ needs.setup.outputs.version }}
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: Verify Cargo.toml matches tag
run: |
manifest_version=$(grep -m1 '^version' Cargo.toml | sed 's/.*"\(.*\)".*/\1/')
expected="${{ needs.setup.outputs.version }}"
if [ "$manifest_version" != "$expected" ]; then
echo "::error::Cargo.toml version ($manifest_version) does not match release version ($expected)"
exit 1
fi
- name: Publish
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
run: cargo publish --all-features