Skip to content

Commit a635f2a

Browse files
committed
新增 Windows tag 发布流程
原因:当前仓库只有分支/PR 回归,没有受控的发版流程;如果打 tag 后另起一套构建上传链,容易绕过现有 Windows release smoke,把不能用的包直接发出去。 影响:新增仅在 v* tag 触发的 windows-release-on-tag,先跑 sidecar build、前端测试/构建、Rust 测试、Tauri build 和 release smoke,再发布 exe/msi/nsis/sidecar/SHA256SUMS;同时分支/PR workflow 不再在 tag push 时重复触发。 验证:已校验 workflow YAML 可解析;已执行 cd desktop-shell && npm run test:rust。风险:真正的 GitHub Release 上传只能在远端 push tag 后验证。
1 parent a800e36 commit a635f2a

File tree

5 files changed

+161
-2
lines changed

5 files changed

+161
-2
lines changed

.github/workflows/windows-fast-regression.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ name: windows-fast-regression
33
on:
44
pull_request:
55
push:
6+
branches:
7+
- "**"
68
workflow_dispatch:
79

810
permissions:

.github/workflows/windows-packaging-smoke.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ name: windows-packaging-smoke
33
on:
44
pull_request:
55
push:
6+
branches:
7+
- "**"
68
workflow_dispatch:
79

810
permissions:
@@ -55,8 +57,8 @@ jobs:
5557
run: npm run build
5658

5759
- name: Run desktop-shell Rust tests
58-
working-directory: desktop-shell/src-tauri
59-
run: cargo test
60+
working-directory: desktop-shell
61+
run: npm run test:rust
6062

