#!/bin/bash # ============================================= # Vue前端应用自动部署脚本 # 功能:备份当前部署文件,部署新版本到nginx # ============================================= # 设置颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 日志函数 log_info() { echo -e "${GREEN}[INFO] $1${NC}" } log_warn() { echo -e "${YELLOW}[WARN] $1${NC}" } log_error() { echo -e "${RED}[ERROR] $1${NC}" } # 定义目录变量 put_tmp_directory="/home/lq/lq_workspace/deploy_workspace/put" # 部署临时目录(存放新版本的dist-dev.zip) nginx_html_directory="/home/lq/nginx/html" # nginx部署目录 nginx_html_bak="/home/lq/lq_workspace/deploy_workspace/deploy_bak/LQAdminFrontServer" # 备份目录 # 处理参数 if [ $# -eq 0 ]; then # 如果没有传入参数,使用默认文件名 SOURCE_ZIP="$put_tmp_directory/dist-dev.zip" log_info "未指定部署文件,将使用默认文件: $SOURCE_ZIP" # 检查默认文件是否存在 if [ ! -f "$SOURCE_ZIP" ]; then log_error "默认文件 $SOURCE_ZIP 不存在于当前目录" echo "当前目录: $(pwd)" echo "请指定要部署的zip文件路径,或者将dist-dev.zip放在当前目录" echo "" echo "使用方法:" echo " 1. 不传参数: $0 (使用当前目录的dist-dev.zip)" echo " 2. 传入参数: $0 (使用指定路径的zip文件)" echo "" echo "示例:" echo " $0 # 使用当前目录的dist-dev.zip" echo " $0 /home/user/dist-dev.zip # 使用指定路径的文件" echo " $0 /home/user/vue-app.zip # 使用其他名称的zip文件" exit 1 fi else # 使用传入的参数 SOURCE_ZIP="$put_tmp_directory/$1" log_info "使用指定的部署文件: $SOURCE_ZIP" fi # 检查源文件是否存在 if [ ! -f "$SOURCE_ZIP" ]; then log_error "文件不存在: $SOURCE_ZIP" exit 1 fi # 检查文件是否是zip格式 if ! file "$SOURCE_ZIP" | grep -q "Zip archive"; then log_error "文件不是有效的zip压缩包: $SOURCE_ZIP" exit 1 fi # 检查目录是否存在,不存在则创建 check_and_create_dir() { if [ ! -d "$1" ]; then log_warn "目录不存在,正在创建: $1" mkdir -p "$1" if [ $? -eq 0 ]; then log_info "目录创建成功: $1" else log_error "目录创建失败: $1" exit 1 fi fi } # 检查并创建所有需要的目录 log_info "检查并创建目录..." check_and_create_dir "$put_tmp_directory" check_and_create_dir "$nginx_html_bak" check_and_create_dir "$nginx_html_directory" # 清理临时目录中的旧文件 #log_info "清理临时目录..." #rm -f "$put_tmp_directory"/*.zip 2>/dev/null # 检查nginx部署目录是否为空 if [ ! -d "$nginx_html_directory" ] || [ -z "$(ls -A $nginx_html_directory 2>/dev/null)" ]; then log_warn "nginx部署目录为空或不存在,跳过备份步骤" SKIP_BACKUP=true else SKIP_BACKUP=false fi # 获取当前时间(用于备份文件名) current_time=$(date "+%Y-%m-%d_%H-%M-%S") backup_filename="dist-dev_bak_${current_time}.zip" backup_filepath="/tmp/${backup_filename}" # ========== 2.1 备份当前部署文件 ========== if [ "$SKIP_BACKUP" = false ]; then log_info "正在备份当前部署文件..." # 切换到nginx部署目录 cd "$nginx_html_directory" || { log_error "无法切换到nginx部署目录: $nginx_html_directory" exit 1 } # 检查是否有需要备份的文件 if [ ! -f "index.html" ] && [ ! -d "assets" ]; then log_warn "未找到index.html和assets目录,跳过备份" SKIP_BACKUP=true else # 创建备份压缩包 log_info "正在创建备份文件: $backup_filename" if command -v zip >/dev/null 2>&1; then # 只备份index.html和assets目录 if [ -f "index.html" ]; then zip -qr "$backup_filepath" index.html log_info "已备份 index.html" fi if [ -d "assets" ]; then zip -qru "$backup_filepath" assets log_info "已备份 assets 目录" fi if [ ! -f "$backup_filepath" ]; then log_error "备份文件创建失败" exit 1 fi backup_size=$(du -h "$backup_filepath" | cut -f1) log_info "备份完成,文件大小: $backup_size" else log_error "未找到zip命令,请先安装zip工具" log_info "安装命令: sudo apt-get install zip 或 sudo yum install zip" exit 1 fi fi fi # ========== 2.2 复制备份文件到备份目录 ========== if [ "$SKIP_BACKUP" = false ] && [ -f "$backup_filepath" ]; then log_info "正在复制备份文件到备份目录..." cp "$backup_filepath" "$nginx_html_bak/" if [ $? -eq 0 ]; then log_info "备份文件已保存到: $nginx_html_bak/$backup_filename" else log_error "备份文件复制失败" exit 1 fi fi # ========== 2.3 删除工作目录下的备份文件 ========== if [ -f "$backup_filepath" ]; then log_info "清理临时备份文件..." rm -f "$backup_filepath" log_info "临时备份文件已清理" fi # ========== 2.4 复制新的dist-dev.zip到nginx部署目录 ========== log_info "正在复制新版本文件到nginx部署目录..." cp "$SOURCE_ZIP" "$nginx_html_directory/dist-dev.zip" if [ $? -ne 0 ]; then log_error "文件复制失败" exit 1 fi log_info "新版本文件已复制到: $nginx_html_directory/dist-dev.zip" # ========== 2.5 解压缩并清理 ========== log_info "正在解压缩新版本文件..." # 切换到nginx部署目录 cd "$nginx_html_directory" || { log_error "无法切换到nginx部署目录" exit 1 } # 先删除现有的文件 再解压 rm -f index.html && rm -rf assets log_info "删除nginx工作目录的文件" # 检查unzip命令 if ! command -v unzip >/dev/null 2>&1; then log_error "未找到unzip命令,请先安装unzip工具" log_info "安装命令: sudo apt-get install unzip 或 sudo yum install unzip" exit 1 fi # 解压缩前备份现有文件(如果需要) if [ "$SKIP_BACKUP" = false ]; then # 移动现有文件到临时目录 temp_backup_dir="/tmp/nginx_html_backup_${current_time}" mkdir -p "$temp_backup_dir" # 移动除dist-dev.zip之外的所有文件 for item in *; do if [ "$item" != "dist-dev.zip" ]; then mv "$item" "$temp_backup_dir/" 2>/dev/null || true fi done log_info "现有文件已临时备份到: $temp_backup_dir" fi # 解压缩文件 log_info "正在解压dist-dev.zip..." unzip -o -q "dist-dev.zip" if [ $? -eq 0 ]; then log_info "解压缩完成" # 检查解压后的文件 if [ -f "index.html" ]; then log_info "✓ index.html 文件存在" else log_warn "⚠ 解压后未找到index.html文件" fi if [ -d "assets" ]; then assets_count=$(find assets -type f | wc -l) log_info "✓ assets 目录存在,包含 $assets_count 个文件" else log_warn "⚠ 解压后未找到assets目录" fi else log_error "解压缩失败" # 如果解压失败,恢复备份的文件 if [ "$SKIP_BACKUP" = false ] && [ -d "$temp_backup_dir" ]; then log_info "正在恢复备份文件..." mv "$temp_backup_dir"/* . 2>/dev/null || true fi exit 1 fi # ========== 清理临时文件和目录 ========== log_info "正在清理临时文件..." # 删除zip文件 rm -f "$nginx_html_directory/dist-dev.zip" log_info "已删除dist-dev.zip文件" # 删除临时备份目录 if [ -d "$temp_backup_dir" ]; then rm -rf "$temp_backup_dir" log_info "已清理临时备份目录" fi # 设置正确的权限 log_info "设置文件权限..." chmod -R 755 "$nginx_html_directory" 2>/dev/null || true # 验证部署 log_info "==================== 部署验证 ====================" log_info "部署目录: $nginx_html_directory" log_info "备份目录: $nginx_html_bak" log_info "部署时间: $(date)" log_info "备份文件: ${backup_filename:-无}" # 显示目录结构 log_info "当前部署文件结构:" ls -la "$nginx_html_directory" | head -20 log_info "==================================================" # 获取文件数量统计 html_count=$(find "$nginx_html_directory" -name "*.html" -type f | wc -l) js_count=$(find "$nginx_html_directory" -name "*.js" -type f | wc -l) css_count=$(find "$nginx_html_directory" -name "*.css" -type f | wc -l) log_info "部署统计:" log_info " HTML文件: $html_count 个" log_info " JS文件: $js_count 个" log_info " CSS文件: $css_count 个" if [ "$SKIP_BACKUP" = false ]; then log_info " 🔄 备份已创建: $nginx_html_bak/$backup_filename" fi log_info "${GREEN}✅ Vue前端应用部署完成!${NC}" # 输出nginx重启建议 log_info "==================================================" log_info "如果需要重新加载nginx配置,请执行以下命令:" echo "sudo nginx -s reload" log_info "=================================================="