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

360 lines
7.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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 配置指南