当前位置: 首页 > news >正文

使用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

相关文章:

  • 划分权重(01背包利用)纯暴力解决填空
  • 深度学习之用CelebA_Spoof数据集搭建一个活体检测-用MNN来推理时候如何利用Conan对软件包进行管理
  • 嵌入式自学第二十四天(5.20)
  • 门店管理五大痛点解析:如何用数字化系统实现高效运营
  • 如何理解大模型的幻觉输出及RAG技术的应用与实战案例
  • 机器人拖动示教控制
  • Java 03(代码块,内部类,lambda表达式)
  • 前端读取本地项目中 public/a.xlsx 文件中的数据 vue3
  • vuejs处理后端返回数字类型精度丢失问题
  • PID项目---硬件设计
  • 8.MySQL故障排查与生产环境优化
  • AGI大模型(29):LangChain Model模型
  • 数据结构与算法:动态规划中用观察优化枚举
  • 【520特辑】情人节脑影像绘图
  • 更新2011-2025经济类联考 396-真题+解析 PDF
  • Hutool 常用工具类实战指南
  • 【C++】C++的拷贝构造函数介绍使用
  • Java双指针法:原地移除数组元素
  • Unreal5 从入门到精通之如何实现 离线语音识别
  • 【BIO、NIO、AIO的区别?】
  • 美“金穹”反导系统增加外空作战手段,外交部:中方严重关切
  • 海南省市监局与香港标准及检定中心签署合作协议,加快检验检测国际化
  • 体坛联播|利物浦三轮不胜,孙颖莎/王楚钦晋级混双八强
  • 推动粒子治疗更加可及可享!龚正调研上海市质子重离子医院
  • 河北邯郸回应被曝涉生猪未检疫、注水问题:将严厉查处违法行为
  • 证监会副主席李明:近期将出台深化科创板、创业板改革政策措施