You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
7.5 KiB
7.5 KiB
Jenkinsfile 最终修复说明
修复日期: 2025-11-26
提交: e3ee257
状态: ✅ 已完成
修复内容
1. 修改头歌推送分支 ✅
问题: 原来推送到 feature-ldl 分支
需求: 改为推送到 main 分支
修改位置: Stage 9.1 推送源代码
修改前:
stage('9.1 推送源代码到 feature-ldl') {
steps {
echo '========== 推送源代码到头歌 feature-ldl 分支 =========='
...
git push ... HEAD:refs/heads/feature-ldl --force
...
echo '✓ 源代码推送到 feature-ldl 成功'
修改后:
stage('9.1 推送源代码到 main') {
steps {
echo '========== 推送源代码到头歌 main 分支 =========='
...
git push ... HEAD:refs/heads/main --force
...
echo '✓ 源代码推送到 main 成功'
影响:
- ✅ 源代码现在推送到头歌的
main分支 - ✅ 与本地 Gitea 的分支名称保持一致
- ✅ 更符合标准的 Git 工作流
2. 修复 WiX Toolset 检查错误 ✅
问题: where candle.exe 命令失败时导致脚本退出(exit code 255)
根本原因:
where命令找不到文件时返回非零退出码- 即使使用
>nul 2>&1重定向,仍然会导致批处理脚本异常退出 &&操作符在某些情况下不能正确捕获错误
修改位置: Stage 7.2 GUI 打包 - WiX 检查部分
修改前:
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 打包
goto skip_exe
)
修改后:
REM 检查 WiX Toolset 是否安装
set WIX_FOUND=0
if exist "%WIX_HOME%\bin\candle.exe" set WIX_FOUND=1
if !WIX_FOUND! EQU 0 (
echo ⚠️ 警告: WiX Toolset 未找到,跳过 EXE 打包
goto skip_exe
)
关键改进:
- ✅ 使用
if exist检查文件是否存在 - ✅ 不依赖外部命令
where - ✅ 不会因为文件不存在而导致脚本退出
- ✅ 更可靠、更安全的检查方式
为什么 where 命令会失败
问题分析
-
where命令的行为where candle.exe # 如果找到: 返回 0,输出文件路径 # 如果未找到: 返回 1,输出错误信息 -
批处理脚本的错误传播
- 即使使用
>nul 2>&1重定向输出 - 非零退出码仍然会被批处理脚本捕获
- 在某些情况下会导致整个脚本退出
- 即使使用
-
&&操作符的限制where candle.exe >nul 2>&1 && set WIX_FOUND=1 # 理论上应该工作,但在 Jenkins 环境中可能不可靠
解决方案对比
| 方法 | 可靠性 | 说明 |
|---|---|---|
where candle.exe |
❌ 低 | 会导致脚本退出 |
where candle.exe >nul 2>&1 |
❌ 低 | 仍然会传播错误 |
where candle.exe && set VAR=1 |
⚠️ 中 | 在某些环境不可靠 |
if exist "path\candle.exe" |
✅ 高 | 最可靠的方法 |
测试验证
场景 1: WiX Toolset 已安装
文件路径:
C:\Program Files (x86)\WiX Toolset v3.11\bin\candle.exe
预期行为:
✓ jpackage 可用
✓ WiX Toolset 可用
步骤1: 创建 Windows 应用镜像 (app-image)...
✓ EXE 创建成功
步骤2: 创建 Windows MSI 安装包...
✓ MSI 安装包创建成功
验证命令:
if exist "C:\Program Files (x86)\WiX Toolset v3.11\bin\candle.exe" (
echo WiX Toolset 已安装
) else (
echo WiX Toolset 未安装
)
场景 2: WiX Toolset 未安装
预期行为:
✓ jpackage 可用
⚠️ 警告: WiX Toolset 未找到,跳过 EXE 打包
提示: 请检查 WiX Toolset 安装路径
当前 WIX_HOME: C:\Program Files (x86)\WiX Toolset v3.11
继续执行,但不创建 EXE 和 MSI
✓ 已创建 GUI 启动脚本: run-gui.bat
✓ 已创建 README-GUI.txt
✓ GUI JAR + EXE 打包成功
关键点:
- ✅ 不会导致脚本退出
- ✅ 显示清晰的警告信息
- ✅ 继续创建启动脚本和 README
- ✅ 流水线正常完成
批处理脚本最佳实践
1. 文件存在性检查
推荐方式:
if exist "path\to\file.exe" (
echo 文件存在
) else (
echo 文件不存在
)
不推荐:
where file.exe >nul 2>&1
if errorlevel 1 (
echo 文件不存在
)
2. 命令执行检查
推荐方式:
command >nul 2>&1
set RESULT=%ERRORLEVEL%
if %RESULT% NEQ 0 (
echo 命令失败
)
或使用延迟变量:
setlocal EnableDelayedExpansion
command >nul 2>&1
if !ERRORLEVEL! NEQ 0 (
echo 命令失败
)
3. 可选功能的优雅降级
@echo off
setlocal EnableDelayedExpansion
REM 检查可选工具
set TOOL_FOUND=0
if exist "%TOOL_PATH%\tool.exe" set TOOL_FOUND=1
if !TOOL_FOUND! EQU 0 (
echo 警告: 工具未找到,跳过可选功能
goto skip_optional
)
REM 执行可选功能
echo 执行可选功能...
:skip_optional
REM 继续必需功能
echo 继续执行...
REM 确保成功退出
exit /b 0
头歌推送分支说明
分支策略
原策略:
- 源代码 →
feature-ldl分支 - 制品 →
release分支
新策略:
- 源代码 →
main分支 - 制品 →
release分支
优势
-
统一分支名称
- 本地 Gitea:
main - 头歌:
main - 更容易理解和维护
- 本地 Gitea:
-
符合 Git 标准
main是现代 Git 的默认主分支名- 更符合业界标准
-
简化工作流
- 不需要记住不同的分支名
- 减少混淆
提交历史
相关提交
-
63b3d15- 初次修复 WiX 错误处理- 添加
setlocal EnableDelayedExpansion - 添加
exit /b 0 - 改进错误消息
- 添加
-
29fe024- 添加修复文档- 创建
docs/JENKINSFILE_WIX_FIX.md
- 创建
-
e3ee257- 最终修复(本次)- 修改头歌推送分支为
main - 使用
if exist检查 WiX - 彻底解决脚本退出问题
- 修改头歌推送分支为
验证清单
推送到 Gitea ✅
- 代码已提交
- 已推送到
origin main - 提交哈希:
e3ee257
Jenkinsfile 修改 ✅
- 头歌推送分支改为
main - WiX 检查使用
if exist - 添加
@echo off和setlocal - 添加
exit /b 0
测试准备 ✅
- 修复文档已创建
- 准备在 Jenkins 中测试
- 预期两种场景都能正常工作
下一步
1. 在 Jenkins 中测试
触发新的构建,验证:
- ✅ GUI 打包不再因 WiX 检查而失败
- ✅ 源代码推送到头歌
main分支 - ✅ 流水线完整执行成功
2. 验证头歌仓库
访问头歌仓库,确认:
- ✅
main分支有最新代码 - ✅
release分支有最新制品
3. 可选:安装 WiX Toolset
如果需要 EXE 和 MSI:
- 下载 WiX Toolset v3.11
- 安装到默认路径
- 重新运行流水线
总结
本次修复彻底解决了两个问题:
- 头歌推送分支 - 从
feature-ldl改为main,统一分支命名 - WiX 检查错误 - 使用
if exist代替where,避免脚本退出
这些修改使流水线更加健壮和可靠,即使在 WiX Toolset 未安装的情况下也能正常完成。
修复状态: ✅ 完成
推送状态: ✅ 已推送到 Gitea
测试状态: 待在 Jenkins 中验证
文档状态: ✅ 已完成
相关文档:
docs/JENKINSFILE_WIX_FIX.md- 初次修复文档docs/PIPELINE_TEST_GUIDE.md- 流水线测试指南docs/JENKINS_CONFIGURATION_GUIDE.md- Jenkins 配置指南