跳到主要内容

CI/CD 部署

概述

项目提供了一套基于 Shell 脚本的自动化部署方案,可与 Jenkins 等 CI 工具集成,实现后端服务的自动构建、部署和健康检查。

部署脚本

核心部署脚本位于 script/shell/deploy.sh,实现了完整的部署流水线。

配置参数

DATE=$(date +%Y%m%d%H%M) # 时间戳,用于备份文件命名
BASE_PATH=/work/projects/yudao-server # 项目根目录
SOURCE_PATH=$BASE_PATH/build # Jenkins 构建产物目录
SERVER_NAME=yudao-server # 服务名称(JAR 文件名)
PROFILES_ACTIVE=development # Spring 激活的配置环境
HEALTH_CHECK_URL=http://127.0.0.1:48080/actuator/health/ # 健康检查地址

# JVM 参数
JAVA_OPS="-Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$HEAP_ERROR_PATH"

部署流程

┌─────────┐ ┌─────────┐ ┌──────────┐ ┌─────────┐ ┌───────────┐
│ backup │ → │ stop │ → │ transfer │ → │ start │ → │ health │
│ 备份旧包 │ │ 停止服务 │ │ 部署新包 │ │ 启动服务 │ │ 健康检查 │
└─────────┘ └─────────┘ └──────────┘ └─────────┘ └───────────┘

各阶段详解

1. 备份(backup)

将当前运行的 JAR 包备份到 backup/ 目录,使用时间戳作为后缀:

cp $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar

如果当前 JAR 不存在(首次部署),跳过备份。

2. 停止(stop)

优雅关闭正在运行的 Java 进程:

查找进程 PID → kill -15(SIGTERM)→ 等待最多 120 秒 → kill -9(强制终止)

关键点

  • 优先使用 kill -15 进行优雅关闭,让 Spring Boot 完成资源释放
  • 最大等待 120 秒,超时后强制 kill -9
  • 如果进程不存在,跳过停止步骤

3. 部署(transfer)

将 Jenkins 构建产物移动到项目目录:

# 删除旧 JAR
rm $BASE_PATH/$SERVER_NAME.jar
# 复制新 JAR
cp $SOURCE_PATH/$SERVER_NAME.jar $BASE_PATH

4. 启动(start)

使用 nohup 后台启动 Java 服务:

BUILD_ID=dontKillMe nohup java -server $JAVA_OPS $JAVA_AGENT \
-jar $BASE_PATH/$SERVER_NAME.jar \
--spring.profiles.active=$PROFILES_ACTIVE &

关键点

  • BUILD_ID=dontKillMe:防止 Jenkins 在构建结束后杀掉 Java 进程
  • $JAVA_AGENT:可选的 SkyWalking APM Agent(默认注释)
  • 日志输出到 nohup.out

5. 健康检查(healthCheck)

自动检测服务是否正常启动:

循环请求健康检查 URL(最多 120 秒)
↓ HTTP 200 → 健康检查通过
↓ 超时 → 打印日志,退出脚本(exit 1)

如果未配置 HEALTH_CHECK_URL,则 sleep 120 秒后打印日志供人工判断。

Jenkins 集成

Pipeline 配置

pipeline {
agent any

environment {
BASE_PATH = '/work/projects/yudao-server'
}

stages {
stage('拉取代码') {
steps {
git branch: 'main',
url: 'https://gitee.com/your-repo/ruoyi-live-mall-service-v2.git'
}
}

stage('Maven 构建') {
steps {
sh 'mvn clean install package -Dmaven.test.skip=true'
// 将 JAR 复制到 build 目录
sh "cp yudao-server/target/yudao-server.jar ${BASE_PATH}/build/"
}
}

stage('部署') {
steps {
sh 'bash script/shell/deploy.sh'
}
}
}

post {
success {
echo '部署成功!'
}
failure {
echo '部署失败,请检查日志'
}
}
}

Jenkins 工作目录

Jenkins 构建完成后,JAR 包需要放到脚本配置的 SOURCE_PATH(即 $BASE_PATH/build)目录下,脚本会自动将其转移到 $BASE_PATH 并启动。

SkyWalking 链路追踪(可选)

脚本预留了 SkyWalking Agent 配置,取消注释即可启用:

export SW_AGENT_NAME=$SERVER_NAME
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.0.84:11800
export SW_AGENT_TRACE_IGNORE_PATH="Redisson/PING,/actuator/**,/admin/**"
export JAVA_AGENT=-javaagent:/work/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar

前端部署

H5 前端

# 构建
cd live-mall-uniapp
npm run build:h5

# 部署到 Nginx
cp -r dist/build/h5/* /var/www/h5-dist/

管理后台前端

# 构建
cd yudao-ui-admin
npm run build:prod

# 部署到 Nginx
cp -r dist/* /var/www/admin-dist/

环境配置

多环境支持

环境Spring Profile说明
本地开发local本地 MySQL + Redis
开发环境dev开发服务器
测试环境test测试服务器
生产环境prod生产服务器

通过修改 deploy.sh 中的 PROFILES_ACTIVE 变量切换环境。

配置文件

yudao-server/src/main/resources/
├── application.yaml # 公共配置
├── application-local.yaml # 本地环境
├── application-dev.yaml # 开发环境
└── application-prod.yaml # 生产环境

回滚操作

当新版本出现问题时,可通过备份快速回滚:

# 查看备份列表
ls -la /work/projects/yudao-server/backup/

# 停止当前服务
kill -15 $(ps -ef | grep yudao-server | grep -v grep | awk '{print $2}')

# 恢复备份版本
cp /work/projects/yudao-server/backup/yudao-server-202401011200.jar \
/work/projects/yudao-server/yudao-server.jar

# 重新启动
nohup java -Xms512m -Xmx512m -jar /work/projects/yudao-server/yudao-server.jar \
--spring.profiles.active=development &

监控与日志

健康检查端点

GET http://localhost:48080/actuator/health/

返回示例:

{ "status": "UP" }

日志查看

# 查看启动日志
tail -f /work/projects/yudao-server/nohup.out

# 查看应用日志
tail -f /work/projects/yudao-server/logs/yudao-server.log

JVM 异常转储

配置了 OOM 自动转储:

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=$BASE_PATH/heapError

当发生内存溢出时,自动生成堆转储文件到 heapError/ 目录,可用于事后分析。

CI/CD����

���ĵ����ڽ����У������ڴ���