ci: 构建链补完 wails v2→v3 迁移,CI 触发收敛到 main

代码早就全量迁到 v3(go.mod 只要 wails/v3、main.go import v3/pkg/application),
但"怎么构建"这一层从没跟上,全还是 v2:

- release.yml 装 v2 CLI(wails@v2.12.0)去编 v3 代码,编不过;产物路径也还
  指向 v2 的 build/bin/,而 v3 落在 bin/。这条只在打 v* tag 时触发,迁移后
  一次都没跑过,所以坏了半个月没人知道 —— 下次发版必炸。
- Makefile 的 wails dev/build 直接 command not found。
- README 叫人装 v2 CLI;RELEASE.md 还在提早已删除的 wails.json。

改动:
- ci.yml 触发从 [main, dev] 收到 [main]。dev 分支已删,开发在 feat/wails3,
  留着 dev 是死条件;PR 以 main 为目标仍会跑,合入前有关卡。
- release.yml 全量转 v3:
  * CLI 钉死 v3.0.0-alpha2.117,与 go.mod 的 wails/v3 版本一致 —— alpha 阶段
    CLI 生成的 bindings 和运行时配套,版本错开会出难查的怪问题。
  * mac 走 wails3 task darwin:package:universal。v3 的 build 只出裸二进制
    (macOS 上双击不起窗),必须 package 才有 .app;本地实跑验证过,
    lipo -archs 确认是真 universal(x86_64 + arm64)。
  * Windows 保持 v2 时代行为发裸 .exe。v3 的 package 默认走 NSIS 出 installer,
    依赖 runner 上有 makensis,属额外未知数,要升级安装包再单独议。
  * 产物路径 build/bin/ → bin/。
  * fail_on_unmatched_files 改 true,并按 matrix 只匹配自己那个产物 ——
    原来是 false 且两个平台都列全量文件,产物路径写错会安静发一个没附件的
    Release。这次的 bug 正是路径漂移,得让它当场炸。
- RELEASE.md 版本号对齐表补上第三处 build/config.yml 的 info.version(此前写着
  "必须三处对齐"却只列了两处,第三处是已删的 wails.json),并记下改完必须跑
  wails3 task common:update:build-assets 重新生成 Info.plist —— 这坑踩过。
- 清掉 v2 残留:frontend/wailsjs/(v2 绑定,v3 用已跟踪的 bindings/)及其
  gitignore 规则、build/bin/ 里 v2 时代的 .app。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Blizzard
2026-07-16 15:03:32 +08:00
parent 759483bf92
commit a5cf2c5f36
6 changed files with 47 additions and 24 deletions
+33 -15
View File
@@ -1,6 +1,6 @@
name: Release
# 打 vX.Y.Z 标签即触发:各平台用 wails 构建桌面端安装包 → 发布到 GitHub Release。
# 打 vX.Y.Z 标签即触发:各平台用 wails3 构建桌面端 → 发布到 GitHub Release。
# 用户旧版 App 启动时查 /releases/latest,发现新版即提示下载(见 frontend/src/lib/version.ts)。
on:
push:
@@ -9,6 +9,11 @@ on:
permissions:
contents: write # 创建 release + 上传产物需要
env:
# 必须与 sundynix-desktop/go.mod 里的 wails/v3 版本一致:alpha 阶段 CLI 生成的
# bindings 与运行时是配套的,版本错开会出难查的怪问题。升级时两处一起改。
WAILS3_VERSION: v3.0.0-alpha2.117
jobs:
build:
name: 构建 ${{ matrix.label }}
@@ -19,10 +24,10 @@ jobs:
include:
- os: macos-latest
label: macOS (universal)
platform: darwin/universal
asset: sundynix_desktop_macos_universal.zip
- os: windows-latest
label: Windows (amd64)
platform: windows/amd64
asset: sundynix_desktop_windows_amd64.exe
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
@@ -31,30 +36,43 @@ jobs:
- uses: actions/setup-node@v4
with:
node-version: "20"
- name: 安装 wails CLI
run: go install github.com/wailsapp/wails/v2/cmd/wails@v2.12.0
- name: 安装 wails3 CLI
run: go install github.com/wailsapp/wails/v3/cmd/wails3@${{ env.WAILS3_VERSION }}
- name: 构建桌面端(wails buildGOWORK=off 因 desktop 不在工作区)
# v3 的 build 只出裸二进制(macOS 上双击不起窗),必须 package 才有 .app
# universal 走 darwin:package:universal:分别编 amd64/arm64 再 lipo 合并。
# 任务链自带 npm install + generate:bindings,故不需要单独的前端构建步骤。
- name: 构建 macOS .appuniversal
if: runner.os == 'macOS'
working-directory: sundynix-desktop
env:
GOWORK: "off" # 必须加引号:YAML 裸 off 会被解析成布尔 false,使 workflow 校验不合法而不触发
run: wails build -clean -platform ${{ matrix.platform }}
run: wails3 task darwin:package:universal
# Windows 沿用 v2 时代的行为:发裸 .exe。v3 的 package 默认走 NSIS 出 installer
# 需 runner 上有 makensis,属于额外未知数,要升级安装包再单独议。
- name: 构建 Windows .exe
if: runner.os == 'Windows'
working-directory: sundynix-desktop
env:
GOWORK: "off"
run: wails3 build
# macOS.app 是目录,打包成 zip 才能作为单文件资产分发。
- name: 打包 macOS 产物
if: runner.os == 'macOS'
working-directory: sundynix-desktop/build/bin
run: zip -r -y sundynix_desktop_macos_universal.zip sundynix_desktop.app
working-directory: sundynix-desktop/bin
run: zip -r -y ${{ matrix.asset }} sundynix_desktop.app
- name: 重命名 Windows 产物
if: runner.os == 'Windows'
working-directory: sundynix-desktop/build/bin
run: ren sundynix_desktop.exe sundynix_desktop_windows_amd64.exe
working-directory: sundynix-desktop/bin
run: Rename-Item sundynix_desktop.exe ${{ matrix.asset }}
# fail_on_unmatched_files 必须为 true:产物路径写错时要当场炸,而不是安静地
# 发一个没有附件的 Release。v2→v3 迁移正是把产物从 build/bin 挪到了 bin。
- name: 发布到 GitHub Release(按 tag 创建/追加资产)
uses: softprops/action-gh-release@v2
with:
fail_on_unmatched_files: false
files: |
sundynix-desktop/build/bin/sundynix_desktop_macos_universal.zip
sundynix-desktop/build/bin/sundynix_desktop_windows_amd64.exe
fail_on_unmatched_files: true
files: sundynix-desktop/bin/${{ matrix.asset }}