chore: release 0.1.1-48 #31
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Release Launcher | |
| on: | |
| push: | |
| tags: | |
| - 'v*' | |
| workflow_dispatch: | |
| inputs: | |
| tag: | |
| description: 'Existing v* tag to (re-)release (re-runs the full build + publish)' | |
| required: true | |
| concurrency: | |
| group: release-launcher-${{ github.event.inputs.tag || github.ref_name }} | |
| cancel-in-progress: false | |
| permissions: | |
| contents: write | |
| jobs: | |
| test-and-lint: | |
| uses: ./.github/workflows/test-and-lint.yml | |
| build-macos: | |
| needs: test-and-lint | |
| runs-on: macos-latest | |
| timeout-minutes: 40 | |
| # Per-arch builds (not a universal binary): the bundled `claude` sidecar is a | |
| # Bun-compiled binary with an embedded Info.plist, and codesign corrupts the | |
| # non-native slice's Info.plist seal when re-signing a *fat* binary — which | |
| # fails notarization. Single-arch binaries re-sign cleanly, so we build each | |
| # arch separately, mirroring the Windows/Linux matrices. | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - arch: arm64 | |
| rust-target: aarch64-apple-darwin | |
| artifact-name: macos-arm64-artifacts | |
| - arch: x64 | |
| rust-target: x86_64-apple-darwin | |
| artifact-name: macos-x64-artifacts | |
| defaults: | |
| run: | |
| working-directory: asyar-launcher | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| ref: ${{ github.event.inputs.tag || github.ref_name }} | |
| - uses: actions/setup-node@v6 | |
| with: | |
| node-version: '22' | |
| - uses: pnpm/action-setup@v5 | |
| with: | |
| version: 10.26.0 | |
| - uses: dtolnay/rust-toolchain@1.97.0 | |
| with: | |
| targets: ${{ matrix.rust-target }} | |
| - uses: swatinem/rust-cache@v2 | |
| with: | |
| workspaces: asyar-launcher/src-tauri -> target | |
| key: ${{ matrix.rust-target }} | |
| - name: Install workspace dependencies | |
| run: pnpm install --frozen-lockfile | |
| working-directory: . | |
| - name: Sync SvelteKit | |
| run: pnpm svelte-kit sync | |
| - uses: oven-sh/setup-bun@v2 | |
| with: | |
| bun-version: latest | |
| - name: Build ext-builder sidecar JS | |
| working-directory: asyar-ext-builder | |
| run: | | |
| bun install | |
| bun run build:js | |
| - name: Import Apple certificate | |
| env: | |
| APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} | |
| APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} | |
| run: | | |
| KEYCHAIN_PATH=$RUNNER_TEMP/build.keychain | |
| KEYCHAIN_PASSWORD=$(openssl rand -base64 32) | |
| security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" | |
| security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH" | |
| security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" | |
| echo "$APPLE_CERTIFICATE" | base64 --decode > $RUNNER_TEMP/certificate.p12 | |
| security import $RUNNER_TEMP/certificate.p12 -k "$KEYCHAIN_PATH" -P "$APPLE_CERTIFICATE_PASSWORD" -T /usr/bin/codesign | |
| security set-key-partition-list -S apple-tool:,apple: -s -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" | |
| security list-keychains -d user -s "$KEYCHAIN_PATH" login.keychain-db | |
| - name: Build and Notarize | |
| env: | |
| APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} | |
| APPLE_ID: ${{ secrets.APPLE_ID }} | |
| APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} | |
| APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} | |
| TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} | |
| TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} | |
| run: pnpm tauri build --target ${{ matrix.rust-target }} | |
| # Tauri names the updater bundle `<product>.app.tar.gz` with no arch suffix, | |
| # so both arch builds would collide in the GitHub release. Add the arch so | |
| # the two updater bundles (and their .sig) stay distinct. | |
| - name: Tag updater bundle with arch | |
| run: | | |
| cd src-tauri/target/${{ matrix.rust-target }}/release/bundle/macos | |
| for f in *.app.tar.gz; do | |
| base="${f%.app.tar.gz}" | |
| mv "$f" "${base}_${{ matrix.arch }}.app.tar.gz" | |
| mv "$f.sig" "${base}_${{ matrix.arch }}.app.tar.gz.sig" | |
| done | |
| - name: Upload macOS ${{ matrix.arch }} Artifacts | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: ${{ matrix.artifact-name }} | |
| path: | | |
| asyar-launcher/src-tauri/target/${{ matrix.rust-target }}/release/bundle/dmg/*.dmg | |
| asyar-launcher/src-tauri/target/${{ matrix.rust-target }}/release/bundle/macos/*.app.tar.gz* | |
| build-windows: | |
| needs: test-and-lint | |
| runs-on: ${{ matrix.runner }} | |
| timeout-minutes: 60 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - arch: x64 | |
| runner: windows-latest | |
| rust-target: x86_64-pc-windows-msvc | |
| artifact-name: windows-artifacts | |
| - arch: arm64 | |
| runner: windows-11-arm | |
| rust-target: aarch64-pc-windows-msvc | |
| artifact-name: windows-arm64-artifacts | |
| defaults: | |
| run: | |
| working-directory: asyar-launcher | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| ref: ${{ github.event.inputs.tag || github.ref_name }} | |
| - uses: actions/setup-node@v6 | |
| with: | |
| node-version: '22' | |
| - uses: pnpm/action-setup@v5 | |
| with: | |
| version: 10.26.0 | |
| - uses: dtolnay/rust-toolchain@1.97.0 | |
| with: | |
| targets: ${{ matrix.rust-target }} | |
| - uses: swatinem/rust-cache@v2 | |
| with: | |
| workspaces: asyar-launcher/src-tauri -> target | |
| key: ${{ matrix.rust-target }} | |
| - name: Install workspace dependencies | |
| run: pnpm install --frozen-lockfile | |
| working-directory: . | |
| - name: Sync SvelteKit | |
| run: pnpm svelte-kit sync | |
| - uses: oven-sh/setup-bun@v2 | |
| with: | |
| bun-version: latest | |
| - name: Build ext-builder sidecar JS | |
| working-directory: asyar-ext-builder | |
| run: | | |
| bun install | |
| bun run build:js | |
| - name: Build Windows ${{ matrix.arch }} | |
| env: | |
| TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} | |
| TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} | |
| run: pnpm tauri build --target ${{ matrix.rust-target }} | |
| - name: Package Portable Windows ${{ matrix.arch }} Zip | |
| shell: pwsh | |
| run: | | |
| $target = "${{ matrix.rust-target }}" | |
| $arch = "${{ matrix.arch }}" | |
| $releaseDir = "src-tauri/target/$target/release" | |
| $portableDir = "$releaseDir/portable/asyar" | |
| if (Test-Path "$releaseDir/portable") { | |
| Remove-Item -Recurse -Force "$releaseDir/portable" | |
| } | |
| New-Item -ItemType Directory -Force -Path $portableDir | Out-Null | |
| Copy-Item "$releaseDir/asyar.exe" -Destination "$portableDir/" | |
| if (Test-Path "src-tauri/built-in-features") { | |
| Copy-Item -Recurse "src-tauri/built-in-features" -Destination "$portableDir/" | |
| } | |
| if (Test-Path "src-tauri/resources") { | |
| Copy-Item -Recurse "src-tauri/resources" -Destination "$portableDir/" | |
| } | |
| $zipPath = "$releaseDir/asyar_windows_${arch}_portable.zip" | |
| Compress-Archive -Path "$portableDir/*" -DestinationPath $zipPath -Force | |
| Write-Host "Created portable archive at $zipPath" | |
| - name: Upload Windows ${{ matrix.arch }} Artifacts | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: ${{ matrix.artifact-name }} | |
| path: | | |
| asyar-launcher/src-tauri/target/${{ matrix.rust-target }}/release/bundle/msi/*.msi | |
| asyar-launcher/src-tauri/target/${{ matrix.rust-target }}/release/bundle/msi/*.msi.sig | |
| asyar-launcher/src-tauri/target/${{ matrix.rust-target }}/release/*.zip | |
| build-linux: | |
| needs: test-and-lint | |
| runs-on: ${{ matrix.runner }} | |
| timeout-minutes: 60 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - arch: amd64 | |
| runner: ubuntu-latest | |
| rust-target: x86_64-unknown-linux-gnu | |
| summon-source: asyar-summon-x86_64-unknown-linux-gnu | |
| summon-asset: asyar-summon_amd64 | |
| artifact-name: linux-amd64-artifacts | |
| - arch: arm64 | |
| runner: ubuntu-24.04-arm | |
| rust-target: aarch64-unknown-linux-gnu | |
| summon-source: asyar-summon-aarch64-unknown-linux-gnu | |
| summon-asset: asyar-summon_aarch64 | |
| artifact-name: linux-arm64-artifacts | |
| defaults: | |
| run: | |
| working-directory: asyar-launcher | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| ref: ${{ github.event.inputs.tag || github.ref_name }} | |
| - name: Install Linux system dependencies | |
| working-directory: . | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libxdo-dev libfuse2t64 xdg-utils zsync | |
| - uses: actions/setup-node@v6 | |
| with: | |
| node-version: '22' | |
| - uses: pnpm/action-setup@v5 | |
| with: | |
| version: 10.26.0 | |
| - uses: dtolnay/rust-toolchain@1.97.0 | |
| with: | |
| targets: ${{ matrix.rust-target }} | |
| - uses: swatinem/rust-cache@v2 | |
| with: | |
| workspaces: asyar-launcher/src-tauri -> target | |
| key: linux-${{ matrix.arch }} | |
| - name: Install workspace dependencies | |
| run: pnpm install --frozen-lockfile | |
| working-directory: . | |
| - name: Sync SvelteKit | |
| run: pnpm svelte-kit sync | |
| - uses: oven-sh/setup-bun@v2 | |
| with: | |
| bun-version: latest | |
| - name: Build ext-builder sidecar JS | |
| working-directory: asyar-ext-builder | |
| run: | | |
| bun install | |
| bun run build:js | |
| # linuxdeploy walks every ELF in AppDir/usr/bin/ and aborts when ldd | |
| # exits non-zero. The bundled `bun` sidecar trips this — bun is | |
| # dynamically linked but its runtime mis-behaves under | |
| # LD_TRACE_LOADED_OBJECTS=1, so ldd exits 1 instead of printing deps. | |
| # The shim swallows ldd failures so bundling can finish; bun's only | |
| # deps are glibc libs linuxdeploy blacklists anyway. | |
| - name: Install ldd shim (linuxdeploy + bun workaround) | |
| run: | | |
| sudo install -m 0755 scripts/ci/ldd-shim.sh /usr/local/bin/ldd | |
| which ldd | |
| head -3 "$(which ldd)" | |
| # Tauri's mirrored linuxdeploy predates support for the | |
| # LINUXDEPLOY_EXCLUDED_LIBRARIES environment variable. A current | |
| # upstream binary must be present in Tauri's tool cache before the | |
| # bundle starts so the signed AppImage never contains the build | |
| # runner's libwayland-client. | |
| - name: Install linuxdeploy with library exclusion support | |
| run: | | |
| set -euo pipefail | |
| case "$(uname -m)" in | |
| x86_64) linuxdeploy_arch="x86_64" ;; | |
| aarch64|arm64) linuxdeploy_arch="aarch64" ;; | |
| *) echo "Unsupported linuxdeploy architecture: $(uname -m)" >&2; exit 1 ;; | |
| esac | |
| tauri_tools_dir="${XDG_CACHE_HOME:-${HOME}/.cache}/tauri" | |
| linuxdeploy_cache_path="${tauri_tools_dir}/linuxdeploy-${linuxdeploy_arch}.AppImage" | |
| mkdir -p "$tauri_tools_dir" | |
| curl -L --fail --show-error --retry 3 \ | |
| -o "$linuxdeploy_cache_path" \ | |
| "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-${linuxdeploy_arch}.AppImage" | |
| chmod 0755 "$linuxdeploy_cache_path" | |
| "$linuxdeploy_cache_path" --appimage-extract-and-run --version | |
| - name: Build Linux ${{ matrix.arch }} | |
| env: | |
| TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} | |
| TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} | |
| # Tauri's bundler invokes linuxdeploy/appimagetool — themselves AppImages. | |
| # Ubuntu 24.04 blocks their default FUSE/userns mount path, so tell them | |
| # to self-extract to a temp dir instead. Official CI-mode flag, not a hack. | |
| APPIMAGE_EXTRACT_AND_RUN: '1' | |
| # libwayland-client is part of the host graphics ABI. Bundling the | |
| # Ubuntu runner's copy alongside a newer host Mesa makes WebKitGTK's | |
| # eglGetDisplay(EGL_DEFAULT_DISPLAY) fail with EGL_BAD_PARAMETER. | |
| LINUXDEPLOY_EXCLUDED_LIBRARIES: 'libwayland-client.so*' | |
| # Embed AppImage update metadata for AppImageUpdate / zsync delta updates (issue #668) | |
| UPDATE_INFORMATION: 'gh-releases-zsync|Xoshbin|asyar|latest|*${{ matrix.arch }}*.AppImage.zsync' | |
| LDAI_UPDATE_INFORMATION: 'gh-releases-zsync|Xoshbin|asyar|latest|*${{ matrix.arch }}*.AppImage.zsync' | |
| run: | | |
| pnpm tauri build -v --target ${{ matrix.rust-target }} | |
| SUMMON_SOURCE="src-tauri/binaries/${{ matrix.summon-source }}" | |
| SUMMON_ASSET="src-tauri/target/${{ matrix.rust-target }}/release/${{ matrix.summon-asset }}" | |
| test -x "$SUMMON_SOURCE" | |
| install -m 0755 "$SUMMON_SOURCE" "$SUMMON_ASSET" | |
| cd src-tauri/target/${{ matrix.rust-target }}/release/bundle/appimage | |
| for f in *.AppImage; do | |
| if [ -f "$f" ] && [ ! -f "$f.zsync" ]; then | |
| zsyncmake -u "$f" "$f" | |
| fi | |
| done | |
| - name: Verify AppImage graphics ABI | |
| run: | | |
| set -euo pipefail | |
| appimage_dir="src-tauri/target/${{ matrix.rust-target }}/release/bundle/appimage" | |
| appimage_path="$(find "$appimage_dir" -maxdepth 1 -type f -name '*.AppImage' -print -quit)" | |
| if [ -z "$appimage_path" ]; then | |
| echo "No AppImage found in ${appimage_dir}" >&2 | |
| exit 1 | |
| fi | |
| appimage_path="$(readlink -f "$appimage_path")" | |
| verification_dir="$(mktemp -d)" | |
| cleanup() { | |
| rm -rf "$verification_dir" | |
| } | |
| trap cleanup EXIT INT TERM | |
| ( | |
| cd "$verification_dir" | |
| "$appimage_path" --appimage-extract 'usr/lib/libwayland-client.so*' >/dev/null | |
| if find squashfs-root \( -type f -o -type l \) -name 'libwayland-client.so*' -print -quit | grep -q .; then | |
| echo "AppImage incorrectly bundles libwayland-client:" >&2 | |
| find squashfs-root \( -type f -o -type l \) -name 'libwayland-client.so*' -print >&2 | |
| exit 1 | |
| fi | |
| ) | |
| - name: Upload Linux ${{ matrix.arch }} Artifacts | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: ${{ matrix.artifact-name }} | |
| if-no-files-found: error | |
| path: | | |
| asyar-launcher/src-tauri/target/${{ matrix.rust-target }}/release/bundle/appimage/*.AppImage | |
| asyar-launcher/src-tauri/target/${{ matrix.rust-target }}/release/bundle/appimage/*.AppImage.sig | |
| asyar-launcher/src-tauri/target/${{ matrix.rust-target }}/release/bundle/appimage/*.zsync | |
| asyar-launcher/src-tauri/target/${{ matrix.rust-target }}/release/bundle/deb/*.deb | |
| asyar-launcher/src-tauri/target/${{ matrix.rust-target }}/release/${{ matrix.summon-asset }} | |
| publish: | |
| needs: [build-macos, build-windows, build-linux] | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| ref: ${{ github.event.inputs.tag || github.ref_name }} | |
| fetch-depth: 0 | |
| - name: Download all artifacts | |
| uses: actions/download-artifact@v8 | |
| with: | |
| path: artifacts | |
| - name: Clean up stale draft releases | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| TAG: ${{ github.ref_name }} | |
| run: | | |
| gh release list --json tagName,isDraft --jq ".[] | select(.tagName==\"$TAG\" and .isDraft) | .tagName" | while read -r t; do | |
| echo "Deleting stale draft release for $t..." | |
| gh release delete "$t" --yes --cleanup-tag=false | |
| done | |
| - name: Determine previous launcher release tag | |
| id: prev_tag | |
| run: | | |
| CURRENT_TAG="${{ github.event.inputs.tag || github.ref_name }}" | |
| PREV_TAG=$(git tag -l 'v*' --sort=-creatordate | grep -Fvx "$CURRENT_TAG" | head -n 1) | |
| echo "tag=$PREV_TAG" >> "$GITHUB_OUTPUT" | |
| - name: Create GitHub Release | |
| uses: softprops/action-gh-release@v2.6.1 | |
| with: | |
| tag_name: ${{ github.event.inputs.tag || github.ref_name }} | |
| files: | | |
| artifacts/**/*.dmg | |
| artifacts/**/*.app.tar.gz* | |
| artifacts/**/*.msi | |
| artifacts/**/*.msi.sig | |
| artifacts/**/*.AppImage | |
| artifacts/**/*.AppImage.sig | |
| artifacts/**/*.zsync | |
| artifacts/**/*.deb | |
| artifacts/**/*.zip | |
| artifacts/**/asyar-summon_* | |
| draft: false | |
| prerelease: ${{ contains(github.event.inputs.tag || github.ref_name, '-') }} | |
| generate_release_notes: true | |
| # See release-sdk.yml: without an explicit base, GitHub's auto-notes | |
| # picks the most recently published release repo-wide, which can be | |
| # an `sdk-v*` tag rather than the last launcher release — pin it. | |
| previous_tag: ${{ steps.prev_tag.outputs.tag }} | |
| - name: Notify Website | |
| env: | |
| ASYAR_UPDATE_TOKEN: ${{ secrets.ASYAR_UPDATE_TOKEN }} | |
| APP_URL: 'https://asyar.org' | |
| REF_NAME: ${{ github.event.inputs.tag || github.ref_name }} | |
| REPO: ${{ github.repository }} | |
| run: | | |
| VERSION="${REF_NAME#v}" | |
| # Detect type: any hyphenated version (e.g., 0.1.0-1) is treated as beta | |
| TYPE="stable" | |
| if [[ "$VERSION" == *-* ]]; then | |
| TYPE="beta" | |
| fi | |
| # Locate files using find to handle any directory structure. | |
| # Scope multi-arch artifacts (Windows, Linux) to their per-arch | |
| # artifact dirs so different-arch builds don't get cross-picked. | |
| MAC_AARCH64_FILE_PATH=$(find artifacts/macos-arm64-artifacts -name "*.app.tar.gz" | head -n 1) | |
| MAC_X64_FILE_PATH=$(find artifacts/macos-x64-artifacts -name "*.app.tar.gz" | head -n 1) | |
| # The .app.tar.gz above is the updater bundle (fed to the Tauri | |
| # updater via `url`). Users clicking "Download" want the installable | |
| # .dmg instead, exposed separately as `download_url`. | |
| MAC_AARCH64_DMG_PATH=$(find artifacts/macos-arm64-artifacts -name "*.dmg" | head -n 1) | |
| MAC_X64_DMG_PATH=$(find artifacts/macos-x64-artifacts -name "*.dmg" | head -n 1) | |
| WIN_X64_FILE_PATH=$(find artifacts/windows-artifacts -name "*.msi" | head -n 1) | |
| WIN_ARM64_FILE_PATH=$(find artifacts/windows-arm64-artifacts -name "*.msi" | head -n 1) | |
| LINUX_FILE_PATH=$(find artifacts/linux-amd64-artifacts -name "*.AppImage" | head -n 1) | |
| LINUX_ARM64_FILE_PATH=$(find artifacts/linux-arm64-artifacts -name "*.AppImage" | head -n 1) | |
| MAC_AARCH64_SIG_PATH=$(find artifacts/macos-arm64-artifacts -name "*.app.tar.gz.sig" | head -n 1) | |
| MAC_X64_SIG_PATH=$(find artifacts/macos-x64-artifacts -name "*.app.tar.gz.sig" | head -n 1) | |
| WIN_X64_SIG_PATH=$(find artifacts/windows-artifacts -name "*.msi.sig" | head -n 1) | |
| WIN_ARM64_SIG_PATH=$(find artifacts/windows-arm64-artifacts -name "*.msi.sig" | head -n 1) | |
| LINUX_SIG_PATH=$(find artifacts/linux-amd64-artifacts -name "*.AppImage.sig" | head -n 1) | |
| LINUX_ARM64_SIG_PATH=$(find artifacts/linux-arm64-artifacts -name "*.AppImage.sig" | head -n 1) | |
| if [[ -z "$MAC_AARCH64_FILE_PATH" || -z "$MAC_X64_FILE_PATH" || -z "$MAC_AARCH64_DMG_PATH" || -z "$MAC_X64_DMG_PATH" || -z "$WIN_X64_FILE_PATH" || -z "$WIN_ARM64_FILE_PATH" || -z "$LINUX_FILE_PATH" || -z "$LINUX_ARM64_FILE_PATH" ]]; then | |
| echo "Error: Binaries missing in artifacts. Note: macOS requires per-arch .app.tar.gz + .dmg (arm64 + x64)" | |
| ls -R artifacts | |
| exit 1 | |
| fi | |
| if [[ -z "$MAC_AARCH64_SIG_PATH" || -z "$MAC_X64_SIG_PATH" || -z "$WIN_X64_SIG_PATH" || -z "$WIN_ARM64_SIG_PATH" || -z "$LINUX_SIG_PATH" || -z "$LINUX_ARM64_SIG_PATH" ]]; then | |
| echo "Error: Signatures (.sig files) missing in artifacts. Check tauri.conf.json bundle configuration." | |
| ls -R artifacts | |
| exit 1 | |
| fi | |
| MAC_AARCH64_SIG=$(cat "$MAC_AARCH64_SIG_PATH") | |
| MAC_X64_SIG=$(cat "$MAC_X64_SIG_PATH") | |
| WIN_X64_SIG=$(cat "$WIN_X64_SIG_PATH") | |
| WIN_ARM64_SIG=$(cat "$WIN_ARM64_SIG_PATH") | |
| LINUX_SIG=$(cat "$LINUX_SIG_PATH") | |
| LINUX_ARM64_SIG=$(cat "$LINUX_ARM64_SIG_PATH") | |
| MAC_AARCH64_FILE=$(basename "$MAC_AARCH64_FILE_PATH") | |
| MAC_X64_FILE=$(basename "$MAC_X64_FILE_PATH") | |
| MAC_AARCH64_DMG=$(basename "$MAC_AARCH64_DMG_PATH") | |
| MAC_X64_DMG=$(basename "$MAC_X64_DMG_PATH") | |
| WIN_X64_FILE=$(basename "$WIN_X64_FILE_PATH") | |
| WIN_ARM64_FILE=$(basename "$WIN_ARM64_FILE_PATH") | |
| LINUX_FILE=$(basename "$LINUX_FILE_PATH") | |
| LINUX_ARM64_FILE=$(basename "$LINUX_ARM64_FILE_PATH") | |
| TAG="$REF_NAME" | |
| BASE_URL="https://github.com/$REPO/releases/download/$TAG" | |
| PAYLOAD=$(printf '{"version":"%s","type":"%s","notes":"Automated multi-platform release %s","platforms":{"darwin-aarch64":{"url":"%s/%s","download_url":"%s/%s","signature":"%s"},"darwin-x86_64":{"url":"%s/%s","download_url":"%s/%s","signature":"%s"},"windows-x86_64":{"url":"%s/%s","signature":"%s"},"windows-aarch64":{"url":"%s/%s","signature":"%s"},"linux-x86_64":{"url":"%s/%s","signature":"%s"},"linux-aarch64":{"url":"%s/%s","signature":"%s"}}}' \ | |
| "$VERSION" "$TYPE" "$VERSION" \ | |
| "$BASE_URL" "$MAC_AARCH64_FILE" "$BASE_URL" "$MAC_AARCH64_DMG" "$MAC_AARCH64_SIG" \ | |
| "$BASE_URL" "$MAC_X64_FILE" "$BASE_URL" "$MAC_X64_DMG" "$MAC_X64_SIG" \ | |
| "$BASE_URL" "$WIN_X64_FILE" "$WIN_X64_SIG" \ | |
| "$BASE_URL" "$WIN_ARM64_FILE" "$WIN_ARM64_SIG" \ | |
| "$BASE_URL" "$LINUX_FILE" "$LINUX_SIG" \ | |
| "$BASE_URL" "$LINUX_ARM64_FILE" "$LINUX_ARM64_SIG") | |
| # --fail-with-body: non-2xx → non-zero exit (no more silent failures). | |
| # Retries cover transient asyar.org/network blips; the endpoint upserts | |
| # by version (Release::updateOrCreate), so retries are safe. | |
| curl --fail-with-body --retry 3 --retry-all-errors --retry-delay 5 \ | |
| -X POST "$APP_URL/api/releases" \ | |
| -H "Content-Type: application/json" \ | |
| -H "X-Asyar-Update-Token: $ASYAR_UPDATE_TOKEN" \ | |
| -d "$PAYLOAD" | |
| - name: Update Homebrew Cask | |
| env: | |
| HOMEBREW_TAP_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }} | |
| REF_NAME: ${{ github.event.inputs.tag || github.ref_name }} | |
| run: | | |
| # Requires the one-time tap setup in RELEASING.md. Skip quietly until | |
| # HOMEBREW_TAP_TOKEN exists so this step can't block a release. | |
| if [[ -z "$HOMEBREW_TAP_TOKEN" ]]; then | |
| echo "HOMEBREW_TAP_TOKEN not set — skipping Homebrew cask update." | |
| exit 0 | |
| fi | |
| VERSION="${REF_NAME#v}" | |
| MAC_AARCH64_DMG_PATH=$(find artifacts/macos-arm64-artifacts -name "*.dmg" | head -n 1) | |
| MAC_X64_DMG_PATH=$(find artifacts/macos-x64-artifacts -name "*.dmg" | head -n 1) | |
| SHA_ARM64=$(sha256sum "$MAC_AARCH64_DMG_PATH" | cut -d' ' -f1) | |
| SHA_X64=$(sha256sum "$MAC_X64_DMG_PATH" | cut -d' ' -f1) | |
| git clone --depth 1 "https://x-access-token:${HOMEBREW_TAP_TOKEN}@github.com/Xoshbin/homebrew-asyar.git" tap | |
| mkdir -p tap/Casks | |
| cat > tap/Casks/asyar.rb <<EOF | |
| cask "asyar" do | |
| arch arm: "aarch64", intel: "x64" | |
| version "${VERSION}" | |
| sha256 arm: "${SHA_ARM64}", | |
| intel: "${SHA_X64}" | |
| url "https://github.com/Xoshbin/asyar/releases/download/v#{version}/asyar_#{version}_#{arch}.dmg" | |
| name "Asyar" | |
| desc "Extensible launcher and productivity toolbox" | |
| homepage "https://asyar.org/" | |
| auto_updates true | |
| depends_on macos: :ventura | |
| app "asyar.app" | |
| zap trash: [ | |
| "~/Library/Application Support/org.asyar.app", | |
| "~/Library/Caches/org.asyar.app", | |
| "~/Library/HTTPStorages/org.asyar.app", | |
| "~/Library/Preferences/org.asyar.app.plist", | |
| "~/Library/Saved Application State/org.asyar.app.savedState", | |
| "~/Library/WebKit/org.asyar.app", | |
| ] | |
| end | |
| EOF | |
| cd tap | |
| git config user.name "asyar-release-bot" | |
| git config user.email "actions@github.com" | |
| git add Casks/asyar.rb | |
| if git diff --cached --quiet; then | |
| echo "Cask already up to date for ${VERSION}." | |
| exit 0 | |
| fi | |
| git commit -m "asyar ${VERSION}" | |
| git push origin HEAD:main | |
| - name: Check winget eligibility | |
| id: winget_check | |
| env: | |
| WINGET_TOKEN: ${{ secrets.WINGET_TOKEN }} | |
| REF_NAME: ${{ github.event.inputs.tag || github.ref_name }} | |
| run: | | |
| # Requires the one-time winget-pkgs setup in RELEASING.md. Skip quietly | |
| # until WINGET_TOKEN exists so this step can't block a release. | |
| if [[ -z "$WINGET_TOKEN" ]]; then | |
| echo "WINGET_TOKEN not set — skipping winget manifest update." | |
| exit 0 | |
| fi | |
| VERSION="${REF_NAME#v}" | |
| # winget-pkgs policy: a package's default manifest must track a stable | |
| # release, not a prerelease-only channel. Every Asyar release today is a | |
| # numeric pre-release (hyphenated), so skip until the first stable tag. | |
| if [[ "$VERSION" == *-* ]]; then | |
| echo "$VERSION is a pre-release — winget-pkgs doesn't accept pre-release-only manifests. Skipping." | |
| exit 0 | |
| fi | |
| echo "eligible=true" >> "$GITHUB_OUTPUT" | |
| # Runs as its own step (not a run: block like the Homebrew one above) | |
| # because submitting to winget-pkgs needs Komac's MSI/manifest handling, | |
| # not something worth reimplementing in bash. Deliberately kept in this | |
| # same job rather than a separate `on: release` workflow: action-gh-release | |
| # above publishes using the default GITHUB_TOKEN, and GitHub does not | |
| # cascade a second workflow run off events created by that token. | |
| - name: Update winget manifest | |
| if: steps.winget_check.outputs.eligible == 'true' | |
| uses: vedantmgoyal9/winget-releaser@v2 | |
| with: | |
| identifier: Xoshbin.Asyar | |
| token: ${{ secrets.WINGET_TOKEN }} | |
| release-tag: ${{ github.event.inputs.tag || github.ref_name }} |