Skip to content

fix(update): make Windows self-updates reliable - #192

Merged
iuyo5678 merged 2 commits into
mainfrom
fix/windows-update-reliability
Sep 7, 2026
Merged

fix(update): make Windows self-updates reliable#192
iuyo5678 merged 2 commits into
mainfrom
fix/windows-update-reliability

Conversation

@iuyo5678

@iuyo5678 iuyo5678 commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator

问题

PR #176 修复后,Windows 自更新仍存在以下问题:

  • helper 启动参数被重复转义,导致 cmd.exe 无法执行脚本,但 CLI 仍报告已暂存。
  • UTF-8 脚本被系统代码页解析,中文用户名或安装路径导致替换失败。
  • 自动更新暂存后,旧 daemon 不退出,持续占用 exe,后续检查重复尝试更新。
  • helper 继承旧 daemon 的监听句柄,即使旧进程退出,端口仍被占用,导致新 daemon 启动失败。

修复

  • 使用明确的 Windows 命令行格式启动 helper,脚本保持 ASCII,路径通过 Unicode 环境变量传递。
  • 使用专用 Win32 启动封装,仅允许 helper 继承标准输入输出句柄,避免继承监听端口。
  • 确认 helper 已开始执行后才报告暂存成功。
  • 自动更新时主动退出旧 daemon,由 helper 完成替换,并保留端口和 idle timeout 配置重启。
  • 替换最多尝试 120 次;失败保留诊断日志,清理暂存文件和脚本;成功清理辅助文件。
  • 将更新回归测试加入 Windows CI。

改动集中在更新逻辑、专用 Windows helper 和相关测试,没有新增依赖,也未修改通用 daemon 启动和网络实现。

验证

Windows 本机共 69 项相关测试通过:

  • 更新模块:26 项
  • 真实进程更新流程:2 项
  • daemon 启动:4 项
  • Windows IPC:2 项
  • 进程存活检测:3 项
  • CLI 参数解析:32 项

新增覆盖包括:

  • 英文、空格、中文及 %!&、括号路径。
  • 文件占用后释放并完成替换。
  • 持续占用时有限重试、保留旧文件及失败清理。
  • 替换成功但重启失败时记录日志。
  • 使用隔离 BSK_HOME 和本地发布服务器,验证真实 CLI 自替换。
  • 验证自动更新后旧 daemon 退出、新 daemon 在原端口启动,且不会立即重复下载。

cargo fmt --all -- --check 和差异检查通过。
Clippy 无新增告警,保留仓库已有告警。
Linux/macOS 未在本地执行测试。

Related: #176

@iuyo5678
iuyo5678 merged commit 3c5f838 into main Sep 7, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant