DevOps(CICD)——Jpom后端(Java)支持版本升级、自动备份

文章目录

一、需求背景

二、配置编译构建任务

1、(CI)构建参数(环境变量)

2、构建命令

3、提交代码是否通过webhook自动构建(建议开启Jpom差异构建)

4、是否缓存构建(建议开启)

5、(CD)发布前脚本(发布自动备份——回滚方案)

6、(CD)发布后通用脚本

三、CICD发布案例展示

1、自动构建案例

2、手动执行案例(版本升级)

3、构建成功后,发布前备份结果


一、需求背景

        规范业务系统应用(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官方文章:

本地构建 + Jpom Server 使用 SCP 发布项目 | Jpom项目运维

GitLab 提交代码后自动执行构建 | Jpom项目运维

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Amos.Sun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值