前言
记录下使用云效部署Java项目,实现java项目一键化自动化部署。
云效流程说明:
1.云效拉取最新git代码后
2.进行maven编译打包后,上传到指定服务器目录
3.通过shell脚本,先kill java项目后,通过java -jar 启动项目。
操作步骤
注:git代码更新需要手动更新
添加服务连接-获得阿里云授权
部署脚本配置:
# 创建必要的目录
mkdir -p /usr/local/nginx/app
mkdir -p /usr/local/nginx/app/mall-im_turn_java
mkdir -p /usr/local/nginx/app/mall-im_turn_java/jarmkdir -p /usr/local/nginx/app/mall-im_turn_java/jar/logs
# 解压文件
tar zxvf /usr/local/nginx/app/mall-im_turn_java/mall_release.tgz -C /usr/local/nginx/app/mall-im_turn_java/jar
# 执行sh脚本
cd /usr/local/nginx/app/mall-im_turn_java/jar
bash /usr/local/nginx/app/mall-im_turn_java/jar/start_run.sh
#进入此目录
cd /usr/local/nginx/app/mall-im_turn_java/jar
#编辑java启动脚本 不同jar包名称-按这个替换即可 mall-im-1.0-SNAPSHOT.jar
vi start_run.sh
#!/bin/bash
#export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre/
#export PATH=$JAVA_HOME/bin:$PATH
# 应用名称
AppName="mall-im-1.0-SNAPSHOT.jar"
# 应用主目录和日志路径
APP_HOME=$(pwd)
LOG_PATH="$APP_HOME/logs/$AppName.log"
APP_JAR_PATH="$APP_HOME/$AppName"
GC_LOG_PATH="$LOG_PATH/gc"
# JVM参数 指定prod环境
JVM_OPTS="-server \
-Dname=$AppName \
-Dspring.profiles.active=test \
-Duser.timezone=Asia/Shanghai \
-Xms1024m \
-Xmx2048m \
-Xss2m \
-XX:MetaspaceSize=256m \
-XX:MaxMetaspaceSize=512m \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=$LOG_PATH/heapDump.hprof \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=500 \
-XX:InitiatingHeapOccupancyPercent=45"
# 日志函数
log() {
echo "$(date +'%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_PATH"
echo "$1"
}
# 获取进程ID
get_pid() {
pgrep -f "$APP_JAR_PATH"
}
set_env_vars() {
}
# 启动函数
start() {
PID=$(get_pid)
if [[ -n "$PID" ]]; then
log "$AppName is already running (PID: $PID)"
else
set_env_vars
nohup java $JVM_OPTS -jar "$APP_JAR_PATH" > /usr/local/nginx/app/mall-im_turn_java/jar/tlog.log 2>&1 &
log "Starting $AppName..."
log "java $JVM_OPTS -jar "$APP_JAR_PATH" > /dev/null 2>&1 &"
sleep 2
PID=$(get_pid)
if [[ -n "$PID" ]]; then
log "$AppName started successfully (PID: $PID)"
else
log "Failed to start $AppName"
fi
fi
}
# 停止函数
stop() {
PID=$(get_pid)
if [[ -n "$PID" ]]; then
log "Stopping $AppName (PID: $PID)..."
kill "$PID"
for i in {1..10}; do
if ! kill -0 "$PID" 2>/dev/null; then
log "$AppName stopped successfully"
return
fi
sleep 1
done
log "Failed to stop $AppName gracefully, force killing..."
kill -9 "$PID"
else
log "$AppName is not running"
fi
}
# 重启函数
restart() {
stop
log "Waiting for 5 seconds before restarting..."
sleep 5
start
}
# 状态检查函数
status() {
PID=$(get_pid)
if [[ -n "$PID" ]]; then
log "$AppName is running (PID: $PID)"
else
log "$AppName is not running"
fi
}
# 帮助信息
show_help() {
echo "Usage: $0 {start|stop|restart|status}"
echo "If no arguments are provided, the script will perform a default direct [restart] operation"
}
# 主逻辑
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
if [[ -n "$1" ]]; then
show_help
exit 1
else
log "No arguments supplied, restarting..."
restart
fi
;;
esac
exit 0
注:
1.linux服务器需要安装jdk才可正常启动运行
2.git代码-下载的代码主目录一定要有pom.xml文件否则不适配
3.git代码每次使用流水线运行部署-需要手动更新git最新代码,更新成功后再进行部署