6163
- name: Run desktop-shell release smoke
6264
run: python scripts/smoke_desktop_shell_release.py
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
name: windows-release-on-tag
2+
3+
on:
4+
push:
5+
tags:
6+
- "v*"
7+
8+
permissions:
9+
contents: write
10+
11+
jobs:
12+
release:
13+
runs-on: windows-latest
14+
env:
15+
DEEPLX_URL: http://127.0.0.1:1188/translate
16+
17+
steps:
18+
- name: Checkout
19+
uses: actions/checkout@v4
20+
with:
21+
fetch-depth: 0
22+
23+
- name: Setup Python
24+
uses: actions/setup-python@v5
25+
with:
26+
python-version: "3.11"
27+
28+
- name: Setup Node.js
29+
uses: actions/setup-node@v4
30+
with:
31+
node-version: "20"
32+
cache: "npm"
33+
cache-dependency-path: desktop-shell/package-lock.json
34+
35+
- name: Setup Rust
36+
uses: dtolnay/rust-toolchain@stable
37+
38+
- name: Install Python dependencies
39+
run: |
40+
python -m pip install --upgrade pip
41+
python -m pip install pyinstaller
42+
python -m pip install -r requirements.txt
43+
44+
- name: Install desktop-shell dependencies
45+
working-directory: desktop-shell
46+
run: npm ci
47+
48+
- name: Build desktop-shell sidecars
49+
run: python scripts/build_desktop_shell_sidecars.py --python python
50+
51+
- name: Run desktop-shell frontend tests
52+
working-directory: desktop-shell
53+
run: npm test
54+
55+
- name: Build desktop-shell frontend dist
56+
working-directory: desktop-shell
57+
run: npm run build
58+
59+
- name: Run desktop-shell Rust tests
60+
working-directory: desktop-shell
61+
run: npm run test:rust
62+
63+
- name: Build desktop-shell Windows release
64+
working-directory: desktop-shell
65+
run: npm run tauri -- build
66+
67+
- name: Run desktop-shell release smoke
68+
run: python scripts/smoke_desktop_shell_release.py --skip-build
69+
70+
- name: Generate release checksums
71+
shell: pwsh
72+
run: |
73+
$ErrorActionPreference = 'Stop'
74+
New-Item -ItemType Directory -Force -Path 'release-assets' | Out-Null
75+
$releaseAssetPaths = @(
76+
(Resolve-Path 'desktop-shell/src-tauri/target/release/wechat-auto-shell.exe').Path
77+
(Resolve-Path 'desktop-shell/src-tauri/target/release/wechat-auto-backend.exe').Path
78+
(Resolve-Path 'desktop-shell/src-tauri/target/release/group_listener_worker.exe').Path
79+
)
80+
$releaseAssetPaths += Get-ChildItem 'desktop-shell/src-tauri/target/release/bundle/msi/*.msi' | Select-Object -ExpandProperty FullName
81+
$releaseAssetPaths += Get-ChildItem 'desktop-shell/src-tauri/target/release/bundle/nsis/*-setup.exe' | Select-Object -ExpandProperty FullName
82+
if ($releaseAssetPaths.Count -eq 0) {
83+
throw 'no release assets found'
84+
}
85+
$checksumLines = foreach ($path in ($releaseAssetPaths | Sort-Object)) {
86+
$hash = (Get-FileHash -Algorithm SHA256 -Path $path).Hash.ToLower()
87+
"$hash $(Split-Path $path -Leaf)"
88+
}
89+
Set-Content -Path 'release-assets/SHA256SUMS.txt' -Value $checksumLines -Encoding utf8
90+
91+
- name: Upload workflow artifacts
92+
uses: actions/upload-artifact@v4
93+
with:
94+
name: windows-release-assets-${{ github.ref_name }}
95+
if-no-files-found: error
96+
path: |
97+
desktop-shell/src-tauri/target/release/wechat-auto-shell.exe
98+
desktop-shell/src-tauri/target/release/wechat-auto-backend.exe
99+
desktop-shell/src-tauri/target/release/group_listener_worker.exe
100+
desktop-shell/src-tauri/target/release/bundle/msi/*.msi
101+
desktop-shell/src-tauri/target/release/bundle/nsis/*-setup.exe
102+
release-assets/SHA256SUMS.txt
103+
104+
- name: Publish GitHub release
105+
uses: softprops/action-gh-release@v2
106+
with:
107+
generate_release_notes: true
108+
fail_on_unmatched_files: true
109+
prerelease: ${{ contains(github.ref_name, '-') }}
110+
files: |
111+
desktop-shell/src-tauri/target/release/wechat-auto-shell.exe
112+
desktop-shell/src-tauri/target/release/wechat-auto-backend.exe
113+
desktop-shell/src-tauri/target/release/group_listener_worker.exe
114+
desktop-shell/src-tauri/target/release/bundle/msi/*.msi
115+
desktop-shell/src-tauri/target/release/bundle/nsis/*-setup.exe
116+
release-assets/SHA256SUMS.txt

docs/desktop-shell-build.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,26 @@ Tauri 壳运行时按这个顺序找 `.env.local`:
184184
- 断言整轮 smoke 里只出现一次 `spawning backend sidecar`
185185
- 断言本轮 bootstrap log 里不能出现 `backend stderr:``backend error:``bootstrap failed:` 或 traceback / panic 片段
186186

187+
## GitHub Tag 发布
188+
189+
- 推送 `v*` tag 会触发 `windows-release-on-tag`
190+
- 这条 workflow 只跑 Windows,不做跨平台发包
191+
- 它会先执行:
192+
- `python scripts/build_desktop_shell_sidecars.py --python python`
193+
- `cd desktop-shell && npm test`
194+
- `cd desktop-shell && npm run build`
195+
- `cd desktop-shell && npm run test:rust`
196+
- `cd desktop-shell && npm run tauri -- build`
197+
- 然后执行 `python scripts/smoke_desktop_shell_release.py --skip-build`
198+
- 只有 smoke 通过后,才会把这些产物附到 GitHub Release:
199+
- `wechat-auto-shell.exe`
200+
- `wechat-auto-backend.exe`
201+
- `group_listener_worker.exe`
202+
- `msi`
203+
- `nsis setup.exe`
204+
- `SHA256SUMS.txt`
205+
- 分支 / PR 上的 `windows-fast-regression``windows-packaging-smoke` 继续负责回归,不负责发版;tag 发布由 `windows-release-on-tag` 接管,避免同一个 tag 重复跑多套 Windows 重活
206+
187207
2026-03-11 已在当前仓库实际跑过:
188208

189209
- `python scripts/build_desktop_shell_sidecars.py --python python`

docs/wechat-listening-pitfalls.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,25 @@
505505
- `startup failed`、依赖检查失败、非法 owner pid 这类异常继续走 stderr,不要为了过 smoke 把真错误静音。
506506
- 遇到 `backend stderr:` 时,先看具体文案;如果只是正常生命周期提示,修日志分流,不要去放宽 smoke 规则。
507507

508+
### 28.06) tag 发布不能绕过 Windows release smoke
509+
现象:
510+
- 有些仓库会在打 tag 后直接上传 installer / setup.exe,看起来很省事,但一旦构建链和真实启动链脱节,就会把“能编译”误当成“能交付”。
511+
- 这种错最坏的地方不是 CI 红了,而是包已经发出去了,用户才替你做 smoke。
512+
513+
根因:
514+
- `npm run tauri -- build` 只能证明 Tauri/sidecar 构建成功,不能证明 release 壳真的能拉起 backend、通过 `/healthz`、守住 single-instance、也不能证明 bootstrap log 干净。
515+
- tag 发布如果不复用 `python scripts/smoke_desktop_shell_release.py`,就等于又发明了一条和现有发布闸口不一致的发版链。
516+
517+
处理:
518+
- `windows-release-on-tag` 必须先执行完整 Windows 发布闸口,再发布产物:
519+
- sidecar build
520+
- frontend test/build
521+
- `npm run test:rust`
522+
- `npm run tauri -- build`
523+
- `python scripts/smoke_desktop_shell_release.py --skip-build`
524+
- 只有 smoke 通过后,才允许把 `wechat-auto-shell.exe`、sidecar、`msi``nsis setup.exe``SHA256SUMS.txt` 挂到 GitHub Release。
525+
- 分支 / PR 上继续跑 `windows-fast-regression``windows-packaging-smoke``v*` tag 则交给 `windows-release-on-tag`,不要让同一个 tag 触发多套重复 Windows 重活。
526+
508527
### 28.1) 把源码态配置和安装版配置混成一套
509528
现象:
510529
- 安装路径明明不在仓库里,但重装后翻译和 TTS 还是“自动就能用”。

0 commit comments

Comments
 (0)