| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- #!/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文件路径> (使用指定路径的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 "=================================================="
|