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/ 目录,可用于事后分析。