#!/bin/bash set -e # ==================== 记录开始时间 ==================== START_TIME=$(date +%s) # 开始时间 # ==================== 配置变量 ==================== PROJECT_DEPLOY_SUBDIR="jenkins_test" # 部署项目目录名【按项目更改】 BACKUP_SUB_DIR="jenkins_test_backup" # 备份子目录名【按项目更改】 DIST_DIR="dist" # 构建产物目录【按项目更改】 DEPLOY_PARENT_DIR="/www/wwwroot/frontend" # 部署父目录 BACKUP_BASE_DIR="/www/wwwroot/frontend/backup" # 备份根目录 DEPLOY_DIR="$DEPLOY_PARENT_DIR/$PROJECT_DEPLOY_SUBDIR" # 完整部署路径 BACKUP_DIR="$BACKUP_BASE_DIR/$BACKUP_SUB_DIR" # 完整备份路径 MAX_BACKUPS=3 # 最多保留的备份份数 TIMESTAMP=$(date +"%Y%m%d_%H%M%S") # 备份时间戳 BACKUP_TAR_GZ="$BACKUP_DIR/${PROJECT_DEPLOY_SUBDIR}_${TIMESTAMP}.tar.gz" # 本次备份压缩包 # ==================== 获取 Git 信息 ==================== GIT_URL="${GIT_URL:-$(git config --get remote.origin.url 2>/dev/null || echo 'Unknown')}" GIT_BRANCH="${GIT_BRANCH:-$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo 'Unknown')}" GIT_BRANCH_CLEAN=$(echo "$GIT_BRANCH" | sed 's|refs/heads/||') # ==================== 输出部署信息 ==================== echo "========================================" echo "?? 开始部署流程" echo "?? 仓库: $GIT_URL" echo "?? 分支: $GIT_BRANCH_CLEAN" echo "?? dist目录: $DIST_DIR" echo "?? 部署目录: $DEPLOY_DIR" echo "?? 备份目录: $BACKUP_DIR" echo "?? 本次备份: $BACKUP_TAR_GZ" echo "?? 最多保留: $MAX_BACKUPS 份备份" echo "========================================" # ================== (前端)代码编译 ===================== # 按需自行修改 yarn yarn build # ==================== 1. 检查 dist 目录 ==================== if [ ! -d "$DIST_DIR" ]; then echo "?? 错误: 构建产物目录 '$DIST_DIR' 不存在!" exit 1 fi if [ -z "$(ls -A $DIST_DIR)" ]; then echo "?? 错误: '$DIST_DIR' 目录为空!没有文件可部署。" exit 1 fi # ==================== 2. 创建部署目录 ==================== echo "?? 检查部署目录是否存在..." sudo mkdir -p "$DEPLOY_DIR" # ==================== 3. 备份现有文件为压缩包(如果存在)==================== echo "?? 正在备份现有文件为压缩包..." if [ -n "$(ls -A $DEPLOY_DIR 2>/dev/null)" ]; then sudo mkdir -p "$BACKUP_DIR" cd "$DEPLOY_PARENT_DIR" || { echo "?? 无法进入目录: $DEPLOY_PARENT_DIR"; exit 1; } sudo tar -czf "$BACKUP_TAR_GZ" "$PROJECT_DEPLOY_SUBDIR" && \ echo "?? 备份成功" || \ { echo "?? 打包失败!"; exit 1; } cd - > /dev/null else echo "???? 部署目录为空,无需备份。" fi # ==================== 4. 清理旧备份 ==================== echo "?? 清理旧备份,保留最新的 $MAX_BACKUPS 个压缩包..." OLD_BACKUP_FILES=$(ls -1 "$BACKUP_DIR/${PROJECT_DEPLOY_SUBDIR}"_*.tar.gz 2>/dev/null | sort | head -n -$MAX_BACKUPS 2>/dev/null || true) if [ -n "$OLD_BACKUP_FILES" ]; then echo "?? 将删除以下旧备份文件:" echo "$OLD_BACKUP_FILES" echo "$OLD_BACKUP_FILES" | xargs sudo rm -f && \ echo "?? 旧备份清理完成" || \ { echo "?? 删除旧备份失败!"; exit 1; } else echo "?? 无需清理,当前备份数量未超过 $MAX_BACKUPS 份。" fi # ==================== 5. 清空部署目录 ==================== echo "?? 清空部署目录..." sudo find "$DEPLOY_DIR" -mindepth 1 -delete && \ echo "?? 清空成功" || \ { echo "?? 清空目录失败!"; exit 1; } # ==================== 6. 复制新文件 ==================== echo "?? 复制新构建文件到部署目录..." sudo cp -rp "$DIST_DIR"/* "$DEPLOY_DIR"/ && \ echo "?? 文件复制成功" || \ { echo "?? 文件复制失败!"; exit 1; } # ==================== 7. 设置权限(可选)==================== # ==================== 8. 部署时间计算 ==================== END_TIME=$(date +%s) DURATION=$((END_TIME - START_TIME)) HOURS=$((DURATION / 3600)) MINUTES=$(((DURATION % 3600) / 60)) SECONDS=$((DURATION % 60)) echo "========================================" echo "?? 部署成功!" echo "?? 新版本已部署到: $DEPLOY_DIR" echo "?? 执行耗时: ${HOURS}h ${MINUTES}m ${SECONDS}s" echo "========================================"