news 2026/6/19 9:41:21

《企业级后端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自动化实践》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《企业级后端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自动化实践》

企业级后端部署方案:Jenkins + MinIO + SSH + Gitee + Jenkinsfile 自动化实践

本文档基于jenkinsfileTest/backend.jenkinsfile及共享库jenkinslib编写,描述 Java 后端从 Maven/Gradle 编译、JAR 制品入库(含保留策略)、多机 SSH 部署(启动脚本模板/自定义、指定启动用户)到回滚的完整流程。


一、方案架构

1.1 组件说明

组件角色说明
Gitee代码仓库SSH 拉取指定分支
Jenkins (master)CI/CD编译、上传 MinIO、SSH 部署、launch.sh 重启
MinIO制品仓库版本化 JAR,自动清理超额历史包
应用服务器运行节点SSH 拉 JAR + bin/launch.sh restart
Apollo配置中心脚本模板模式注入 JVM 参数

1.2 目标机目录结构

{destPath}/ ├── order-service-20250618_143022-a1b2c3d.jar # 当前 JAR(保留 N 个历史 JAR) └── bin/ └── launch.sh # start / stop / restart

1.3 流水线与共享库

文件说明
backend.jenkinsfile后端流水线入口
pipeline.groovycheckout、发布门禁、回滚选版
build.groovycompile()mvn/gradle
deploy.groovyMinIO 上传/清理、SSH 部署、launch 脚本生成
resources/backend-launch-template.sh默认 bash 启动脚本
tools.groovypublishMode、startScriptType 归一化
config.groovy凭据、MinIO、默认保留数

二、发布模式(publishMode)

publishMode行为
自动发布(默认)构建上传后自动部署
手动发布input 确认后部署
仅构建仅上传 MinIO,不 SSH 部署
回滚选历史 JAR 部署

回滚

其他

自动/手动

仅构建

publishMode

选 JAR 版本 + SSH 部署

CheckOut → 编译 → 上传 MinIO

publishMode

发布:launch.sh restart

跳过发布

post 邮件


三、时序图(自动发布)

应用服务器MinIOdeploy.groovyJenkins应用服务器MinIOdeploy.groovyJenkinscompile(mvn/gradle) → 查找 JAR1uploadToMinio + prune(保留 N 个)2deployBackendJar3buildLaunchScript(模板或自定义)4SSH 下载 JAR5清理超额旧 JAR(服务器本地)6写入 bin/launch.sh7sudo -u runUser launch.sh restart8

四、启动脚本

4.1 脚本模板模式(startScriptType=脚本模板)

共享库backend-launch-template.sh,支持start/stop/restart

停服逻辑(已修复):按应用目录${app_dir}匹配 Java 进程,而非按带时间戳的 JAR 文件名,避免换 JAR 后旧进程停不掉。

find_pid(){ps-ef|grepjava|grep"${app_dir}/"|grep-vgrep|awk'{print $2}'|head-1}

占位符:{{PRONAME}}{{JARNAME}}{{JVM_OPTS}}{{APOLLO_*}}

4.2 自定义脚本模式

  • 上传launchScriptFile或填写customScriptContent(至少一种)
  • 同样支持占位符替换

4.3 启动用户(runUser)

chown-R${runUser}${destPath}sudo-u${runUser}bashbin/launch.sh restart

五、Jenkins 配置

5.1 参数化构建

基础参数
参数名类型说明
TenvChoicedev/test/prod
publishModeChoice必配:自动发布/手动发布/仅构建/回滚
projectNameString应用名,JAR 命名与 MinIO 路径
buildTypeChoicemvn / gradle
buildshellString如 clean package -DskipTests
buildPathStringJAR 搜索目录,默认 target
destPathString目标机应用根目录
destIpString部署服务器,逗号分隔
artifactRetainCountStringMinIO + 目标机保留 JAR 数,默认 10
waitMins/emailUserString手动超时 / 邮件
发布配置
参数名说明
runUser启动用户,默认 app
startScriptType脚本模板 / 自定义脚本
customScriptContent自定义脚本文本
launchScriptFileFile Parameter 上传脚本
JVM / Apollo(模板模式)
参数名默认值
JVM_OPTS-server -Xmx1024m …
APOLLO_ENVPRO
APOLLO_METAhttp://apollo-eurka-service/
APOLLO_NAMESPACESbigdata.configuration,application,…

5.2 制品保留策略

位置机制
MinIOuploadToMiniopruneMinioArtifacts,保留最新 N 个 JAR
应用服务器部署时删除{destPath}/{projectName}-*.jar超额旧文件

