From 310086d5c9aee2e6b748fb8e1857138aee23d1b8 Mon Sep 17 00:00:00 2001 From: Jason Date: Thu, 11 Sep 2025 10:17:35 +0800 Subject: [PATCH] ci(release): refine artifacts\n\n- macOS: add .app zip (plus tar.gz + .sig for updater)\n- Windows: only MSI + .sig; add portable zip\n- Linux: always include .deb; keep AppImage + .sig for updater --- .github/workflows/release.yml | 72 ++++++++++++++++++++++++----------- 1 file changed, 50 insertions(+), 22 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 68242c2..ca161d7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -161,16 +161,16 @@ jobs: run: | set -euxo pipefail mkdir -p release-assets - echo "Looking for updater artifact (.tar.gz)..." - TAR_GZ="" + echo "Looking for updater artifact (.tar.gz) and .app for zip..." + TAR_GZ=""; APP_PATH="" for path in \ "src-tauri/target/universal-apple-darwin/release/bundle/macos" \ "src-tauri/target/aarch64-apple-darwin/release/bundle/macos" \ "src-tauri/target/x86_64-apple-darwin/release/bundle/macos" \ "src-tauri/target/release/bundle/macos"; do if [ -d "$path" ]; then - TAR_GZ=$(find "$path" -maxdepth 1 -name "*.tar.gz" -type f | head -1 || true) - [ -n "$TAR_GZ" ] && break + [ -z "$TAR_GZ" ] && TAR_GZ=$(find "$path" -maxdepth 1 -name "*.tar.gz" -type f | head -1 || true) + [ -z "$APP_PATH" ] && APP_PATH=$(find "$path" -maxdepth 1 -name "*.app" -type d | head -1 || true) fi done if [ -z "$TAR_GZ" ]; then @@ -180,6 +180,15 @@ jobs: cp "$TAR_GZ" release-assets/ [ -f "$TAR_GZ.sig" ] && cp "$TAR_GZ.sig" release-assets/ || echo ".sig for macOS not found yet" echo "macOS updater artifact copied: $(basename "$TAR_GZ")" + if [ -n "$APP_PATH" ]; then + APP_DIR=$(dirname "$APP_PATH"); APP_NAME=$(basename "$APP_PATH") + cd "$APP_DIR" + ditto -c -k --sequesterRsrc --keepParent "$APP_NAME" "CC-Switch-macOS.zip" + mv "CC-Switch-macOS.zip" "$GITHUB_WORKSPACE/release-assets/" + echo "macOS zip ready: CC-Switch-macOS.zip" + else + echo "No .app found to zip (optional)" >&2 + fi - name: Prepare Windows Assets if: runner.os == 'Windows' @@ -187,25 +196,42 @@ jobs: run: | $ErrorActionPreference = 'Stop' New-Item -ItemType Directory -Force -Path release-assets | Out-Null - # 安装器(优先 NSIS,其次 MSI)— 同时配合 .sig - $installer = Get-ChildItem -Path 'src-tauri/target/release/bundle' -Recurse -Include *.exe,*.msi -ErrorAction SilentlyContinue | - Where-Object { $_.FullName -match '\\bundle\\(nsis|msi)\\' } | - Select-Object -First 1 - if ($null -ne $installer) { - $dest = if ($installer.Extension -ieq '.msi') { 'CC-Switch-Setup.msi' } else { 'CC-Switch-Setup.exe' } - Copy-Item $installer.FullName (Join-Path release-assets $dest) + # 仅打包 MSI 安装器 + .sig(用于 Updater) + $msi = Get-ChildItem -Path 'src-tauri/target/release/bundle/msi' -Recurse -Include *.msi -ErrorAction SilentlyContinue | Select-Object -First 1 + if ($null -eq $msi) { + # 兜底:全局搜索 .msi + $msi = Get-ChildItem -Path 'src-tauri/target/release/bundle' -Recurse -Include *.msi -ErrorAction SilentlyContinue | Select-Object -First 1 + } + if ($null -ne $msi) { + $dest = 'CC-Switch-Setup.msi' + Copy-Item $msi.FullName (Join-Path release-assets $dest) Write-Host "Installer copied: $dest" - $sigPath = "$($installer.FullName).sig" + $sigPath = "$($msi.FullName).sig" if (Test-Path $sigPath) { Copy-Item $sigPath (Join-Path release-assets ("$dest.sig")) Write-Host "Signature copied: $dest.sig" } else { - Write-Warning "Signature not found for $($installer.Name)" + Write-Warning "Signature not found for $($msi.Name)" } } else { - Write-Warning 'No Windows installer found' + Write-Warning 'No Windows MSI installer found' + } + # 绿色版(portable):仅可执行文件打 zip(不参与 Updater) + $exeCandidates = @( + 'src-tauri/target/release/cc-switch.exe', + 'src-tauri/target/x86_64-pc-windows-msvc/release/cc-switch.exe' + ) + $exePath = $exeCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1 + if ($null -ne $exePath) { + $portableDir = 'release-assets/CC-Switch-Portable' + New-Item -ItemType Directory -Force -Path $portableDir | Out-Null + Copy-Item $exePath $portableDir + Compress-Archive -Path "$portableDir/*" -DestinationPath 'release-assets/CC-Switch-Windows-Portable.zip' -Force + Remove-Item -Recurse -Force $portableDir + Write-Host 'Windows portable zip created' + } else { + Write-Warning 'Portable exe not found' } - # 可选:保留绿色版逻辑(不用于 Updater) - name: Prepare Linux Assets if: runner.os == 'Linux' @@ -221,12 +247,14 @@ jobs: echo "AppImage copied" else echo "No AppImage found under target/release/bundle" >&2 - # 可选:仍然尝试 .deb(不用于 Updater) - DEB=$(find src-tauri/target/release/bundle -name "*.deb" | head -1 || true) - if [ -n "$DEB" ]; then - cp "$DEB" release-assets/ - echo "Deb package copied" - fi + fi + # 额外上传 .deb(用于手动安装,不参与 Updater) + DEB=$(find src-tauri/target/release/bundle -name "*.deb" | head -1 || true) + if [ -n "$DEB" ]; then + cp "$DEB" release-assets/ + echo "Deb package copied" + else + echo "No .deb found (optional)" fi - name: List prepared assets @@ -255,7 +283,7 @@ jobs: ### 下载 - macOS: `CC-Switch-macOS.zip`(解压即用) - - Windows: `CC-Switch-Setup.exe` 或 `CC-Switch-Setup.msi`(安装版);`CC-Switch-Windows-Portable.zip`(绿色版) + - Windows: `CC-Switch-Setup.msi`(安装版);`CC-Switch-Windows-Portable.zip`(绿色版) - Linux: `*.deb`(Debian/Ubuntu 安装包) ---