mirror of
https://github.com/NanmiCoder/cc-haha
synced 2026-07-17 13:13:35 +08:00
Windows GitHub runners keep the checkout and Bun install cache on different drives, which can trip Bun's baseline compile-target extraction before Tauri packaging starts. Point desktop sidecar builds at the runner temp cache so dev and release workflows can still use the Windows x64 baseline runtime needed for older CPUs. Constraint: Bun upstream still has an open Windows cross-drive extraction issue for compile target downloads. Rejected: Revert to bun-windows-x64 | would reintroduce the older-CPU Illegal Instruction failure class. Confidence: high Scope-risk: narrow Directive: Keep desktop dev and release sidecar build cache handling aligned until Bun's Windows extraction fix is released and verified in Actions. Tested: bun test scripts/pr/release-workflow.test.ts; cd desktop && bun run test -- --run scripts/build-sidecars.test.ts; bun run check:policy; cd desktop && BUN_INSTALL_CACHE_DIR=/tmp/cc-haha-bun-install-cache TAURI_ENV_TARGET_TRIPLE=x86_64-pc-windows-msvc bun run build:sidecars Not-tested: GitHub Actions Windows runner rerun after push.
183 lines
6.2 KiB
YAML
183 lines
6.2 KiB
YAML
name: Release Desktop
|
|
|
|
on:
|
|
push:
|
|
tags: ['v*.*.*']
|
|
workflow_dispatch:
|
|
inputs:
|
|
draft:
|
|
description: 'Create as draft release'
|
|
required: false
|
|
default: true
|
|
type: boolean
|
|
|
|
permissions:
|
|
contents: write
|
|
|
|
concurrency:
|
|
group: release-desktop-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
build:
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
# macOS Apple Silicon
|
|
- platform: macos-latest
|
|
rust_target: aarch64-apple-darwin
|
|
tauri_args: '--target aarch64-apple-darwin'
|
|
label: macOS-ARM64
|
|
asset_name_pattern: 'Claude-Code-Haha_[version]_macos_arm64_[bundle][ext]'
|
|
|
|
# macOS Intel
|
|
- platform: macos-latest
|
|
rust_target: x86_64-apple-darwin
|
|
tauri_args: '--target x86_64-apple-darwin'
|
|
label: macOS-x64
|
|
asset_name_pattern: 'Claude-Code-Haha_[version]_macos_x64_[bundle][ext]'
|
|
|
|
# Linux x64
|
|
- platform: ubuntu-22.04
|
|
rust_target: x86_64-unknown-linux-gnu
|
|
tauri_args: '--bundles deb'
|
|
label: Linux-x64
|
|
asset_name_pattern: 'Claude-Code-Haha_[version]_linux_x64_[bundle][ext]'
|
|
|
|
# Linux ARM64
|
|
- platform: ubuntu-22.04-arm
|
|
rust_target: aarch64-unknown-linux-gnu
|
|
tauri_args: '--bundles deb'
|
|
label: Linux-ARM64
|
|
asset_name_pattern: 'Claude-Code-Haha_[version]_linux_arm64_[bundle][ext]'
|
|
|
|
# Windows x64
|
|
- platform: windows-latest
|
|
rust_target: x86_64-pc-windows-msvc
|
|
tauri_args: '--bundles nsis'
|
|
label: Windows-x64
|
|
asset_name_pattern: 'Claude-Code-Haha_[version]_windows_x64_[bundle][ext]'
|
|
|
|
runs-on: ${{ matrix.platform }}
|
|
name: Build (${{ matrix.label }})
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Read version
|
|
id: version
|
|
shell: bash
|
|
run: |
|
|
VERSION=$(jq -r '.version' desktop/src-tauri/tauri.conf.json)
|
|
echo "value=$VERSION" >> "$GITHUB_OUTPUT"
|
|
|
|
- name: Validate tag matches version
|
|
if: github.event_name == 'push'
|
|
shell: bash
|
|
run: |
|
|
EXPECTED_TAG="v${{ steps.version.outputs.value }}"
|
|
if [ "${GITHUB_REF_NAME}" != "$EXPECTED_TAG" ]; then
|
|
echo "::error::Tag ${GITHUB_REF_NAME} does not match app version ${EXPECTED_TAG}"
|
|
exit 1
|
|
fi
|
|
|
|
- name: Load release notes
|
|
id: release_notes
|
|
shell: bash
|
|
run: |
|
|
NOTES_FILE="release-notes/v${{ steps.version.outputs.value }}.md"
|
|
if [ ! -f "$NOTES_FILE" ]; then
|
|
echo "::error::Missing release notes file: $NOTES_FILE"
|
|
exit 1
|
|
fi
|
|
|
|
{
|
|
echo 'body<<__RELEASE_NOTES__'
|
|
cat "$NOTES_FILE"
|
|
echo
|
|
echo '__RELEASE_NOTES__'
|
|
} >> "$GITHUB_OUTPUT"
|
|
|
|
# ── System dependencies (Linux) ──────────────────────────
|
|
- name: Install Linux dependencies
|
|
if: contains(matrix.platform, 'ubuntu')
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y \
|
|
build-essential \
|
|
curl \
|
|
wget \
|
|
file \
|
|
libxdo-dev \
|
|
libssl-dev \
|
|
libwebkit2gtk-4.1-dev \
|
|
libayatana-appindicator3-dev \
|
|
librsvg2-dev \
|
|
patchelf \
|
|
libfuse2
|
|
|
|
# ── Bun ──────────────────────────────────────────────────
|
|
- name: Setup Bun
|
|
uses: oven-sh/setup-bun@v2
|
|
with:
|
|
bun-version: latest
|
|
|
|
# ── Node.js (for tauri-action compatibility) ─────────────
|
|
- name: Setup Node.js
|
|
uses: actions/setup-node@v4
|
|
with:
|
|
node-version: 20
|
|
|
|
# ── Rust ─────────────────────────────────────────────────
|
|
- name: Setup Rust
|
|
uses: dtolnay/rust-toolchain@stable
|
|
with:
|
|
targets: ${{ matrix.rust_target }}
|
|
|
|
- name: Rust cache
|
|
uses: swatinem/rust-cache@v2
|
|
with:
|
|
workspaces: 'desktop/src-tauri -> target'
|
|
shared-key: ${{ matrix.rust_target }}
|
|
|
|
# ── Install dependencies ─────────────────────────────────
|
|
- name: Install root dependencies
|
|
run: bun install
|
|
|
|
- name: Install desktop dependencies
|
|
working-directory: desktop
|
|
run: bun install
|
|
|
|
- name: Install adapter dependencies
|
|
working-directory: adapters
|
|
run: bun install
|
|
|
|
# ── Build sidecars ───────────────────────────────────────
|
|
- name: Build sidecars
|
|
working-directory: desktop
|
|
env:
|
|
BUN_INSTALL_CACHE_DIR: ${{ runner.temp }}/bun-install-cache
|
|
TAURI_ENV_TARGET_TRIPLE: ${{ matrix.rust_target }}
|
|
run: bun run build:sidecars
|
|
|
|
# ── Build Tauri app ──────────────────────────────────────
|
|
- name: Build Tauri app
|
|
uses: tauri-apps/tauri-action@v0
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
|
|
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
|
|
with:
|
|
projectPath: desktop
|
|
tauriScript: bunx tauri
|
|
tagName: v__VERSION__
|
|
releaseName: 'Claude Code Haha v__VERSION__'
|
|
releaseBody: ${{ steps.release_notes.outputs.body }}
|
|
releaseDraft: ${{ github.event_name == 'workflow_dispatch' && inputs.draft || false }}
|
|
prerelease: false
|
|
updaterJsonPreferNsis: true
|
|
assetNamePattern: ${{ matrix.asset_name_pattern }}
|
|
args: ${{ matrix.tauri_args }} --ci --config src-tauri/tauri.release-ci.json
|