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