name: Release
on:
push:
tags:
- "v[0-9]+.[0-9]+.[0-9]+*"
permissions:
contents: write
jobs:
publish:
name: Publish to crates.io
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Inject version from tag
run: |
tag_version="${GITHUB_REF_NAME#v}"
echo "Releasing version: $tag_version"
# Replace the 0.0.0 placeholder under [workspace.package] with the tag version.
sed -i 's/^version = "0\.0\.0"$/version = "'"$tag_version"'"/' Cargo.toml
# Pin spacewasm_c_api's dependency on spacewasm to the exact tag version.
# Its manifest carries a `version = "=0.0.0"` placeholder for this.
sed -i 's/version = "=0\.0\.0"/version = "='"$tag_version"'"/' crates/spacewasm_c_api/Cargo.toml
# Fail if any placeholder was not found / not replaced.
for pkg in spacewasm spacewasm_c_api; do
crate_version=$(cargo metadata --no-deps --format-version 1 \
| jq -r '.packages[] | select(.name == "'"$pkg"'") | .version')
if [ "$crate_version" != "$tag_version" ]; then
echo "::error::Failed to inject version for $pkg. Expected $tag_version but Cargo.toml resolves to $crate_version. Is the 0.0.0 placeholder still present?"
exit 1
fi
done
dep_version=$(cargo metadata --no-deps --format-version 1 \
| jq -r '.packages[] | select(.name == "spacewasm_c_api") | .dependencies[] | select(.name == "spacewasm") | .req')
if [ "$dep_version" != "=$tag_version" ]; then
echo "::error::spacewasm_c_api's spacewasm dependency resolves to '$dep_version', expected '=$tag_version'. Is the =0.0.0 placeholder still present?"
exit 1
fi
- name: Install WABT (WebAssembly Binary Toolkit)
run: |
WABT_VERSION=1.0.41
WABT_PLATFORM="linux-x64"
wget https://github.com/WebAssembly/wabt/releases/download/${WABT_VERSION}/wabt-${WABT_VERSION}-${WABT_PLATFORM}.tar.gz
tar -xzf wabt-${WABT_VERSION}-${WABT_PLATFORM}.tar.gz
sudo cp wabt-${WABT_VERSION}/bin/* /usr/local/bin/
- name: Run tests
run: cargo test --workspace --verbose
- name: Publish spacewasm to crates.io
run: cargo publish -p spacewasm --allow-dirty
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
- name: Publish spacewasm_c_api to crates.io
run: cargo publish -p spacewasm_c_api --allow-dirty --no-verify
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
generate_release_notes: true