name: Release
on:
push:
branches: [main]
workflow_dispatch:
permissions:
contents: write
id-token: write
jobs:
check-version:
name: Check version change
runs-on: ubuntu-22.04
outputs:
version: ${{ steps.version.outputs.current }}
changed: ${{ steps.version.outputs.changed }}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 with:
fetch-depth: 2
- name: Get current version
id: version
run: |
CURRENT=$(grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)"/\1/')
PREVIOUS=$(git show HEAD~1:Cargo.toml | grep '^version' | head -1 | sed 's/.*"\(.*\)"/\1/')
echo "current=$CURRENT" >> "$GITHUB_OUTPUT"
if [ "$CURRENT" != "$PREVIOUS" ]; then
echo "changed=true" >> "$GITHUB_OUTPUT"
else
echo "changed=false" >> "$GITHUB_OUTPUT"
fi
create-release:
name: Create GitHub Release
needs: check-version
if: needs.check-version.outputs.changed == 'true' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - run: |
if gh release view "v${{ needs.check-version.outputs.version }}" > /dev/null 2>&1; then
echo "Release v${{ needs.check-version.outputs.version }} already exists, skipping"
else
gh release create "v${{ needs.check-version.outputs.version }}" --generate-notes
fi
env:
GH_TOKEN: ${{ github.token }}
publish-crates:
name: Publish to crates.io
needs: [check-version, create-release]
if: always() && !failure() && !cancelled() && (needs.check-version.outputs.changed == 'true' || github.event_name == 'workflow_dispatch')
runs-on: ubuntu-22.04
environment: release
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - uses: dtolnay/rust-toolchain@a54c7afa936fefeb4456b2dd8068152669aa8203 with:
toolchain: stable
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 - run: cargo test
- run: cargo publish --token "$CARGO_REGISTRY_TOKEN"
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
publish-npm:
name: Publish to npm
needs: [check-version, create-release]
if: always() && !failure() && !cancelled() && (needs.check-version.outputs.changed == 'true' || github.event_name == 'workflow_dispatch')
runs-on: ubuntu-22.04
environment: release
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 - uses: dtolnay/rust-toolchain@a54c7afa936fefeb4456b2dd8068152669aa8203 with:
toolchain: stable
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 with:
node-version: '20'
registry-url: 'https://registry.npmjs.org'
- run: cargo install wasm-pack
- run: wasm-pack build --target web --out-dir pkg -- --features wasm
- run: npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}