发布于 

java发布和回滚脚本

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

示例 1:运行 deploy 操作

1
./deploy.sh deploy

示例 2:运行 rollback 操作

1
./deploy.sh rollback