@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" set "BUILD_OUTPUT=%PROJECT_ROOT%build_output" 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\schoolNews\Dockerfile.serv . docker build -t school-news-serv:%IMAGE_VERSION% -f docker\schoolNews\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\schoolNews\Dockerfile.web . docker build -t school-news-web:%IMAGE_VERSION% -f docker\schoolNews\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\schoolNews 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\schoolNews ^&^& docker-compose up -d echo ========================================== echo. pause