如何在Gitlab CI中通过脚本可靠卸载Windows的Electron MSI程序?
寻求Windows平台Electron程序可靠卸载方案
背景
我们团队开发一款基于Electron的软件,通过MSI安装包分发至Windows平台,安装包由electron-builder自动构建,对其内部机制不了解。我们将程序的端到端测试纳入Gitlab CI流水线,配置本地Windows Runner执行任务;为正常测试GUI,gitlab-runner二进制文件从桌面环境手动启动,而非服务方式。
CI任务基本流程
- 获取上一任务构建的MSI安装包
- 在注册表中搜索已安装程序版本的ProductCode
- 执行
msiexec /uninstall {ProductCode}卸载程序 - 检查程序安装目录是否为空
- 执行
msiexec /i {PathToInstaller.msi}安装新版本 - 运行模拟用户行为的端到端测试
当前问题
Windows平台频繁出现稳定性问题,任务随机失败,需开发者远程连接Runner机器手动修复。卸载程序极不可靠:有时无法删除程序文件夹,有时残留注册表项,多数情况下仍返回成功且无明显错误,导致安装损坏,仅能手动修复。测试过程也可能自行造成环境损坏,因此需要一种可靠的非手动方式彻底清除所有残留,恢复干净环境。
现有候选方案及疑问
- Windows Docker容器:本为理想选择,但应用无法在其受限环境运行
- Windows Sandbox:可作为Docker容器的替代方案,能否实现自动化?
- 面向普通用户的“程序卸载工具”可跟踪安装并彻底卸载,是否有CLI版本的替代工具?
- 手动编写脚本删除所有残留:易出错且难以维护,团队无人了解Windows安装/卸载机制
可靠卸载方案建议
1. 自动化Windows Sandbox
Windows Sandbox完全支持自动化,可通过以下步骤实现:
- 创建
.wsb配置文件,定义沙箱参数:挂载宿主CI工作目录(存放MSI包、测试脚本)、设置网络权限等 - 在配置文件的
LogonCommand中指定启动后自动执行的脚本,包含安装MSI、运行端到端测试、收集测试结果等逻辑 - Gitlab CI脚本中通过
Start-Process WindowsSandbox.exe -ArgumentList "path/to/your/config.wsb"启动沙箱,配合等待脚本执行完成的逻辑实现全自动化 - 测试结束后沙箱自动销毁,所有环境残留直接清除,无需手动清理
2. 使用CLI版专业卸载工具
以下几款CLI工具可实现彻底卸载与残留清理:
- 微软官方卸载修复工具CLI:支持扫描并修复损坏的安装项,可执行
msiexec /f {ProductCode}修复安装,或通过工具内置参数强制清理残留注册表与文件 - Revo Uninstaller Pro CLI:商业工具,支持命令行卸载程序,并深度扫描残留文件、注册表键值,适合自动化场景
- ZSoft Uninstaller CLI:轻量级免费工具,提供CLI接口彻底卸载程序并清理残留
3. 优化electron-builder生成的MSI卸载逻辑
针对electron-builder的配置做针对性优化:
- 在electron-builder配置中添加
afterUninstall脚本,指定卸载完成后自动删除残留文件夹与已知注册表项 - 卸载时使用更严格的参数:
msiexec /uninstall {ProductCode} /qn /forcerestart,/qn实现静默卸载,/forcerestart强制重启(若需)避免文件占用 - 卸载后补充强制清理步骤:先用
Stop-Process终止程序所有进程,再用Remove-Item -Recurse -Force删除安装目录,最后用reg delete清理指定注册表路径
4. 自动化系统还原点
在CI任务开始前创建系统还原点,失败后自动恢复:
- 执行
Checkpoint-Computer -Description "CI Clean Test State" -RestorePointType "MODIFY_SETTINGS"创建还原点 - 测试失败时执行
Restore-Computer -RestorePoint "CI Clean Test State"恢复系统 - 注意定期清理旧还原点,避免占用过多磁盘空间
内容的提问来源于stack exchange,提问作者Dmitry Semenov
相关产品推荐
相关产品推荐

