Skip to content

Release CrabShell GUI #3

Release CrabShell GUI

Release CrabShell GUI #3

Workflow file for this run

name: Release CrabShell GUI
on:
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
tag:
description: 'Release tag (e.g. v1.0.0)'
required: true
type: string
prerelease:
description: 'Publish as pre-release'
required: false
default: false
type: boolean
permissions:
contents: write
env:
CARGO_TERM_COLOR: always
jobs:
gui-release-build:
name: Build Release (${{ matrix.platform.name }})
runs-on: ${{ matrix.platform.os }}
strategy:
fail-fast: false
matrix:
platform:
- name: macOS
os: macos-latest
tauri_bundles: app
artifact_name: release-macos
artifact_paths: |
crabshell-gui/src-tauri/target/release/bundle/dmg/*.dmg
- name: Linux
os: ubuntu-22.04
tauri_bundles: deb,appimage
artifact_name: release-linux
artifact_paths: |
crabshell-gui/src-tauri/target/release/bundle/deb/*.deb
crabshell-gui/src-tauri/target/release/bundle/appimage/*.AppImage
- name: Windows
os: windows-latest
tauri_bundles: msi,nsis
artifact_name: release-windows
artifact_paths: |
crabshell-gui/src-tauri/target/release/bundle/msi/*.msi
crabshell-gui/src-tauri/target/release/bundle/nsis/*.exe
defaults:
run:
working-directory: crabshell-gui
steps:
- uses: actions/checkout@v4
- name: Install Linux GUI build deps
if: matrix.platform.os == 'ubuntu-22.04'
run: |
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev \
libgtk-3-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
patchelf
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
cache-dependency-path: crabshell-gui/package-lock.json
- name: Install Rust Toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache Rust artifacts
uses: Swatinem/rust-cache@v2
with:
workspaces: crabshell-gui/src-tauri
- name: Install frontend dependencies
run: npm ci
- name: Type check
run: npm run check
- name: Build renderer
run: npm run build:renderer
- name: Build Tauri bundles
run: npx tauri build --bundles ${{ matrix.platform.tauri_bundles }}
- name: Build DMG (macOS only)
if: matrix.platform.os == 'macos-latest'
run: npm run build:dmg
- name: Upload platform artifacts
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.platform.artifact_name }}
path: ${{ matrix.platform.artifact_paths }}
if-no-files-found: error
publish-release:
name: Publish GitHub Release
runs-on: ubuntu-latest
needs: gui-release-build
steps:
- name: Download all release artifacts
uses: actions/download-artifact@v4
with:
path: release-artifacts
merge-multiple: true
- name: Resolve release metadata
id: vars
shell: bash
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
TAG="${{ inputs.tag }}"
if [ "${{ inputs.prerelease }}" = "true" ]; then
PRERELEASE="true"
else
PRERELEASE="false"
fi
else
TAG="${GITHUB_REF_NAME}"
case "$TAG" in
*-alpha*|*-beta*|*-rc*) PRERELEASE="true" ;;
*) PRERELEASE="false" ;;
esac
fi
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
echo "prerelease=$PRERELEASE" >> "$GITHUB_OUTPUT"
- name: Prepare release asset names
shell: bash
run: |
set -euo pipefail
TAG="${{ steps.vars.outputs.tag }}"
mkdir -p release-assets
# download-artifact can contain nested directories; publish files only.
while IFS= read -r -d '' file; do
rel="${file#release-artifacts/}"
safe_rel="${rel//\//-}"
cp "$file" "release-assets/CrabShell-${TAG}-${safe_rel}"
done < <(find release-artifacts -type f -print0 | sort -z)
if ! find release-assets -maxdepth 1 -type f | grep -q .; then
echo "No release files found under release-artifacts/"
exit 1
fi
ls -lah release-assets
- name: Generate SHA256 checksums
shell: bash
run: |
set -euo pipefail
find release-assets -maxdepth 1 -type f -print0 \
| sort -z \
| xargs -0 sha256sum > release-assets/SHA256SUMS.txt
ls -lah release-assets
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ steps.vars.outputs.tag }}
prerelease: ${{ steps.vars.outputs.prerelease }}
generate_release_notes: true
files: |
release-assets/*