docs: Add final fix documentation for Jenkinsfile

main
Jenkins CI 5 months ago
parent e3ee257185
commit a6e64c1115

@ -0,0 +1,359 @@
# Jenkinsfile 最终修复说明
**修复日期:** 2025-11-26
**提交:** e3ee257
**状态:** ✅ 已完成
---
## 修复内容
### 1. 修改头歌推送分支 ✅
**问题:** 原来推送到 `feature-ldl` 分支
**需求:** 改为推送到 `main` 分支
**修改位置:** Stage 9.1 推送源代码
**修改前:**
```groovy
stage('9.1 推送源代码到 feature-ldl') {
steps {
echo '========== 推送源代码到头歌 feature-ldl 分支 =========='
...
git push ... HEAD:refs/heads/feature-ldl --force
...
echo '✓ 源代码推送到 feature-ldl 成功'
```
**修改后:**
```groovy
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 检查部分
**修改前:**
```batch
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
)
```
**修改后:**
```batch
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` 命令的行为**
```batch
where candle.exe
# 如果找到: 返回 0输出文件路径
# 如果未找到: 返回 1输出错误信息
```
2. **批处理脚本的错误传播**
- 即使使用 `>nul 2>&1` 重定向输出
- 非零退出码仍然会被批处理脚本捕获
- 在某些情况下会导致整个脚本退出
3. **`&&` 操作符的限制**
```batch
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 安装包创建成功
```
**验证命令:**
```batch
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. 文件存在性检查
**推荐方式:**
```batch
if exist "path\to\file.exe" (
echo 文件存在
) else (
echo 文件不存在
)
```
**不推荐:**
```batch
where file.exe >nul 2>&1
if errorlevel 1 (
echo 文件不存在
)
```
### 2. 命令执行检查
**推荐方式:**
```batch
command >nul 2>&1
set RESULT=%ERRORLEVEL%
if %RESULT% NEQ 0 (
echo 命令失败
)
```
**或使用延迟变量:**
```batch
setlocal EnableDelayedExpansion
command >nul 2>&1
if !ERRORLEVEL! NEQ 0 (
echo 命令失败
)
```
### 3. 可选功能的优雅降级
```batch
@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 ✅
- [x] 代码已提交
- [x] 已推送到 `origin main`
- [x] 提交哈希: e3ee257
### Jenkinsfile 修改 ✅
- [x] 头歌推送分支改为 `main`
- [x] WiX 检查使用 `if exist`
- [x] 添加 `@echo off``setlocal`
- [x] 添加 `exit /b 0`
### 测试准备 ✅
- [x] 修复文档已创建
- [x] 准备在 Jenkins 中测试
- [x] 预期两种场景都能正常工作
---
## 下一步
### 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 配置指南
Loading…
Cancel
Save