2025-11-24 11:50:15 +08:00
|
|
|
|
@echo off
|
|
|
|
|
|
chcp 65001 >nul
|
|
|
|
|
|
REM ========================================
|
|
|
|
|
|
REM 校园新闻管理系统 - 构建和打包脚本 (Windows)
|
|
|
|
|
|
REM 功能:
|
|
|
|
|
|
REM 1. 从git拉取最新代码
|
|
|
|
|
|
REM 2. 编译后端jar包
|
|
|
|
|
|
REM 3. 构建前端dist
|
|
|
|
|
|
REM 4. 制作Docker镜像
|
|
|
|
|
|
REM 5. 保存镜像到文件(用于离线部署)
|
|
|
|
|
|
REM ========================================
|
|
|
|
|
|
|
|
|
|
|
|
setlocal enabledelayedexpansion
|
|
|
|
|
|
|
|
|
|
|
|
REM 颜色定义
|
|
|
|
|
|
set "INFO=[92m[INFO][0m"
|
|
|
|
|
|
set "WARN=[93m[WARN][0m"
|
|
|
|
|
|
set "ERROR=[91m[ERROR][0m"
|
|
|
|
|
|
set "STEP=[94m[STEP][0m"
|
|
|
|
|
|
|
|
|
|
|
|
REM 项目路径
|
|
|
|
|
|
set "PROJECT_ROOT=%~dp0"
|
|
|
|
|
|
set "SERV_PATH=%PROJECT_ROOT%schoolNewsServ"
|
|
|
|
|
|
set "WEB_PATH=%PROJECT_ROOT%schoolNewsWeb"
|
|
|
|
|
|
set "DOCKER_PATH=%PROJECT_ROOT%docker"
|
2025-11-24 14:01:17 +08:00
|
|
|
|
set "BUILD_OUTPUT=%PROJECT_ROOT%build_output"
|
2025-11-24 11:50:15 +08:00
|
|
|
|
|
|
|
|
|
|
REM 生成版本号
|
|
|
|
|
|
for /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c%%a%%b)
|
|
|
|
|
|
for /f "tokens=1-2 delims=/: " %%a in ('time /t') do (set mytime=%%a%%b)
|
|
|
|
|
|
set "IMAGE_VERSION=%mydate%_%mytime%"
|
|
|
|
|
|
|
|
|
|
|
|
echo ==========================================
|
|
|
|
|
|
echo 校园新闻管理系统 - 构建脚本
|
|
|
|
|
|
echo ==========================================
|
|
|
|
|
|
echo %INFO% 构建版本: %IMAGE_VERSION%
|
|
|
|
|
|
echo %INFO% 项目路径: %PROJECT_ROOT%
|
|
|
|
|
|
echo ==========================================
|
|
|
|
|
|
echo.
|
|
|
|
|
|
|
|
|
|
|
|
REM 创建输出目录
|
|
|
|
|
|
if not exist "%BUILD_OUTPUT%" mkdir "%BUILD_OUTPUT%"
|
|
|
|
|
|
|
|
|
|
|
|
REM ================================================
|
|
|
|
|
|
REM 步骤1: Git Pull
|
|
|
|
|
|
REM ================================================
|
|
|
|
|
|
echo %STEP% 步骤1: 拉取最新代码
|
|
|
|
|
|
cd "%PROJECT_ROOT%"
|
|
|
|
|
|
|
|
|
|
|
|
REM 检查git状态
|
|
|
|
|
|
git status --short >nul 2>&1
|
|
|
|
|
|
if %errorlevel% neq 0 (
|
|
|
|
|
|
echo %WARN% 未检测到git仓库,跳过代码拉取
|
|
|
|
|
|
goto build_backend
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
echo %INFO% 从远程仓库拉取代码...
|
|
|
|
|
|
git pull origin main 2>nul
|
|
|
|
|
|
if errorlevel 1 (
|
|
|
|
|
|
git pull origin master 2>nul
|
|
|
|
|
|
if errorlevel 1 (
|
|
|
|
|
|
echo %WARN% 代码拉取失败或已是最新版本,继续构建...
|
|
|
|
|
|
) else (
|
|
|
|
|
|
echo %INFO% 代码拉取完成
|
|
|
|
|
|
)
|
|
|
|
|
|
) else (
|
|
|
|
|
|
echo %INFO% 代码拉取完成
|
|
|
|
|
|
)
|
|
|
|
|
|
echo.
|
|
|
|
|
|
|
|
|
|
|
|
REM ================================================
|
|
|
|
|
|
REM 步骤2: 构建后端jar包
|
|
|
|
|
|
REM ================================================
|
|
|
|
|
|
:build_backend
|
|
|
|
|
|
echo %STEP% 步骤2: 构建后端jar包
|
|
|
|
|
|
cd "%SERV_PATH%"
|
|
|
|
|
|
|
|
|
|
|
|
echo %INFO% 清理旧的构建...
|
|
|
|
|
|
call mvn clean -q
|
|
|
|
|
|
|
|
|
|
|
|
echo %INFO% 开始编译后端项目...
|
|
|
|
|
|
echo %INFO% 执行: mvn package -DskipTests -pl admin -am
|
|
|
|
|
|
call mvn package -DskipTests -pl admin -am
|
|
|
|
|
|
if errorlevel 1 (
|
|
|
|
|
|
echo %ERROR% 后端编译失败
|
|
|
|
|
|
pause
|
|
|
|
|
|
exit /b 1
|
|
|
|
|
|
)
|
|
|
|
|
|
echo %INFO% 后端编译成功
|
|
|
|
|
|
|
|
|
|
|
|
REM 验证jar包
|
|
|
|
|
|
set "JAR_FILE=%SERV_PATH%\admin\target\admin-1.0.0.jar"
|
|
|
|
|
|
if exist "%JAR_FILE%" (
|
|
|
|
|
|
for %%F in ("%JAR_FILE%") do set "JAR_SIZE=%%~zF"
|
|
|
|
|
|
set /a "JAR_SIZE_MB=!JAR_SIZE! / 1048576"
|
|
|
|
|
|
echo %INFO% ✅ jar包已生成: !JAR_SIZE_MB!MB
|
|
|
|
|
|
echo %INFO% 路径: %JAR_FILE%
|
|
|
|
|
|
) else (
|
|
|
|
|
|
echo %ERROR% ❌ jar包未找到
|
|
|
|
|
|
pause
|
|
|
|
|
|
exit /b 1
|
|
|
|
|
|
)
|
|
|
|
|
|
echo.
|
|
|
|
|
|
|
|
|
|
|
|
REM ================================================
|
|
|
|
|
|
REM 步骤3: 构建前端dist
|
|
|
|
|
|
REM ================================================
|
|
|
|
|
|
echo %STEP% 步骤3: 构建前端项目
|
|
|
|
|
|
cd "%WEB_PATH%"
|
|
|
|
|
|
|
|
|
|
|
|
REM 检查node_modules
|
|
|
|
|
|
if not exist "node_modules" (
|
|
|
|
|
|
echo %INFO% 安装前端依赖...
|
|
|
|
|
|
call npm install
|
|
|
|
|
|
if errorlevel 1 (
|
|
|
|
|
|
echo %ERROR% 依赖安装失败
|
|
|
|
|
|
pause
|
|
|
|
|
|
exit /b 1
|
|
|
|
|
|
)
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
echo %INFO% 清理旧的构建...
|
|
|
|
|
|
if exist "dist" rd /s /q "dist"
|
|
|
|
|
|
|
|
|
|
|
|
echo %INFO% 开始构建前端项目...
|
|
|
|
|
|
echo %INFO% 执行: npm run build
|
|
|
|
|
|
call npm run build
|
|
|
|
|
|
if errorlevel 1 (
|
|
|
|
|
|
echo %ERROR% 前端构建失败
|
|
|
|
|
|
pause
|
|
|
|
|
|
exit /b 1
|
|
|
|
|
|
)
|
|
|
|
|
|
echo %INFO% 前端构建成功
|
|
|
|
|
|
|
|
|
|
|
|
REM 验证dist目录
|
|
|
|
|
|
set "DIST_DIR=%WEB_PATH%\dist"
|
|
|
|
|
|
if exist "%DIST_DIR%" (
|
|
|
|
|
|
for /f %%A in ('dir /s /b "%DIST_DIR%\*" ^| find /c /v ""') do set "FILE_COUNT=%%A"
|
|
|
|
|
|
echo %INFO% ✅ dist目录已生成 (!FILE_COUNT!个文件)
|
|
|
|
|
|
echo %INFO% 路径: %DIST_DIR%
|
|
|
|
|
|
) else (
|
|
|
|
|
|
echo %ERROR% ❌ dist目录未找到
|
|
|
|
|
|
pause
|
|
|
|
|
|
exit /b 1
|
|
|
|
|
|
)
|
|
|
|
|
|
echo.
|
|
|
|
|
|
|
|
|
|
|
|
REM ================================================
|
|
|
|
|
|
REM 步骤4: 制作Docker镜像
|
|
|
|
|
|
REM ================================================
|
|
|
|
|
|
echo %STEP% 步骤4: 制作Docker镜像
|
|
|
|
|
|
cd "%PROJECT_ROOT%"
|
|
|
|
|
|
|
|
|
|
|
|
REM 构建后端镜像
|
|
|
|
|
|
echo %INFO% 构建后端镜像...
|
|
|
|
|
|
echo %INFO% 执行: docker build -t school-news-serv:%IMAGE_VERSION% -f docker\Dockerfile.serv .
|
|
|
|
|
|
docker build -t school-news-serv:%IMAGE_VERSION% -f docker\Dockerfile.serv .
|
|
|
|
|
|
if errorlevel 1 (
|
|
|
|
|
|
echo %ERROR% ❌ 后端镜像构建失败
|
|
|
|
|
|
pause
|
|
|
|
|
|
exit /b 1
|
|
|
|
|
|
)
|
|
|
|
|
|
echo %INFO% ✅ 后端镜像构建成功
|
|
|
|
|
|
|
|
|
|
|
|
REM 打latest标签
|
|
|
|
|
|
docker tag school-news-serv:%IMAGE_VERSION% school-news-serv:latest
|
|
|
|
|
|
echo %INFO% 镜像标签: school-news-serv:%IMAGE_VERSION%
|
|
|
|
|
|
echo %INFO% 镜像标签: school-news-serv:latest
|
|
|
|
|
|
echo.
|
|
|
|
|
|
|
|
|
|
|
|
REM 构建前端镜像
|
|
|
|
|
|
echo %INFO% 构建前端镜像...
|
|
|
|
|
|
echo %INFO% 执行: docker build -t school-news-web:%IMAGE_VERSION% -f docker\Dockerfile.web .
|
|
|
|
|
|
docker build -t school-news-web:%IMAGE_VERSION% -f docker\Dockerfile.web .
|
|
|
|
|
|
if errorlevel 1 (
|
|
|
|
|
|
echo %ERROR% ❌ 前端镜像构建失败
|
|
|
|
|
|
pause
|
|
|
|
|
|
exit /b 1
|
|
|
|
|
|
)
|
|
|
|
|
|
echo %INFO% ✅ 前端镜像构建成功
|
|
|
|
|
|
|
|
|
|
|
|
REM 打latest标签
|
|
|
|
|
|
docker tag school-news-web:%IMAGE_VERSION% school-news-web:latest
|
|
|
|
|
|
echo %INFO% 镜像标签: school-news-web:%IMAGE_VERSION%
|
|
|
|
|
|
echo %INFO% 镜像标签: school-news-web:latest
|
|
|
|
|
|
echo.
|
|
|
|
|
|
|
|
|
|
|
|
REM 查看镜像信息
|
|
|
|
|
|
echo %INFO% Docker镜像列表:
|
|
|
|
|
|
docker images | findstr "school-news"
|
|
|
|
|
|
echo.
|
|
|
|
|
|
|
|
|
|
|
|
REM ================================================
|
|
|
|
|
|
REM 步骤5: 保存镜像到文件
|
|
|
|
|
|
REM ================================================
|
|
|
|
|
|
echo %STEP% 步骤5: 保存Docker镜像
|
|
|
|
|
|
cd "%BUILD_OUTPUT%"
|
|
|
|
|
|
|
|
|
|
|
|
REM 保存后端镜像
|
|
|
|
|
|
set "SERV_IMAGE_FILE=school-news-serv_%IMAGE_VERSION%.tar"
|
|
|
|
|
|
echo %INFO% 保存后端镜像到文件...
|
|
|
|
|
|
echo %INFO% 执行: docker save -o %SERV_IMAGE_FILE% school-news-serv:%IMAGE_VERSION%
|
|
|
|
|
|
docker save -o "%SERV_IMAGE_FILE%" school-news-serv:%IMAGE_VERSION%
|
|
|
|
|
|
if errorlevel 1 (
|
|
|
|
|
|
echo %ERROR% ❌ 后端镜像保存失败
|
|
|
|
|
|
pause
|
|
|
|
|
|
exit /b 1
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
for %%F in ("%SERV_IMAGE_FILE%") do set "SERV_SIZE=%%~zF"
|
|
|
|
|
|
set /a "SERV_SIZE_MB=!SERV_SIZE! / 1048576"
|
|
|
|
|
|
echo %INFO% ✅ 后端镜像已保存: !SERV_SIZE_MB!MB
|
|
|
|
|
|
echo %INFO% 文件: %BUILD_OUTPUT%\%SERV_IMAGE_FILE%
|
|
|
|
|
|
echo.
|
|
|
|
|
|
|
|
|
|
|
|
REM 保存前端镜像
|
|
|
|
|
|
set "WEB_IMAGE_FILE=school-news-web_%IMAGE_VERSION%.tar"
|
|
|
|
|
|
echo %INFO% 保存前端镜像到文件...
|
|
|
|
|
|
echo %INFO% 执行: docker save -o %WEB_IMAGE_FILE% school-news-web:%IMAGE_VERSION%
|
|
|
|
|
|
docker save -o "%WEB_IMAGE_FILE%" school-news-web:%IMAGE_VERSION%
|
|
|
|
|
|
if errorlevel 1 (
|
|
|
|
|
|
echo %ERROR% ❌ 前端镜像保存失败
|
|
|
|
|
|
pause
|
|
|
|
|
|
exit /b 1
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
for %%F in ("%WEB_IMAGE_FILE%") do set "WEB_SIZE=%%~zF"
|
|
|
|
|
|
set /a "WEB_SIZE_MB=!WEB_SIZE! / 1048576"
|
|
|
|
|
|
echo %INFO% ✅ 前端镜像已保存: !WEB_SIZE_MB!MB
|
|
|
|
|
|
echo %INFO% 文件: %BUILD_OUTPUT%\%WEB_IMAGE_FILE%
|
|
|
|
|
|
echo.
|
|
|
|
|
|
|
|
|
|
|
|
REM ================================================
|
|
|
|
|
|
REM 生成部署说明文件
|
|
|
|
|
|
REM ================================================
|
|
|
|
|
|
echo %INFO% 生成部署说明文件...
|
|
|
|
|
|
set "DEPLOY_INFO_FILE=%BUILD_OUTPUT%\部署说明_%IMAGE_VERSION%.txt"
|
|
|
|
|
|
|
|
|
|
|
|
(
|
|
|
|
|
|
echo ========================================
|
|
|
|
|
|
echo 校园新闻管理系统 - Docker镜像部署说明
|
|
|
|
|
|
echo ========================================
|
|
|
|
|
|
echo.
|
|
|
|
|
|
echo 构建信息:
|
|
|
|
|
|
echo 构建时间: %date% %time%
|
|
|
|
|
|
echo 版本号: %IMAGE_VERSION%
|
|
|
|
|
|
echo 构建主机: %COMPUTERNAME%
|
|
|
|
|
|
echo.
|
|
|
|
|
|
echo 镜像文件:
|
|
|
|
|
|
echo 后端镜像: %SERV_IMAGE_FILE% ^(!SERV_SIZE_MB!MB^)
|
|
|
|
|
|
echo 前端镜像: %WEB_IMAGE_FILE% ^(!WEB_SIZE_MB!MB^)
|
|
|
|
|
|
echo.
|
|
|
|
|
|
echo ========================================
|
|
|
|
|
|
echo 部署步骤:
|
|
|
|
|
|
echo ========================================
|
|
|
|
|
|
echo.
|
|
|
|
|
|
echo 1. 将镜像文件传输到目标服务器
|
|
|
|
|
|
echo.
|
|
|
|
|
|
echo 2. 加载Docker镜像:
|
|
|
|
|
|
echo docker load -i %SERV_IMAGE_FILE%
|
|
|
|
|
|
echo docker load -i %WEB_IMAGE_FILE%
|
|
|
|
|
|
echo.
|
|
|
|
|
|
echo 3. 验证镜像:
|
|
|
|
|
|
echo docker images ^| findstr school-news
|
|
|
|
|
|
echo.
|
|
|
|
|
|
echo 4. 启动服务:
|
|
|
|
|
|
echo cd docker
|
|
|
|
|
|
echo docker-compose up -d
|
|
|
|
|
|
echo.
|
|
|
|
|
|
echo 5. 查看服务状态:
|
|
|
|
|
|
echo docker-compose ps
|
|
|
|
|
|
echo docker-compose logs -f
|
|
|
|
|
|
echo.
|
|
|
|
|
|
echo ========================================
|
|
|
|
|
|
echo 访问地址:
|
|
|
|
|
|
echo ========================================
|
|
|
|
|
|
echo 前端: http://localhost:8080/schoolNewsWeb/
|
|
|
|
|
|
echo 后端: http://localhost:8081/schoolNewsServ
|
|
|
|
|
|
echo.
|
|
|
|
|
|
echo ========================================
|
|
|
|
|
|
echo 注意事项:
|
|
|
|
|
|
echo ========================================
|
|
|
|
|
|
echo 1. 确保目标服务器已安装Docker和Docker Compose
|
|
|
|
|
|
echo 2. 确保端口8080、8081、3306、6379未被占用
|
|
|
|
|
|
echo 3. 首次部署需要准备数据库初始化脚本
|
|
|
|
|
|
echo 4. 生产环境请修改默认密码(.env文件)
|
|
|
|
|
|
echo.
|
|
|
|
|
|
echo ========================================
|
|
|
|
|
|
) > "%DEPLOY_INFO_FILE%"
|
|
|
|
|
|
|
|
|
|
|
|
echo %INFO% ✅ 部署说明已生成: %DEPLOY_INFO_FILE%
|
|
|
|
|
|
echo.
|
|
|
|
|
|
|
|
|
|
|
|
REM ================================================
|
|
|
|
|
|
REM 构建摘要
|
|
|
|
|
|
REM ================================================
|
|
|
|
|
|
echo ==========================================
|
|
|
|
|
|
echo 构建完成!
|
|
|
|
|
|
echo ==========================================
|
|
|
|
|
|
echo %INFO% 构建版本: %IMAGE_VERSION%
|
|
|
|
|
|
echo.
|
|
|
|
|
|
echo %INFO% Docker镜像:
|
|
|
|
|
|
echo - school-news-serv:%IMAGE_VERSION%
|
|
|
|
|
|
echo - school-news-web:%IMAGE_VERSION%
|
|
|
|
|
|
echo.
|
|
|
|
|
|
echo %INFO% 镜像文件保存在: %BUILD_OUTPUT%\
|
|
|
|
|
|
dir /b "%BUILD_OUTPUT%\*.tar" "%BUILD_OUTPUT%\*.txt" 2>nul
|
|
|
|
|
|
echo.
|
|
|
|
|
|
echo %INFO% 下一步操作:
|
|
|
|
|
|
echo 1. 查看部署说明: %DEPLOY_INFO_FILE%
|
|
|
|
|
|
echo 2. 传输镜像文件到目标服务器
|
|
|
|
|
|
echo 3. 在目标服务器加载镜像: docker load -i ^<镜像文件^>
|
|
|
|
|
|
echo 4. 启动服务: cd docker ^&^& docker-compose up -d
|
|
|
|
|
|
echo ==========================================
|
|
|
|
|
|
echo.
|
|
|
|
|
|
|
|
|
|
|
|
pause
|