Files
server_manager/RELEASE.md
T
2026-05-22 00:16:08 +08:00

144 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 发布新版本
增量更新采用「无感更新」:后台静默准备,就绪后仅弹一次「重启以更新」。
---
## 推荐流程:先本地测试包,再正式发版
1. **打本地测试包(不改版本号、不覆盖 `build\output\`**
- 双击 `scripts\package\pack_local_test.bat`,或在项目根执行:
`python scripts/package/pack_local_test.py`
- 产物:`build\output_local\ServerManager_Setup_LOCAL.exe`(安装包名为 **ServerManager (本地测试)**,独立 AppId,可与正式版并存)。
- 可选:将根目录 `version.json` 同步到 `build\output_local\`(脚本已自动复制)。
2. **本地安装并验证功能**
- 确认无问题后再进入发版步骤。
3. **正式发版**
- 推荐 **`scripts\package\release.bat 1.0.x`**(先 PyInstaller,再改版本号并同步到 `dist`,再 Inno,最后 `--post-build`)。
- 产物在 **`build\output\`**`ServerManager_Setup.exe``version.json` 等,用于上传服务器。
> **说明**`pack_local_test` **不会**执行 `release.py`,也不会修改 `version.json` / `build_installer.iss` / `src\entrypoints\tk_update_demo.py` / `scripts\update\tk_updater.py` 中的版本号。
### ripgrep`rg.exe`
日志检索、匹配高亮与「文件搜索」优先使用 **ripgrep**。打包前请将 **`rg.exe`** 放在 `resources\bin\rg.exe`(可从 [ripgrep Releases](https://github.com/BurntSushi/ripgrep/releases) 下载 Windows 预编译包)。
`scripts\package\build.bat` 在主程序 PyInstaller 完成后会自动把 `resources\bin\rg.exe` 复制到 `src\dist\main\rg.exe`(与 `main.exe` 同目录);Inno Setup 随 `src\dist\main\*` 递归打入安装包。若未放置 `rg.exe`,打包会提示警告,安装后仍可通过环境变量 **`RG_PATH`** 或系统 PATH 中的 `rg` 使用。
---
## 一键发版(推荐)
在项目根目录执行:
```bat
scripts\package\release.bat 1.0.4
```
或双击 `scripts\package\release.bat`,按提示输入版本号(如 `1.0.4`)。
脚本将自动完成:**PyInstaller 打包 main.exe → 更新版本号与全量更新 manifest(并同步到 `src\dist\main\` 内)→ Inno Setup 打安装包 → `--post-build`(复制 version.json 到 `build\output`)→ 清理打包中间产物**。
> 正式发版统一使用 `build/output` 作为发布目录,manifest 和安装包 URL 均指向 `server_manager/build/output/...`。
**说明**:与 Cursor 一致,**本地与远端均不保存 main_*.exe**。当前结构调整版本不要生成增量包;若以后确认只替换 `main.exe` 足够,先执行 `python scripts/package/release.py x.y.z --with-delta`,再在打包完成后手动执行:
`python scripts/package/release.py --post-build --old-exe <上一版 main.exe 的路径>`
(上一版 exe 可来自本机备份、CI 构建产物等,由你自行保留。)
---
## 手动发版(可选)
### 1. 修改版本号(三处)
(若使用 `scripts\package\release.bat``python scripts/package/release.py x.y.z`,请在 **PyInstaller 已成功生成 `src\dist\main\` 之后** 执行,以便 `version.json` 被同步进安装包目录。)
- **build_installer.iss**`#define MyAppVersion "x.y.z"` 改为新版本。
- **src\entrypoints\tk_update_demo.py** / **scripts\update\tk_updater.py**`LOCAL_VERSION = "x.y.z"` 改为新版本。
- **version.json**
- `version`:新版本号。
- `release_notes`:本次更新说明。
- `download_url` / `full_installer_url`:固定为 `.../ServerManager_Setup.exe`(安装包不带版本号,每次打包覆盖即可)。
- **delta_updates**:结构调整版本保持 `{}`,确保客户端走全量安装包。
- **仅当结构未变且确认只替换 main.exe 足够时**,才使用 `--with-delta` 生成「上一版本 → 当前版本」一项,例如从 1.0.3 升到 1.0.4 时:
```json
"delta_updates": {
"1.0.3": {
"patch_url": "http://.../path=server_manager/build/output/patches/v1.0.3_to_v1.0.4.patch",
"new_exe_sha256": ""
}
}
```
`new_exe_sha256` 在步骤 3 生成补丁后填入。
---
### 2. 打包
与 `scripts\package\release.bat` 等价的手动顺序:
```bat
scripts\package\build.bat
python scripts/package/release.py 1.0.x --notes "说明"
"C:\Program Files (x86)\Inno Setup 6\ISCC.exe" scripts\package\build_installer.iss
python scripts/package/release.py --post-build
```
或仅打安装包(不执行 `scripts\package\release.py`)时用 `scripts\package\pack_all.bat`。得到 `src\dist\main\`、`build\output\ServerManager_Setup.exe``build\output\version.json`
## 自动更新发布路径
客户端更新入口统一使用 `build/output`
- manifest`server_manager/build/output/version.json`
- 完整安装包:`server_manager/build/output/ServerManager_Setup.exe`
发布时只需要同步 `build/output/` 到后端存储对应路径。客户端检测到更高版本后会下载 `download_url` / `full_installer_url` 指向的完整安装包并静默安装。
---
### 3. 生成增量补丁(可选)
仅当需要「上一版本 → 当前版本」的增量更新时执行。
1. **准备上一版本的 main.exe**(本地不自动保存;请自行保留一份,如从 CI 产物或备份拷贝)。
2. **生成 .patch 并填 SHA256**:打包完成后执行
`python scripts/package/release.py --post-build --old-exe <上一版 main.exe 路径>`
或手动执行:
```python
import bsdiff4
import hashlib
from pathlib import Path
old = Path("path/to/main_1.0.3.exe").read_bytes()
new = Path("src/dist/main.exe").read_bytes()
patch = bsdiff4.diff(old, new)
Path("build/output/patches/v1.0.3_to_v1.0.4.patch").write_bytes(patch)
new_sha = hashlib.sha256(new).hexdigest().lower()
print("new_exe_sha256:", new_sha) # 填回 version.json 对应 delta 项
```
3. 将 `new_exe_sha256` 填回 **version.json** 的 `delta_updates["1.0.3"].new_exe_sha256`,再复制一次 `version.json` 到 `build\output\`。
---
### 4. 发布内容
发布 **build\output** 目录即可:
- `build/output/ServerManager_Setup.exe`
- `build/output/version.json`
- `build/output/patches/*.patch`(若使用增量更新)
用户通过 `update_url` 拉取 `version.json`,客户端更新服务会后台静默准备增量或全量,就绪后弹「重启以更新」。
---
## 开发计划
- [ ] **查看服务器日志**:支持查看 error/info、角色协议等日志,并支持模糊搜索。