N 由artifactRetainCount控制(默认 10,见config.DEFAULT_ARTIFACT_RETAIN_COUNT)。

5.3 凭据与环境变量

同前端文档:gitee_registry_sshminio-credentials、SSH 凭据;可选MINIO_ENDPOINTMINIO_BUCKET(默认 backend-artifacts)、SSH_KEY_CREDENTIAL_ID


六、流水线阶段

阶段条件说明
CheckOut≠ 回滚pipeline.checkoutCode
代码编译同上build.compile,find JAR,命名{projectName}-{BUILD_TIME}-{GIT_COMMIT}.jar
打包并上传 MinIO同上cp + uploadToMinio + prune
发布auto/manualrunPublish → deployBackendJar
回滚rollbackselectRollbackVersion → deployBackendJar
postalwayssendPost 合并邮件

七、共享库 API

deploy.groovy

方法说明
uploadToMinio(..., retainCount)上传 JAR 并清理 MinIO
deployBackendJar(...)SSH 部署 + launch.sh + 本地 JAR 清理
resolveCustomScriptFile(script)解析上传的脚本文件
buildLaunchScript(内部)模板/自定义 + 占位符

tools.groovy

  • normalizePublishMode()— 发布模式
  • normalizeStartScriptType()— 脚本模板/自定义
  • parseRetainCount()— 解析保留个数

八、典型场景

场景publishMode备注
日常 Apollo 发版自动发布startScriptType=脚本模板
构建不上线仅构建制品仍上传 MinIO
自定义启动脚本自动发布上传 launchScriptFile
回滚回滚使用当前 runUser/脚本配置生成 launch.sh
磁盘控制任意artifactRetainCount=5

九、排错

现象处理
未找到 JAR检查 buildPath、buildshell
双实例/端口占用确认 launch.sh 已更新(find_pid 按 app_dir)
自定义脚本报错提供 launchScriptFile 或 customScriptContent
回滚版本少retain 过小导致 MinIO 旧包被删,调大保留数
sudo 失败配置 sudoers 或 SSH 用户=runUser

十、快速检查清单

  • 共享库含 backend-launch-template.sh
  • 目标机已创建 runUser,sudo 权限正确
  • publishMode、artifactRetainCount 已配置
  • projectName 与 MinIO 路径一致
  • Apollo 地址在目标机可达(模板模式)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/19 9:36:47

GHelper终极指南:华硕笔记本性能控制神器

GHelper终极指南:华硕笔记本性能控制神器 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Expertbook, RO…

作者头像 李华
网站建设 2026/6/19 9:30:49

根本不存在所谓的“技术任务”:技术任务就是产品任务

所谓“技术任务”,比如测试、交付流水线、重构等,本质上都应该服务于业务目标。真正有价值的技术工作,能够提升产品的可靠性、可扩展性和可维护性,并直接影响团队的研发效能和交付能力。如果不能像管理其他产品工作一样管理这些技…

作者头像 李华
网站建设 2026/6/19 9:20:01

Grok4性能深度解析:中文长文本推理与MoE架构实战指南

1. 项目概述:这不是一场发布会,而是一次行业压力测试“Grok4号称‘全球最强AI’”——这句话最近在技术社区里像一块石头砸进池塘,涟漪一圈圈往外扩,但水底到底有没有鱼,得蹲下来摸。我做AI领域内容拆解和实操验证十多…

作者头像 李华
网站建设 2026/6/19 9:13:49

好友聊天已读状态总结

在即时通讯系统中,用户需要知道发送的消息是否被对方阅读。传统方案是为每条消息单独存储 is_read 字段,但这种方式在高并发场景下会导致数据库压力过大——每收到一条消息就要更新一条记录,消息量增长后性能急剧下降。 为解决这个问题&#…

作者头像 李华
网站建设 2026/6/19 9:01:07

YOLOv8桥梁八类病害检测:工程化落地实战指南

1. 为什么桥梁病害检测不能只靠“人眼望远镜”?我第一次站在沪昆高速某特大桥桥墩下,仰头看那道3米长的斜向裂缝时,手里的检测记录本是空的。不是没看见——是根本不敢写。因为按《公路桥梁技术状况评定标准》(JTG/T H21-2011&…

作者头像 李华
网站建设 2026/6/19 8:55:18

哥斯拉Webshell管理工具:绕过WAF与静态查杀的实战指南

1. 项目概述:为什么我们需要哥斯拉? 在Web安全测试与应急响应的实战中,Webshell的管理工具一直是攻防两端博弈的焦点。从业内经典的“菜刀”,到后来加密流量、功能强大的“冰蝎”和插件生态丰富的“蚁剑”,红队和渗透测…

作者头像 李华