name: Publish to crates.io
on:
push:
tags: ['v*'] jobs:
publish:
runs-on: ubuntu-latest
environment: release permissions:
id-token: write steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y jq coreutils
- name: Check if version already exists
id: check
run: |
set +e
./scripts/is_version_already_uploaded.sh match_opt
EXIT_CODE="$?"
set -e
if [[ "$EXIT_CODE" == "7" ]]; then
echo "is_new_version=no" >> $GITHUB_OUTPUT
elif [[ "$EXIT_CODE" == "0" ]]; then
echo "is_new_version=yes" >> $GITHUB_OUTPUT
elif [[ "$EXIT_CODE" == "4" ]]; then
# Crate doesn't exist or API error - treat as new version
echo "is_new_version=yes" >> $GITHUB_OUTPUT
else
# Unexpected outcome, indicates a bug.
exit "$EXIT_CODE"
fi
- name: Run tests
if: steps.check.outputs.is_new_version == 'yes'
run: cargo test
- name: Check formatting
if: steps.check.outputs.is_new_version == 'yes'
run: cargo fmt --check
- name: Run clippy
if: steps.check.outputs.is_new_version == 'yes'
run: cargo clippy -- -D warnings
- name: Verify package
if: steps.check.outputs.is_new_version == 'yes'
run: cargo package --list
- name: Get OIDC token for publishing
if: steps.check.outputs.is_new_version == 'yes'
uses: rust-lang/crates-io-auth-action@v1
id: auth
- name: Publish to crates.io
if: steps.check.outputs.is_new_version == 'yes'
run: cargo publish
env:
CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}