文章目录
3、提交代码是否通过webhook自动构建(建议开启Jpom差异构建)
一、需求背景
规范业务系统应用(dev、test、prod)等环境业务后端(Java)构建流程,提高CICD成功率以及时效性。
二、配置编译构建任务
文章示例介绍:系统应用名(mdp-lcode-bootstrap)、系统环境test
1、(CI)构建参数(环境变量)
理论上此脚本支持Java服务通用,按需调整业务系统应用名称、部署环境、jar路径、jar版本(APP_NAME、ENV、JAR_PATH、VERSION&OLD_VERSION)。
echo "声明环境变量"
# 设置JAR包版本,正常发布版本只需设置VERSION,版本升级场景需设置OLD_VERSION
VERSION=3.0.5-RELEASE.jar
OLD_VERSION=3.0.4-RELEASE.jar
# 设置应用名称
APP_NAME=mdp-lcode-bootstrap
# 设置发布环境
ENV=test
# 设置JAR包路径
JAR_PATH="/opt/iwork-${ENV}/${APP_NAME}"
# 设置JAR包名称
JAR_NAME="${APP_NAME}-${VERSION}"
2、构建命令
mvn clean package
ls
echo "打包结束开始执行脚本"
cd ${app_name}/target
ls
3、提交代码是否通过webhook自动构建(建议开启Jpom差异构建)
4、是否缓存构建(建议开启)
5、(CD)发布前脚本(发布自动备份——回滚方案)
理论上此脚本支持Java服务通用,脚本内容与业务系统应用无关。
echo "发布前————>>执行脚本"
echo "进入JAR发布目录:"
cd "${JAR_PATH}"
pwd
# 备份目录
backup_dir() {
CURRENT_TIMESTAMP=$(date '+%Y%m%d%H%M%S')
echo "当前日期时间戳: $CURRENT_TIMESTAMP"
mkdir -p backup/$CURRENT_TIMESTAMP
}
# 检查发布版本
check_cd_version() {
#版本升级场景: 如果OLD_VERSION不为空,则声明至OLD_JAR_NAME,否则声明JAR_NAME
if [ -z "$OLD_VERSION" ]; then
echo "当前同版本发布"
OLD_JAR_NAME="${JAR_NAME}"
else
echo "当前跨版本发布"
OLD_JAR_NAME="${APP_NAME}-${OLD_VERSION}"
fi
}
# 执行备份
exec_backup() {
backup_dir
#版本升级场景: 如果OLD_JAR_NAME不为空,则备份OLD_JAR_NAME
if [ ! -z "$OLD_JAR_NAME" ]; then
if [ -f "${OLD_JAR_NAME}" ]; then
cp "${OLD_JAR_NAME}" backup/$CURRENT_TIMESTAMP
echo "jar包 ${OLD_JAR_NAME} 成功"
else
echo "警告: 备份jar包 ${OLD_JAR_NAME} 不存在"
fi
fi
}
# 检查jar目录是否存在,不存在则创建
check_jar_path() {
echo "发布目录: $JAR_PATH"
if [ ! -d "${JAR_PATH}" ];then
mkdir -p "${JAR_PATH}"
echo "创建发布目录: $JAR_PATH"
sleep 3
fi
}
check_cd_version
exec_backup
check_jar_path
6、(CD)发布后通用脚本
理论上此脚本支持Java服务通用,脚本内容与业务系统应用无关。
echo "发布后执行脚本"
# 设置日志文件名前缀和路径
LOG_PREFIX="${APP_NAME}"
LOG_PATH="${JAR_PATH}/logs"
# 获取当前日期
DATE=$(date +%Y-%m-%d)
# 设置启动日志文件名
LOG_FILE="${LOG_PREFIX}-${DATE}.log"
#JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64
#JRE_HOME=$JAVA_HOME/jre
#JAVA_BIN=${JRE_HOME}/bin/java
JAVA_BIN=java
#jdk7
# JVM_OPTS="-Xms1024m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$LOG_PATH/heapdump.hprof"
#jdk8
JVM_OPTS="-Xms2048m -Xmx4086m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$LOG_PATH/heapdump.hprof"
# 设置Java启动参数
JAVA_OPTS="-server $JVM_OPTS -Dfile.encoding=UTF-8 -Dspring.profiles.active=${ENV}"
# 检查日志目录是否存在,不存在则创建
check_logs() {
if [ ! -d "${LOG_PATH}" ];then
mkdir -p "${LOG_PATH}"
fi
}
# 检查发布版本
check_cd_version() {
#版本升级场景: 如果OLD_VERSION不为空,则声明OLD_JAR_NAME
if [ -z "$OLD_VERSION" ]; then
echo "当前同版本发布"
else
echo "当前跨版本发布"
OLD_JAR_NAME="${APP_NAME}-${OLD_VERSION}"
fi
}
# 启动Java应用
start() {
#nohup $JAVA_BIN $JAVA_OPTS -jar "${JAR_PATH}/${JAR_NAME}" > ${LOG_PATH}/${LOG_FILE} 2>&1 &
cd ${JAR_PATH}
nohup $JAVA_BIN $JAVA_OPTS -jar "${JAR_PATH}/${JAR_NAME}" >/dev/null 2>&1 &
echo "Java application started."
}
# 停止Java应用
stop() {
check_cd_version
max_attempts=15
attempts=0
while [ $attempts -lt $max_attempts ]; do
#版本升级场景: 如果OLD_JAR_NAME不为空,则停止OLD_JAR_NAME,否则停止JAR_NAME
if [ -z "$OLD_JAR_NAME" ]; then
PID=$(ps -ef | grep ${JAR_PATH}/${JAR_NAME} | grep -v grep | awk '{print $2}')
else
PID=$(ps -ef | grep ${JAR_PATH}/${OLD_JAR_NAME} | grep -v grep | awk '{print $2}')
fi
if [ -z "$PID" ]; then
echo "Java应用未运行."
break
else
echo "进程 ${PID} 正在运行, 尝试停止进程,第 $(($attempts + 1)) 次"
kill -15 $PID
sleep 6
# 判断进程是否存在
if ps -p ${PID} > /dev/null; then
echo "进程 ${PID} 暂未停止, 无法启动服务${JAR_NAME}"
attempts=$((attempts + 1))
continue
fi
echo "Java应用已停止."
break
fi
done
# 避免优雅退出后未自动重启暂注释;
# 如果尝试了10次后进程仍然存在,则退出脚本
# if [ $attempts -eq $max_attempts ]; then
# echo "Failed to stop the Java application after $max_attempts attempts."
# exit 1
# fi
}
check_logs
stop
sleep 3
start
三、CICD发布案例展示
1、自动构建案例
2、手动执行案例(版本升级)
3、构建成功后,发布前备份结果
参考Jpom官方文章: