name: Publish to crates.io
on:
workflow_run:
workflows: ["Quality"]
types: [completed]
branches: [main]
workflow_dispatch:
permissions:
contents: write
jobs:
detect-version-changes:
name: Detect Version Changes
if: ${{ github.event.workflow_run.conclusion == 'success' || github.event_name == 'workflow_dispatch' }}
runs-on: ubuntu-latest
outputs:
version_changed: ${{ steps.check.outputs.version_changed }}
version: ${{ steps.check.outputs.version }}
steps:
- uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 0
- name: Check version changes
id: check
run: |
CURRENT_VERSION=$(grep '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
echo "version=$CURRENT_VERSION" >> $GITHUB_OUTPUT
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
echo "version_changed=true" >> $GITHUB_OUTPUT
exit 0
fi
LATEST_TAG=$(git describe --tags --abbrev=0 --match "v*" 2>/dev/null || echo "v0.0.0")
TAG_VERSION=${LATEST_TAG#v}
echo "Current version: $CURRENT_VERSION"
echo "Latest tag version: $TAG_VERSION"
if [ "$CURRENT_VERSION" != "$TAG_VERSION" ]; then
echo "version_changed=true" >> $GITHUB_OUTPUT
else
echo "version_changed=false" >> $GITHUB_OUTPUT
fi
publish:
name: Publish to crates.io
needs: detect-version-changes
if: needs.detect-version-changes.outputs.version_changed == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Install nextest
uses: taiki-e/install-action@nextest
- name: Run tests
run: cargo nextest run --all-features --features=_integration_test
env:
TERM: xterm-256color
- name: Publish to crates.io
run: cargo publish --token ${{ secrets.CARGO_REGISTRY_TOKEN }}
- name: Create tag
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git tag v${{ needs.detect-version-changes.outputs.version }}
git push origin v${{ needs.detect-version-changes.outputs.version }}