6.7 KiB
Jenkinsfile WiX Toolset 错误处理修复
问题: GUI 打包阶段在检查 WiX Toolset 时失败并退出(exit code 255)
修复日期: 2025-11-26
状态: ✅ 已修复
问题描述
错误现象
在 Jenkins 流水线的 GUI 打包阶段(Stage 7.2),当检查 WiX Toolset 是否安装时,如果 where candle.exe 命令找不到 candle.exe,整个批处理脚本会以错误代码 255 退出,导致流水线失败。
错误日志
E:\2025-2026\GitAIOps\jenkins\.jenkins\workspace\SLMS>where candle.exe 1>nul 2>&1
<0A><>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6> \WiX<69><58>
E:\2025-2026\GitAIOps\jenkins\.jenkins\workspace\SLMS>echo 当前 WIX_HOME: C:\Program Files (x86)\WiX Toolset v3.11
script returned exit code 255
根本原因
-
批处理脚本错误处理不当
where candle.exe失败时返回非零退出码- 批处理脚本没有正确捕获和处理这个错误
- 导致整个脚本异常退出
-
缺少错误恢复机制
- 没有使用
setlocal EnableDelayedExpansion - 没有在脚本末尾使用
exit /b 0确保成功退出 - 错误检查逻辑不够健壮
- 没有使用
修复方案
修改 1: 添加脚本初始化
位置: Jenkinsfile Stage 7.2 GUI 打包
修改前:
bat '''
REM 使用 jpackage 创建 Windows EXE
echo.
echo ========== 使用 jpackage 创建 EXE ==========
修改后:
bat '''
@echo off
setlocal EnableDelayedExpansion
REM 使用 jpackage 创建 Windows EXE
echo.
echo ========== 使用 jpackage 创建 EXE ==========
说明:
@echo off- 关闭命令回显setlocal EnableDelayedExpansion- 启用延迟变量扩展,支持!variable!语法
修改 2: 改进 WiX 检查逻辑
修改前:
REM 检查 WiX Toolset 是否安装
where candle.exe >nul 2>&1
if errorlevel 1 (
echo ⚠️ 警告: WiX Toolset 未找到,跳过 EXE 打包
echo 提示: 请检查 WiX Toolset 安装路径
echo 当前 WIX_HOME: %WIX_HOME%
goto skip_exe
)
echo ✓ WiX Toolset 可用
修改后:
REM 检查 WiX Toolset 是否安装
set WIX_FOUND=0
where candle.exe >nul 2>&1 && set WIX_FOUND=1
if !WIX_FOUND! EQU 0 (
echo ⚠️ 警告: WiX Toolset 未找到,跳过 EXE 打包
echo 提示: 请检查 WiX Toolset 安装路径
echo 当前 WIX_HOME: %WIX_HOME%
echo 继续执行,但不创建 EXE 和 MSI
goto skip_exe
)
echo ✓ WiX Toolset 可用
说明:
- 使用变量
WIX_FOUND存储检查结果 - 使用
&&操作符在命令成功时设置变量 - 使用延迟变量扩展
!WIX_FOUND!读取变量值 - 添加更详细的提示信息
修改 3: 确保脚本成功退出
修改前:
echo ✓ 已创建 README-GUI.txt
'''
修改后:
echo ✓ 已创建 README-GUI.txt
REM 确保脚本成功退出
exit /b 0
'''
说明:
exit /b 0- 以成功状态(0)退出批处理脚本- 即使跳过了 EXE/MSI 创建,脚本也会正常退出
- 不会影响后续的流水线阶段
修复效果
修复前
- ❌ WiX Toolset 未找到时流水线失败
- ❌ 错误代码 255
- ❌ 无法继续后续阶段
修复后
- ✅ WiX Toolset 未找到时显示警告但继续执行
- ✅ 跳过 EXE 和 MSI 创建
- ✅ 仍然创建 GUI JAR 和启动脚本
- ✅ 流水线正常完成
测试验证
场景 1: WiX Toolset 已安装
预期行为:
- 检测到 WiX Toolset
- 创建 app-image (包含 EXE)
- 创建 MSI 安装包
- 创建启动脚本和 README
- 流水线成功
验证命令:
where candle.exe
# 应该输出: C:\Program Files (x86)\WiX Toolset v3.11\bin\candle.exe
场景 2: WiX Toolset 未安装
预期行为:
- 检测不到 WiX Toolset
- 显示警告信息
- 跳过 EXE 和 MSI 创建
- 仍然创建启动脚本和 README
- 流水线成功(不失败)
验证输出:
⚠️ 警告: WiX Toolset 未找到,跳过 EXE 打包
提示: 请检查 WiX Toolset 安装路径
当前 WIX_HOME: C:\Program Files (x86)\WiX Toolset v3.11
继续执行,但不创建 EXE 和 MSI
WiX Toolset 安装指南
如果需要创建 EXE 和 MSI
下载 WiX Toolset:
- 访问: https://wixtoolset.org/releases/
- 下载 WiX Toolset v3.11 或更高版本
- 安装到默认路径:
C:\Program Files (x86)\WiX Toolset v3.11
验证安装:
# 检查 candle.exe
where candle.exe
# 检查 light.exe
where light.exe
# 应该输出 WiX 工具的路径
配置环境变量:
# 添加到 PATH
set PATH=%PATH%;C:\Program Files (x86)\WiX Toolset v3.11\bin
# 或在 Jenkinsfile 中配置
WIX_HOME = 'C:\\Program Files (x86)\\WiX Toolset v3.11'
如果不需要 EXE 和 MSI
无需安装 WiX Toolset
GUI 应用仍然可以通过以下方式运行:
- JAR 方式:
java -jar slms-gui.jar - 启动脚本: 双击
run-gui.bat - 模块路径:
java --module-path libs --add-modules javafx.controls,javafx.fxml -jar slms-gui.jar
相关文件
修改的文件
Jenkinsfile- Stage 7.2 GUI 打包阶段
相关文档
docs/FOUR_APPS_TEST_REPORT.md- 四端应用测试报告docs/PIPELINE_TEST_GUIDE.md- 流水线测试指南docs/JENKINS_CONFIGURATION_GUIDE.md- Jenkins 配置指南
最佳实践
批处理脚本错误处理
-
使用 setlocal
@echo off setlocal EnableDelayedExpansion -
捕获命令结果
set RESULT=0 command >nul 2>&1 && set RESULT=1 if !RESULT! EQU 0 ( echo Command failed ) -
确保成功退出
exit /b 0 -
使用 goto 跳过可选步骤
if condition ( goto skip_optional ) REM optional steps :skip_optional REM continue
Jenkins 流水线最佳实践
-
可选功能应该优雅降级
- 不应该因为可选功能失败而导致整个流水线失败
- 显示警告但继续执行
-
提供清晰的错误信息
- 说明什么失败了
- 为什么失败
- 如何修复
-
测试多种场景
- 正常情况
- 工具缺失情况
- 网络问题情况
提交信息
Commit: 63b3d15
Message: fix: Improve WiX Toolset error handling in GUI packaging stage
Date: 2025-11-26
Files Changed: 1 (Jenkinsfile)
Lines Changed: +11 -2
总结
此修复确保了即使 WiX Toolset 未安装,Jenkins 流水线也能正常完成。GUI 应用的 JAR 文件仍然会被创建,用户可以通过 JAR 或启动脚本运行应用。
如果需要 EXE 和 MSI 安装包,只需安装 WiX Toolset 并重新运行流水线即可。
修复状态: ✅ 已完成并推送到 Gitea
测试状态: 待验证
下一步: 在 Jenkins 中触发构建以验证修复