Linux 应用部署
# 一. 环境准备
提示
- 服务器必须是云主机,并且要和Jenkins Master服务器网络互通
- 服务器挂载数据盘,挂载目录是 /data
- 服务器要加入到Jenkins集群中
- 服务器上要事先安装 JDK1.8、Maven3.6+、Node16+,并在 /bin 下设置软链接,例如
- ln -s /usr/local/java/bin/java /bin/java
- ln -s /usr/local/maven/bin/mvn /bin/mvn
- ln -s /usr/local/nodejs/bin/node /bin/npde
- ln -s /usr/local/nodejs/bin/npm /bin/npm
- 若要部署前端页面,须事先安装nignx,并做好配置,其中 Location root 为 /deploy/<项目名>/html
# 二. 初始化服务器
(1) 登录服务器,创建init.sh,输入如下内容
点击查看
#! /bin/bash
## 修改<项目名>为实际的项目名称
project="<项目名>"
## 创建部署根目录
createAppDeploy() {
if [ ! -d "/deploy/${project}" ]; then
mkdir -p /deploy/${project}
mkdir -p /deploy/${project}/html
fi
}
## 创建应用程序产出目录(日志、上传文件...)
createAppRunOut() {
if [ ! -d "/data/deploy/logs/${project}" ]; then
mkdir -p /data/deploy/logs/${project}
fi
if [ ! -d "/data/deploy/upload/${project}" ]; then
mkdir -p /data/deploy/upload/${project}
fi
if [ ! -d "/data/deploy/apikey/${project}" ]; then
mkdir -p /data/deploy/apikey/${project}
fi
}
## 授权给用户 jenkins
assignAuth() {
chown -R jenkins /deploy
chown -R jenkins /data
}
init() {
createAppDeploy
createAppRunOut
assignAuth
}
## 执行初始化函数
init
(2)执行脚本 init.sh
bash init.sh
# 三. 项目部署
# 1. 提供健康检查Endpoint
在项目中提供健康检查Endpoint,可匿名访问,例如
public class DemoController {
@GetMapping("/health_check")
public String healthCheck() {
return "UP";
}
}
// 在SecurityConfig.java中设置匿名访问
.antMatchers("/health_check").anonymous()
# 2. 部署脚本
(1)在项目的ruoyi-admin模块下,创建deploy.sh(和pom.xml同级)
(2)deploy.sh 内容如下,按注释进行修改
点击查看
#! /bin/bash
# 全局将testapp修改为自己项目的名字
# <项目名> 替换成自己的项目名,和init.sh中保持一致
APP_NAME=testapp*.jar
JAVA_OPTS="-Xms1024m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m"
LOG_HOME=/data/deploy/logs/<项目名>
UPLOAD_PATH=/data/deploy/upload/<项目名>
APIKEY_PATH=/data/deploy/apikey/<项目名>
GREP_APP="testapp.*.jar"
## 启动端口号
SERVER_PORT=9001
## 健康检查的URI
HEALTH_CHECK="health_check"
# 使用说明,用来提示输入参数
usage() {
echo "Usage: sh deploy.sh [start|stop|restart|status]"
exit 1
}
# 检查程序是否在运行
is_exist() {
pid=`ps -ef | grep $GREP_APP | grep -v grep | awk '{print $2}' `
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
# 启动方法(根据实际项目调整运行时的环境变量)
start() {
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running. pid=${pid}."
else
echo "${APP_NAME} begin to start, listening to ${SERVER_PORT}"
nohup java $JAVA_OPTS \
-Dfile.encoding=utf-8 \
-Djava.security.egd=file:/dev/./urandom \
-jar $APP_NAME \
--server.port=${SERVER_PORT} \
--spring.redis.database=0 \
--ruoyi.profile=$UPLOAD_PATH \
--ruoyi.apiKey=$APIKEY_PATH \
> /dev/null 2>&1 &
fi
}
#停止方法
stop() {
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status() {
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is not running."
fi
}
#重启
restart() {
stop
start
}
#健康检查
healthCheck() {
sleep 2
SIGNAL=0
while [ $SIGNAL != 1 ]; do
RESULT=`curl -I -m 10 -o /dev/null -s -w %{http_code} http://localhost:${SERVER_PORT}/${HEALTH_CHECK}`
if [ $RESULT = 200 ]; then
SIGNAL=1
tail -n 10 ${LOG_HOME}/sys-error.log
else
tail -n 20 ${LOG_HOME}/sys-error.log
sleep 5
fi
done
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
"healthCheck")
healthCheck
;;
*)
usage
;;
esac
# 3. 配置自动化部署
联系孙超,进行自动化部署配置