1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| #!/bin/bash
# 配置常量 APP_DIR="/data/apps/touchs" BIN_DIR="$APP_DIR/bin" HISTORY_DIR="$BIN_DIR/history" LOG_DIR="$APP_DIR/logs" LOG_FILE="$LOG_DIR/info.log" JAR_NAME="touchs.jar" NEW_JAR="target/$JAR_NAME"
# 确保必要的目录存在 mkdir -p $BIN_DIR $HISTORY_DIR $LOG_DIR
# 函数:备份旧版本 backup_old_version() { if [ -f "$BIN_DIR/$JAR_NAME" ]; then TIMESTAMP=$(date +%Y%m%d%H%M%S) mv "$BIN_DIR/$JAR_NAME" "$HISTORY_DIR/${JAR_NAME%.jar}-$TIMESTAMP.jar" echo "旧版本已备份:$HISTORY_DIR/${JAR_NAME%.jar}-$TIMESTAMP.jar" >> $LOG_FILE else echo "未发现旧版本 JAR 包,无需备份。" >> $LOG_FILE fi }
# 函数:启动应用 start_app() { echo "正在启动应用..." >> $LOG_FILE nohup java -jar "$BIN_DIR/$JAR_NAME" > $LOG_FILE 2>&1 & sleep 5 APP_PID=$(pgrep -f $JAR_NAME) if [ -z "$APP_PID" ]; then echo "应用启动失败!" >> $LOG_FILE return 1 else echo "应用启动成功,PID: $APP_PID" >> $LOG_FILE return 0 fi }
# 函数:回滚到上一版本 rollback() { echo "正在回滚到上一版本..." >> $LOG_FILE # 强制停止当前运行服务 echo "正在停止当前服务..." >> $LOG_FILE APP_PID=$(pgrep -f $JAR_NAME) if [ -n "$APP_PID" ]; then kill -9 $APP_PID echo "当前服务已停止,PID: $APP_PID" >> $LOG_FILE else echo "当前服务未运行,无需停止。" >> $LOG_FILE fi
# 查找最新备份文件 LATEST_BACKUP=$(ls -t $HISTORY_DIR | head -n 1) if [ -n "$LATEST_BACKUP" ]; then echo "发现备份文件:$LATEST_BACKUP,正在回滚..." >> $LOG_FILE mv "$HISTORY_DIR/$LATEST_BACKUP" "$BIN_DIR/$JAR_NAME" echo "备份文件已恢复为当前版本:$LATEST_BACKUP" >> $LOG_FILE else echo "未找到任何备份文件,回滚失败!" >> $LOG_FILE return 1 fi
# 启动回滚版本 echo "正在启动回滚版本..." >> $LOG_FILE start_app if [ $? -eq 0 ]; then echo "回滚成功,服务已启动。" >> $LOG_FILE else echo "回滚失败,服务未能启动,请检查日志。" >> $LOG_FILE fi }
# 函数:清理旧日志 cleanup_logs() { echo "正在清理 15 天前的日志..." >> $LOG_FILE find $LOG_DIR -type f -mtime +15 -exec rm -f {} \; echo "日志清理完成。" >> $LOG_FILE }
# 主逻辑 case "$1" in deploy) echo "======== 部署开始 $(date) ========" > $LOG_FILE cd $APP_DIR || { echo "目录 $APP_DIR 不存在!" >> $LOG_FILE; exit 1; } echo "正在检查或拉取最新代码..." >> $LOG_FILE if [ ! -d ".git" ]; then echo "未检测到 Git 仓库,正在初始化..." >> $LOG_FILE git init git remote add origin https://xxx:令牌@github.com/xxx/xxx.git fi git reset --hard git pull origin dev || { echo "代码拉取失败!" >> $LOG_FILE; exit 1; } echo "正在构建项目..." >> $LOG_FILE mvn clean package -DskipTests || { echo "构建失败!" >> $LOG_FILE; exit 1; } backup_old_version mv $NEW_JAR $BIN_DIR/$JAR_NAME echo "正在停止旧应用..." >> $LOG_FILE APP_PID=$(pgrep -f $JAR_NAME) if [ -n "$APP_PID" ]; then kill -9 $APP_PID echo "旧应用已停止。" >> $LOG_FILE else echo "未检测到运行中的应用。" >> $LOG_FILE fi start_app if [ $? -ne 0 ]; then rollback fi cleanup_logs echo "======== 部署完成 $(date) ========" >> $LOG_FILE ;; rollback) echo "======== 回滚开始 $(date) ========" > $LOG_FILE rollback echo "======== 回滚完成 $(date) ========" >> $LOG_FILE ;; cleanup_logs) cleanup_logs ;; *) echo "用法: $0 {deploy|rollback|cleanup_logs}" ;; esac
|