#!/bin/bash # QAUP 程序更新打包脚本 # 用于生成仅包含jar文件的更新包 set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' BLUE='\033[0;34m' NC='\033[0m' print_message() { echo -e "${1}${2}${NC}" } print_message $BLUE "=== QAUP 程序更新打包 ===" # 1. 构建应用 print_message $BLUE "构建应用..." cd "$PROJECT_ROOT" mvn clean package -DskipTests -q # 检查jar文件是否生成成功 JAR_FILE="$PROJECT_ROOT/qaup-admin/target/qaup-admin.jar" if [ ! -f "$JAR_FILE" ]; then print_message $RED "❌ jar文件构建失败" exit 1 fi # 2. 创建更新包目录 UPDATE_DIR="qaup-update-$(date +%Y%m%d-%H%M%S)" mkdir -p "$UPDATE_DIR" # 3. 复制jar文件 print_message $BLUE "准备更新文件..." cp "$JAR_FILE" "$UPDATE_DIR/qaup-admin.jar" # 4. 创建更新说明 cat > "$UPDATE_DIR/UPDATE-INSTRUCTIONS.md" << 'EOF' # QAUP 程序更新包 ## 包含内容 - `qaup-admin.jar` - 新版本应用程序 ## ⚠️ 生产环境安全要求 由于生产环境安全限制,必须手工文件上传,禁止使用自动化脚本传输。 ## 更新步骤 ### 1. 文件传输(手工方式) 将更新包 `qaup-admin.jar` 按安全策略传输到生产服务器: ```bash # 方案A:使用SCP scp qaup-admin.jar user@生产服务器IP:/opt/qaup/qaup-deploy/ # 方案B:使用SFTP # 通过SFTP工具上传文件到 /opt/qaup/qaup-deploy/ 目录 ``` ### 2. 重命名文件 ```bash ssh user@生产服务器IP cd /opt/qaup/qaup-deploy cp qaup-admin.jar new-app.jar ``` ### 3. 执行更新 ```bash ./deploy-update.sh ``` ### 4. 验证更新 ```bash # 检查服务状态 docker compose ps # 检查应用日志 docker compose logs -f qaup-app # 访问系统确认功能正常 curl http://localhost:8080/actuator/health ``` ## 安全注意事项 - 更新前建议备份数据库:`docker exec qaup-postgres pg_dump -U qaup qaup > backup-$(date +%Y%m%d).sql` - 如果更新失败,脚本会自动回滚 - 如有更多问题,请查看完整的部署指南:DeployGuide.md - 仅授权人员可访问生产服务器 EOF # 5. 创建版本信息 cat > "$UPDATE_DIR/VERSION-INFO.txt" << EOF QAUP 程序更新包 构建时间: $(date) 构建主机: $(hostname) Git提交: $(git rev-parse --short HEAD 2>/dev/null || echo "未知") Maven版本: $(mvn --version | head -1) Java版本: $(java -version 2>&1 | head -1) 文件大小: $(du -sh "$JAR_FILE" | cut -f1) 文件MD5: $(md5sum "$JAR_FILE" | cut -d' ' -f1) 更新包内容: - qaup-admin.jar (主程序) - UPDATE-INSTRUCTIONS.md (更新说明) - VERSION-INFO.txt (版本信息) 适用场景: - 生产环境程序热更新 - 支持自动回滚机制 - 适合已部署环境的增量更新 EOF # 6. 验证更新包完整性 print_message $BLUE "验证更新包完整性..." REQUIRED_FILES=("qaup-admin.jar" "UPDATE-INSTRUCTIONS.md" "VERSION-INFO.txt") for file in "${REQUIRED_FILES[@]}"; do if [ ! -f "$UPDATE_DIR/$file" ]; then print_message $RED "❌ 缺失必要文件: $file" rm -rf "$UPDATE_DIR" exit 1 fi done print_message $GREEN "✓ 所有必要文件验证通过" # 7. 创建更新包 PACKAGE_NAME="${UPDATE_DIR}.tar.gz" tar -czf "$PACKAGE_NAME" "$UPDATE_DIR" # 8. 清理临时目录 rm -rf "$UPDATE_DIR" print_message $GREEN "✅ 程序更新包创建完成: $PACKAGE_NAME" print_message $BLUE "包大小: $(du -sh "$PACKAGE_NAME" | cut -f1)" echo "" print_message $BLUE "📋 更新说明(生产环境):" echo "" echo "⚠️ 由于生产环境安全要求,必须手工文件传输" echo "" echo "1. 按安全策略传输更新包到目标服务器:" echo " scp $PACKAGE_NAME user@生产服务器IP:/opt/qaup/" echo " 或使用SFTP、文件传输工具等" echo "" echo "2. 在生产服务器执行更新:" echo " ssh user@生产服务器IP" echo " cd /opt/qaup/qaup-deploy" echo " tar -xzf ../$PACKAGE_NAME" echo " cp qaup-admin.jar new-app.jar" echo " ./deploy-update.sh" echo "" echo "3. 详细更新说明请查看:" echo " - 更新说明: UPDATE-INSTRUCTIONS.md"