使用Jenkins部署SpringBoot项目
1. 手动部署应用
使用Jenkins部署项目前,先手动部署 这样Jenkins只负责部署流程,具体每个应用的动态参数可以在 start.sh
脚本中设置
start.sh
#!/bin/bashnohup java -Dfile.encoding=utf-8 -Dspring.profiles.active=dev -Xms2g -Xmx4g -jar `pwd`/commuter-auth.jar > out.log 2>&1 &echo $! > pid
stop.sh
或者使用 kill -15
优雅停机
kill -9 `cat pid`
2. 在 Jenkins 新建一个项目
前置条件安装Maven Integration
插件
3. 设置项目git仓库地址和用户密码
4. maven设置
clean package -Dmaven.test.skip=true
4. Post Steps
单应用执行脚本
#!/bin/bash# 应用名称
app=commuter-auth
# 应用部署目录
path=/home/app/commuter/commuter-dev/auth
# 应用打包后的目录
target=commuter-auth/targetecho "切换目录至${path}"
cd $path || { echo "无法切换目录到 $path"; exit 1; }
echo "当前目录: $(pwd)"
ls -lecho "停止${app}服务..."
./stop.sh
stop_exit_code=$?
echo "停止脚本退出状态码: $stop_exit_code"echo "替换${app}.jar文件..."
mv -v ${WORKSPACE}/${target}/$app.jar $path || { echo "移动Jar文件失败"; exit 1; }
ls -l $app.jarecho "Java版本:"
java -version || { echo "Java未找到"; exit 1; }echo "等待5秒..."
sleep 5echo "开始启动${app}服务..."
# 防止Jenkins杀死进程
export BUILD_ID=dontKillMe
./start.sh
echo "启动命令执行状态: $?"echo "等待10秒,检查进程是否启动..."
sleep 10# 根据进程名检查实际是否运行
pid=$(pgrep -f "$path/$app.jar")
if [ -z "$pid" ]; thenecho "错误: $app 进程未启动!"echo "输出日志内容:"tail -n 100 $path/out.logexit 1
elseecho "$app 进程ID: $pid"
fiecho "$app 部署成功"
多模块应用执行脚本
#!/bin/bash# 定义多组部署参数 (app名称 部署目录 target目录)
# "应用名称 部署相对路径 打包target路径"
declare -a deployments=( "commuter-gateway gateway commuter-gateway/target""commuter-auth auth commuter-auth/target""commuter-bus-server bus-server commuter-bus/commuter-bus-server/target""commuter-bus-uniview bus-uniview commuter-bus/commuter-bus-uniview/target""commuter-standard-jt808 standard-808 commuter-standard/commuter-standard-jt808/target""commuter-standard-annex standard-annex commuter-standard/commuter-standard-annex/target""commuter-standard-data standard-data commuter-standard/commuter-standard-data/target""commuter-standard-peripheral standard-peripheral commuter-standard/commuter-standard-peripheral/target""commuter-standard-server standard-server commuter-standard/commuter-standard-server/target""commuter-quartz quartz commuter-visual/commuter-quartz/target"
)# 定义部署函数
deploy_app() {local app="$1"local deploy_path="/home/app/commuter/commuter-dev/$2"local target="$3"echo "开始部署应用: $app"echo "应用目录: $deploy_path"echo "目标路径: $target"echo "切换目录至 ${deploy_path}"if ! cd "$deploy_path"; thenecho "无法切换目录到 ${deploy_path}"return 1fiecho "当前目录: $(pwd)"ls -lecho "停止 ${app} 服务..."./stop.shlocal stop_exit_code=$?echo "停止脚本退出状态码: $stop_exit_code"echo "替换 ${app}.jar 文件..."if ! mv -v "${WORKSPACE}/${target}/${app}.jar" "$deploy_path"; thenecho "移动Jar文件失败"return 1fils -l "${app}.jar"echo "Java版本:"if ! java -version; thenecho "Java未找到"return 1fiecho "等待5秒..."sleep 5echo "开始启动 ${app} 服务..."export BUILD_ID=dontKillMe./start.shlocal start_status=$?echo "启动命令执行状态: $start_status"echo "等待10秒,检查进程是否启动..."sleep 10local pidpid=$(pgrep -f "${deploy_path}/${app}.jar")if [ -z "$pid" ]; thenecho "错误: ${app} 进程未启动!"echo "输出日志内容:"tail -n 100 "$deploy_path/out.log"return 1elseecho "${app} 进程ID: $pid"fiecho "${app} 部署成功"return 0
}# 循环执行部署
for deployment in "${deployments[@]}"; doIFS=' ' read -r app deploy_path target <<< "$deployment"echo "================================"echo "开始处理部署任务: $app"deploy_app "$app" "$deploy_path" "$target"# 检查部署结果if [ $? -eq 0 ]; thenecho "[$app] 部署成功!"elseecho "[$app] 部署失败!"fiecho "等待10秒进入下一个部署..."sleep 10
doneecho "所有部署任务处理完成!"
5. 常见问题
5.1 jenkins没有操作项目目录的权限
解决办法,设置Jenkins执行用户为root (不太安全,比较偷懒的做法)
修改 Jenkins 系统服务配置
vi /usr/lib/systemd/system/jenkins.service
修改下面配置
User=root
Group=root
重新加载系统服务并重新启动 Jenkins
systemctl daemon-reload
systemctl restart jenkins