name: Release
on:
push:
branches: [main]
paths:
- "wasm/**"
- "src/**"
- "Cargo.toml"
pull_request:
branches: [main]
paths:
- "wasm/**"
- "src/**"
- "Cargo.toml"
permissions:
contents: read
env:
CARGO_TERM_COLOR: always
RUSTFLAGS: -Dwarnings
WASM_PACK_VERSION: "0.13.1"
jobs:
check:
name: WASM Compile Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - uses: dtolnay/rust-toolchain@efa25f7f19611383d5b0ccf2d1c8914531636bf9 with:
toolchain: stable
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 - run: cargo check -p audex-wasm --target wasm32-unknown-unknown
check-core:
name: Core WASM Compile Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - uses: dtolnay/rust-toolchain@efa25f7f19611383d5b0ccf2d1c8914531636bf9 with:
toolchain: stable
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 - run: cargo check -p audex --target wasm32-unknown-unknown --features serde
clippy:
name: WASM Clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - uses: dtolnay/rust-toolchain@efa25f7f19611383d5b0ccf2d1c8914531636bf9 with:
toolchain: stable
components: clippy
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 - run: cargo clippy -p audex-wasm --target wasm32-unknown-unknown -- -D warnings
test-native:
name: WASM Crate Unit Tests (native)
runs-on: ubuntu-latest
needs: [check]
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - uses: dtolnay/rust-toolchain@efa25f7f19611383d5b0ccf2d1c8914531636bf9 with:
toolchain: stable
- uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 - run: cargo test -p audex-wasm
test-wasm:
name: WASM Browser Tests
runs-on: ubuntu-latest
needs: [check]
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - uses: dtolnay/rust-toolchain@efa25f7f19611383d5b0ccf2d1c8914531636bf9 with:
toolchain: stable
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 - name: Install wasm-pack
run: cargo install wasm-pack --version "$WASM_PACK_VERSION" --locked
- name: Run wasm-bindgen-test in headless Chrome
working-directory: wasm
run: wasm-pack test --headless --chrome
build:
name: WASM Build
runs-on: ubuntu-latest
if: github.event_name == 'push'
needs: [check, check-core, clippy, test-native, test-wasm]
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - uses: dtolnay/rust-toolchain@efa25f7f19611383d5b0ccf2d1c8914531636bf9 with:
toolchain: stable
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32
- name: Install wasm-pack
run: cargo install wasm-pack --version "$WASM_PACK_VERSION" --locked
- name: Build (web target)
working-directory: wasm
run: wasm-pack build --target web --release
- name: Build (nodejs target)
working-directory: wasm
run: wasm-pack build --target nodejs --release --out-dir pkg-node
- name: Package web build
run: tar -czf audex-wasm-web.tar.gz -C wasm/pkg .
- name: Package node build
run: tar -czf audex-wasm-node.tar.gz -C wasm/pkg-node .
- name: Upload web artifact
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with:
name: audex-wasm-web
path: audex-wasm-web.tar.gz
retention-days: 30
- name: Upload node artifact
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with:
name: audex-wasm-node
path: audex-wasm-node.tar.gz
retention-days: 30
check-version:
name: Check for new version
runs-on: ubuntu-latest
if: github.event_name == 'push'
outputs:
version: ${{ steps.version.outputs.version }}
new_release: ${{ steps.tag.outputs.new_release }}
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 with:
fetch-depth: 0
- name: Extract version from Cargo.toml
id: version
run: |
VERSION=$(grep -m1 '^version' Cargo.toml | sed 's/version = "\(.*\)"/\1/')
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
- name: Check if tag already exists
id: tag
run: |
if git rev-parse "v${{ steps.version.outputs.version }}" >/dev/null 2>&1; then
echo "new_release=false" >> "$GITHUB_OUTPUT"
else
echo "new_release=true" >> "$GITHUB_OUTPUT"
fi
release:
name: GitHub Release
runs-on: ubuntu-latest
needs: [check-version, build]
if: needs.check-version.outputs.new_release == 'true'
permissions:
contents: write
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
- name: Extract changelog
id: changelog
env:
VERSION: ${{ needs.check-version.outputs.version }}
run: |
TITLE=$(awk "/^# ${VERSION//./\\.} /{print; exit}" CHANGELOG.md)
TITLE="${TITLE#\# }"
BODY=$(awk "/^# ${VERSION//./\\.} /{found=1; next} /^# /{if(found) exit} found{print}" CHANGELOG.md)
echo "title=${TITLE}" >> "$GITHUB_OUTPUT"
{
echo "body<<CHANGELOG_EOF"
echo "$BODY"
echo "CHANGELOG_EOF"
} >> "$GITHUB_OUTPUT"
- name: Create tag
env:
VERSION: ${{ needs.check-version.outputs.version }}
run: |
git tag "v${VERSION}"
git push origin "v${VERSION}"
- name: Download web artifact
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 with:
name: audex-wasm-web
- name: Download node artifact
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 with:
name: audex-wasm-node
- name: Create GitHub Release
uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe with:
tag_name: v${{ needs.check-version.outputs.version }}
name: ${{ steps.changelog.outputs.title }}
body: ${{ steps.changelog.outputs.body }}
files: |
audex-wasm-web.tar.gz
audex-wasm-node.tar.gz