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.
slms/docs/JENKINSFILE_FINAL_FIX.md

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 命令会失败

问题分析

  1. where 命令的行为

    where candle.exe
    # 如果找到: 返回 0输出文件路径
    # 如果未找到: 返回 1输出错误信息
    
  2. 批处理脚本的错误传播

    • 即使使用 >nul 2>&1 重定向输出
    • 非零退出码仍然会被批处理脚本捕获
    • 在某些情况下会导致整个脚本退出
  3. && 操作符的限制

    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 分支

优势

  1. 统一分支名称

    • 本地 Gitea: main
    • 头歌: main
    • 更容易理解和维护
  2. 符合 Git 标准

    • main 是现代 Git 的默认主分支名
    • 更符合业界标准
  3. 简化工作流

    • 不需要记住不同的分支名
    • 减少混淆

提交历史

相关提交

  1. 63b3d15 - 初次修复 WiX 错误处理

    • 添加 setlocal EnableDelayedExpansion
    • 添加 exit /b 0
    • 改进错误消息
  2. 29fe024 - 添加修复文档

    • 创建 docs/JENKINSFILE_WIX_FIX.md
  3. e3ee257 - 最终修复(本次)

    • 修改头歌推送分支为 main
    • 使用 if exist 检查 WiX
    • 彻底解决脚本退出问题

验证清单

推送到 Gitea

  • 代码已提交
  • 已推送到 origin main
  • 提交哈希: e3ee257

Jenkinsfile 修改

  • 头歌推送分支改为 main
  • WiX 检查使用 if exist
  • 添加 @echo offsetlocal
  • 添加 exit /b 0

测试准备

  • 修复文档已创建
  • 准备在 Jenkins 中测试
  • 预期两种场景都能正常工作

下一步

1. 在 Jenkins 中测试

触发新的构建,验证:

  • GUI 打包不再因 WiX 检查而失败
  • 源代码推送到头歌 main 分支
  • 流水线完整执行成功

2. 验证头歌仓库

访问头歌仓库,确认:

  • main 分支有最新代码
  • release 分支有最新制品

3. 可选:安装 WiX Toolset

如果需要 EXE 和 MSI:

  1. 下载 WiX Toolset v3.11
  2. 安装到默认路径
  3. 重新运行流水线

总结

本次修复彻底解决了两个问题:

  1. 头歌推送分支 - 从 feature-ldl 改为 main,统一分支命名
  2. WiX 检查错误 - 使用 if exist 代替 where,避免脚本退出

这些修改使流水线更加健壮和可靠,即使在 WiX Toolset 未安装的情况下也能正常完成。


修复状态: 完成
推送状态: 已推送到 Gitea
测试状态: 待在 Jenkins 中验证
文档状态: 已完成


相关文档:

  • docs/JENKINSFILE_WIX_FIX.md - 初次修复文档
  • docs/PIPELINE_TEST_GUIDE.md - 流水线测试指南
  • docs/JENKINS_CONFIGURATION_GUIDE.md - Jenkins 配置指南