|
|
|
|
@ -28,12 +28,13 @@ pipeline {
|
|
|
|
|
@echo off
|
|
|
|
|
echo 清理工作空间中可能被占用的文件...
|
|
|
|
|
|
|
|
|
|
REM 结束可能占用文件的 Java 进程
|
|
|
|
|
taskkill /F /IM java.exe /T 2>nul
|
|
|
|
|
taskkill /F /IM javaw.exe /T 2>nul
|
|
|
|
|
REM 只结束与当前工作空间相关的 Java 进程
|
|
|
|
|
for /f "tokens=2" %%i in ('tasklist /FI "IMAGENAME eq java.exe" /FO LIST ^| findstr /C:"PID:"') do (
|
|
|
|
|
wmic process where "ProcessId=%%i and CommandLine like '%%SLMS%%'" delete 2>nul
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
REM 等待一下让进程完全结束
|
|
|
|
|
timeout /t 2 /nobreak >nul
|
|
|
|
|
REM 等待进程结束
|
|
|
|
|
timeout /t 1 /nobreak >nul
|
|
|
|
|
|
|
|
|
|
echo ✓ 清理完成
|
|
|
|
|
'''
|
|
|
|
|
@ -201,8 +202,10 @@ pipeline {
|
|
|
|
|
stage('7.2 GUI 打包 (JAR + EXE)') {
|
|
|
|
|
steps {
|
|
|
|
|
echo '========== 打包 GUI 应用 (JAR + EXE) =========='
|
|
|
|
|
dir('SLMS') {
|
|
|
|
|
bat '''
|
|
|
|
|
script {
|
|
|
|
|
dir('SLMS') {
|
|
|
|
|
// 步骤1: Maven 打包 GUI JAR
|
|
|
|
|
bat '''
|
|
|
|
|
set JAVA_HOME=%JAVA_HOME%
|
|
|
|
|
echo 使用 target-gui 打包 GUI 应用...
|
|
|
|
|
|
|
|
|
|
@ -229,7 +232,10 @@ pipeline {
|
|
|
|
|
copy /Y library.db target\\
|
|
|
|
|
echo ✓ 已复制 library.db 到 target 目录
|
|
|
|
|
)
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
// 步骤2: 使用 jpackage 创建 EXE 和 MSI
|
|
|
|
|
bat '''
|
|
|
|
|
REM 使用 jpackage 创建 Windows EXE
|
|
|
|
|
echo.
|
|
|
|
|
echo ========== 使用 jpackage 创建 EXE ==========
|
|
|
|
|
@ -264,8 +270,8 @@ pipeline {
|
|
|
|
|
copy /Y target\\library.db target\\jpackage-input\\
|
|
|
|
|
if exist target-gui\\libs xcopy /E /I /Y /Q target-gui\\libs target\\jpackage-input\\libs >nul
|
|
|
|
|
|
|
|
|
|
REM 使用 jpackage 创建 EXE
|
|
|
|
|
echo 开始创建 Windows EXE...
|
|
|
|
|
REM 步骤1: 创建 app-image (包含 EXE)
|
|
|
|
|
echo 步骤1: 创建 Windows 应用镜像 (app-image)...
|
|
|
|
|
jpackage --type app-image ^
|
|
|
|
|
--input target\\jpackage-input ^
|
|
|
|
|
--name SLMS-GUI ^
|
|
|
|
|
@ -278,7 +284,7 @@ pipeline {
|
|
|
|
|
--win-console
|
|
|
|
|
|
|
|
|
|
if errorlevel 1 (
|
|
|
|
|
echo ⚠️ jpackage 执行失败
|
|
|
|
|
echo ⚠️ app-image 创建失败
|
|
|
|
|
goto skip_exe
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
@ -296,6 +302,37 @@ pipeline {
|
|
|
|
|
echo ✓ 已创建完整应用目录: target\\slms-gui-app
|
|
|
|
|
) else (
|
|
|
|
|
echo ⚠️ 未找到生成的 EXE 文件
|
|
|
|
|
goto skip_exe
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
REM 步骤2: 创建 MSI 安装包
|
|
|
|
|
echo.
|
|
|
|
|
echo 步骤2: 创建 Windows MSI 安装包...
|
|
|
|
|
jpackage --type msi ^
|
|
|
|
|
--input target\\jpackage-input ^
|
|
|
|
|
--name SLMS-GUI ^
|
|
|
|
|
--main-jar slms-gui.jar ^
|
|
|
|
|
--main-class com.smartlibrary.gui.GUIApplication ^
|
|
|
|
|
--dest target ^
|
|
|
|
|
--app-version 1.0 ^
|
|
|
|
|
--vendor "Smart Library" ^
|
|
|
|
|
--description "Smart Library Management System - GUI Application" ^
|
|
|
|
|
--win-console ^
|
|
|
|
|
--win-dir-chooser ^
|
|
|
|
|
--win-menu ^
|
|
|
|
|
--win-shortcut
|
|
|
|
|
|
|
|
|
|
if errorlevel 1 (
|
|
|
|
|
echo ⚠️ MSI 安装包创建失败
|
|
|
|
|
echo 提示: 这不影响 EXE 的使用
|
|
|
|
|
) else (
|
|
|
|
|
if exist target\\SLMS-GUI-1.0.msi (
|
|
|
|
|
echo ✓ MSI 安装包创建成功: target\\SLMS-GUI-1.0.msi
|
|
|
|
|
copy /Y target\\SLMS-GUI-1.0.msi target\\slms-gui-installer.msi
|
|
|
|
|
echo ✓ 已复制为 slms-gui-installer.msi
|
|
|
|
|
) else (
|
|
|
|
|
echo ⚠️ 未找到生成的 MSI 文件
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
:skip_exe
|
|
|
|
|
@ -328,7 +365,8 @@ pipeline {
|
|
|
|
|
echo. >> target\\README-GUI.txt
|
|
|
|
|
echo 注意: library.db 必须与应用文件在同一目录 >> target\\README-GUI.txt
|
|
|
|
|
echo ✓ 已创建 README-GUI.txt
|
|
|
|
|
'''
|
|
|
|
|
'''
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
echo '✓ GUI JAR + EXE 打包成功'
|
|
|
|
|
}
|
|
|
|
|
@ -451,7 +489,8 @@ pipeline {
|
|
|
|
|
echo 检查制品文件...
|
|
|
|
|
if exist SLMS\\target\\slms-cli.jar (echo ✓ 找到 slms-cli.jar) else (echo ✗ 未找到 slms-cli.jar)
|
|
|
|
|
if exist SLMS\\target\\slms-gui.jar (echo ✓ 找到 slms-gui.jar) else (echo ✗ 未找到 slms-gui.jar)
|
|
|
|
|
if exist SLMS\\target\\slms-gui.exe (echo ✓ 找到 slms-gui.exe) else (echo ⚠️ 未找到 slms-gui.exe (可能 jpackage 不可用))
|
|
|
|
|
if exist SLMS\\target\\slms-gui.exe (echo ✓ 找到 slms-gui.exe) else (echo ⚠️ 未找到 slms-gui.exe)
|
|
|
|
|
if exist SLMS\\target\\slms-gui-installer.msi (echo ✓ 找到 slms-gui-installer.msi) else (echo ⚠️ 未找到 MSI 安装包)
|
|
|
|
|
if exist SLMS\\target\\slms-web.war (echo ✓ 找到 slms-web.war) else if exist SLMS\\target\\slms-web.jar (echo ✓ 找到 slms-web.jar) else (echo ✗ 未找到 slms-web.war/jar)
|
|
|
|
|
if exist SLMS\\android\\build\\outputs\\apk\\debug\\slms-debug.apk (echo ✓ 找到 slms-debug.apk) else if exist SLMS\\android\\build\\outputs\\apk\\debug\\SLMS-debug.apk (echo ✓ 找到 SLMS-debug.apk) else (echo ✗ 未找到 APK)
|
|
|
|
|
exit /b 0
|
|
|
|
|
@ -460,7 +499,7 @@ pipeline {
|
|
|
|
|
// 归档制品 - 使用 try-catch 确保即使部分文件缺失也能继续
|
|
|
|
|
try {
|
|
|
|
|
echo '开始归档制品...'
|
|
|
|
|
archiveArtifacts artifacts: 'SLMS/target/*.jar,SLMS/target/*.war,SLMS/target/*.exe,SLMS/target/*.bat,SLMS/target/*.txt,SLMS/target/library.db,SLMS/target/libs/*.jar,SLMS/android/build/outputs/apk/debug/*.apk',
|
|
|
|
|
archiveArtifacts artifacts: 'SLMS/target/slms-*.jar,SLMS/target/slms-*.war,SLMS/target/slms-*.exe,SLMS/target/slms-*.msi,SLMS/target/*.bat,SLMS/target/README-*.txt,SLMS/target/library.db,SLMS/android/build/outputs/apk/debug/slms-debug.apk',
|
|
|
|
|
fingerprint: true,
|
|
|
|
|
allowEmptyArchive: true,
|
|
|
|
|
onlyIfSuccessful: false
|
|
|
|
|
@ -587,6 +626,12 @@ pipeline {
|
|
|
|
|
) else (
|
|
|
|
|
echo ⚠️ 警告: 找不到 slms-gui.exe
|
|
|
|
|
)
|
|
|
|
|
if exist target\\slms-gui-installer.msi (
|
|
|
|
|
copy /Y target\\slms-gui-installer.msi artifacts\\
|
|
|
|
|
echo ✓ 已复制 slms-gui-installer.msi
|
|
|
|
|
) else (
|
|
|
|
|
echo ⚠️ 警告: 找不到 slms-gui-installer.msi
|
|
|
|
|
)
|
|
|
|
|
if exist target\\run-gui.bat (
|
|
|
|
|
copy /Y target\\run-gui.bat artifacts\\
|
|
|
|
|
echo ✓ 已复制 run-gui.bat
|
|
|
|
|
@ -595,55 +640,74 @@ pipeline {
|
|
|
|
|
copy /Y target\\README-GUI.txt artifacts\\
|
|
|
|
|
echo ✓ 已复制 README-GUI.txt
|
|
|
|
|
)
|
|
|
|
|
REM 复制 libs 目录(如果存在)
|
|
|
|
|
if exist target\\libs (
|
|
|
|
|
xcopy /E /I /Y /Q target\\libs artifacts\\libs >nul 2>&1
|
|
|
|
|
echo ✓ 已复制 libs 目录
|
|
|
|
|
)
|
|
|
|
|
REM 不复制 libs 目录,减少仓库大小
|
|
|
|
|
REM if exist target\\libs (
|
|
|
|
|
REM xcopy /E /I /Y /Q target\\libs artifacts\\libs >nul 2>&1
|
|
|
|
|
REM echo ✓ 已复制 libs 目录
|
|
|
|
|
REM )
|
|
|
|
|
|
|
|
|
|
REM 显示复制的文件
|
|
|
|
|
echo.
|
|
|
|
|
echo 制品列表:
|
|
|
|
|
dir artifacts
|
|
|
|
|
|
|
|
|
|
REM 返回上级目录
|
|
|
|
|
REM 创建临时目录用于 release 分支
|
|
|
|
|
cd ..
|
|
|
|
|
set RELEASE_DIR=%TEMP%\\slms-release-%BUILD_NUMBER%
|
|
|
|
|
if exist "%RELEASE_DIR%" rmdir /S /Q "%RELEASE_DIR%"
|
|
|
|
|
mkdir "%RELEASE_DIR%"
|
|
|
|
|
|
|
|
|
|
REM 复制制品到临时目录
|
|
|
|
|
echo 准备 release 分支内容...
|
|
|
|
|
xcopy /E /I /Y /Q SLMS\\artifacts "%RELEASE_DIR%\\artifacts" >nul
|
|
|
|
|
|
|
|
|
|
REM 配置远程仓库
|
|
|
|
|
git remote add educoder https://bdgit.educoder.net/pu6zrsfoy/CHZU_CS231_SEB_lab.git 2>nul || git remote set-url educoder https://bdgit.educoder.net/pu6zrsfoy/CHZU_CS231_SEB_lab.git
|
|
|
|
|
REM 创建 README 文件
|
|
|
|
|
echo SLMS 项目构建制品 > "%RELEASE_DIR%\\README.md"
|
|
|
|
|
echo. >> "%RELEASE_DIR%\\README.md"
|
|
|
|
|
echo 构建编号: #%BUILD_NUMBER% >> "%RELEASE_DIR%\\README.md"
|
|
|
|
|
echo 构建时间: %DATE% %TIME% >> "%RELEASE_DIR%\\README.md"
|
|
|
|
|
echo. >> "%RELEASE_DIR%\\README.md"
|
|
|
|
|
echo ## 制品列表 >> "%RELEASE_DIR%\\README.md"
|
|
|
|
|
echo. >> "%RELEASE_DIR%\\README.md"
|
|
|
|
|
echo - slms-cli.jar - CLI 命令行应用 >> "%RELEASE_DIR%\\README.md"
|
|
|
|
|
echo - slms-gui.jar - GUI 桌面应用 (JAR) >> "%RELEASE_DIR%\\README.md"
|
|
|
|
|
echo - slms-gui.exe - GUI 桌面应用 (EXE) >> "%RELEASE_DIR%\\README.md"
|
|
|
|
|
echo - slms-gui-installer.msi - GUI 安装包 (MSI) >> "%RELEASE_DIR%\\README.md"
|
|
|
|
|
echo - slms-web.war - Web 应用 >> "%RELEASE_DIR%\\README.md"
|
|
|
|
|
echo - slms-debug.apk - Android 应用 >> "%RELEASE_DIR%\\README.md"
|
|
|
|
|
echo - library.db - 数据库文件 >> "%RELEASE_DIR%\\README.md"
|
|
|
|
|
echo. >> "%RELEASE_DIR%\\README.md"
|
|
|
|
|
echo ## 使用说明 >> "%RELEASE_DIR%\\README.md"
|
|
|
|
|
echo. >> "%RELEASE_DIR%\\README.md"
|
|
|
|
|
echo 详细使用说明请参考各应用的 README 文件。 >> "%RELEASE_DIR%\\README.md"
|
|
|
|
|
|
|
|
|
|
REM 获取远程 release 分支
|
|
|
|
|
echo 获取远程 release 分支...
|
|
|
|
|
git fetch https://%USER_ENC%:%PASS_ENC%@bdgit.educoder.net/pu6zrsfoy/CHZU_CS231_SEB_lab.git release 2>nul
|
|
|
|
|
REM 进入临时目录
|
|
|
|
|
cd "%RELEASE_DIR%"
|
|
|
|
|
|
|
|
|
|
REM 切换到 release 分支(如果不存在则创建)
|
|
|
|
|
git checkout release 2>nul || git checkout -b release origin/release 2>nul || git checkout -b release
|
|
|
|
|
REM 初始化 Git 仓库
|
|
|
|
|
git init
|
|
|
|
|
git config user.name "Jenkins CI"
|
|
|
|
|
git config user.email "ldl@chzu.edu.cn"
|
|
|
|
|
|
|
|
|
|
REM 添加制品到 Git
|
|
|
|
|
git add SLMS/artifacts/
|
|
|
|
|
REM 添加所有文件
|
|
|
|
|
git add .
|
|
|
|
|
git commit -m "release: 构建制品 Build #%BUILD_NUMBER%"
|
|
|
|
|
|
|
|
|
|
REM 检查是否有变更
|
|
|
|
|
git diff --cached --quiet
|
|
|
|
|
if errorlevel 1 (
|
|
|
|
|
echo 发现制品变更,准备提交...
|
|
|
|
|
git commit -m "chore: 发布构建制品 Build #%BUILD_NUMBER%"
|
|
|
|
|
echo ✓ 制品已提交到本地仓库
|
|
|
|
|
) else (
|
|
|
|
|
echo 没有新的制品需要提交
|
|
|
|
|
)
|
|
|
|
|
REM 推送到 release 分支(强制覆盖,因为只包含制品)
|
|
|
|
|
echo 推送制品到头歌 release 分支(仅制品,无源码)...
|
|
|
|
|
git push https://%USER_ENC%:%PASS_ENC%@bdgit.educoder.net/pu6zrsfoy/CHZU_CS231_SEB_lab.git HEAD:refs/heads/release --force
|
|
|
|
|
|
|
|
|
|
REM 推送到 release 分支
|
|
|
|
|
echo 推送制品到头歌 release 分支...
|
|
|
|
|
git push https://%USER_ENC%:%PASS_ENC%@bdgit.educoder.net/pu6zrsfoy/CHZU_CS231_SEB_lab.git release:release
|
|
|
|
|
if errorlevel 1 (
|
|
|
|
|
echo ⚠️ 推送失败,尝试强制推送...
|
|
|
|
|
git push https://%USER_ENC%:%PASS_ENC%@bdgit.educoder.net/pu6zrsfoy/CHZU_CS231_SEB_lab.git release:release --force
|
|
|
|
|
if errorlevel 1 (
|
|
|
|
|
echo ✗ 强制推送也失败!
|
|
|
|
|
exit /b 1
|
|
|
|
|
)
|
|
|
|
|
echo ✗ 推送失败!
|
|
|
|
|
exit /b 1
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
echo ✓ 推送成功!
|
|
|
|
|
|
|
|
|
|
REM 清理临时目录
|
|
|
|
|
cd %WORKSPACE%
|
|
|
|
|
rmdir /S /Q "%RELEASE_DIR%" 2>nul
|
|
|
|
|
echo ✓ 已清理临时目录
|
|
|
|
|
'''
|
|
|
|
|
}
|
|
|
|
|
echo '✓ 制品推送到 release 分支成功'
|
|
|
|
|
@ -666,6 +730,21 @@ pipeline {
|
|
|
|
|
echo "当前构建结果: ${currentBuild.result}"
|
|
|
|
|
echo "当前构建状态: ${currentBuild.currentResult}"
|
|
|
|
|
|
|
|
|
|
// 清理残留的 Java 进程
|
|
|
|
|
echo '========== 清理残留进程 =========='
|
|
|
|
|
try {
|
|
|
|
|
bat '''
|
|
|
|
|
@echo off
|
|
|
|
|
echo 清理与 SLMS 相关的残留进程...
|
|
|
|
|
for /f "tokens=2" %%i in ('tasklist /FI "IMAGENAME eq java.exe" /FO LIST ^| findstr /C:"PID:"') do (
|
|
|
|
|
wmic process where "ProcessId=%%i and CommandLine like '%%SLMS%%'" delete 2>nul
|
|
|
|
|
)
|
|
|
|
|
echo ✓ 进程清理完成
|
|
|
|
|
'''
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
echo "⚠️ 清理进程时出错: ${e.message}"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查制品是否存在
|
|
|
|
|
echo '========== 检查制品文件 =========='
|
|
|
|
|
try {
|
|
|
|
|
|