《企业级后端部署方案: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 restartApollo配置中心脚本模板模式注入 JVM 参数1.2 目标机目录结构{destPath}/ ├── order-service-20250618_143022-a1b2c3d.jar # 当前 JAR保留 N 个历史 JAR └── bin/ └── launch.sh # start / stop / restart1.3 流水线与共享库文件说明backend.jenkinsfile后端流水线入口pipeline.groovycheckout、发布门禁、回滚选版build.groovycompile()mvn/gradledeploy.groovyMinIO 上传/清理、SSH 部署、launch 脚本生成resources/backend-launch-template.sh默认 bash 启动脚本tools.groovypublishMode、startScriptType 归一化config.groovy凭据、MinIO、默认保留数二、发布模式publishModepublishMode行为自动发布默认构建上传后自动部署手动发布input 确认后部署仅构建仅上传 MinIO不 SSH 部署回滚选历史 JAR 部署回滚其他自动/手动仅构建publishMode选 JAR 版本 SSH 部署CheckOut → 编译 → 上传 MinIOpublishMode发布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 启动用户runUserchown-R${runUser}${destPath}sudo-u${runUser}bashbin/launch.sh restart五、Jenkins 配置5.1 参数化构建基础参数参数名类型说明TenvChoicedev/test/prodpublishModeChoice必配自动发布/手动发布/仅构建/回滚projectNameString应用名JAR 命名与 MinIO 路径buildTypeChoicemvn / gradlebuildshellString如 clean package -DskipTestsbuildPathStringJAR 搜索目录默认 targetdestPathString目标机应用根目录destIpString部署服务器逗号分隔artifactRetainCountStringMinIO 目标机保留 JAR 数默认 10waitMins/emailUserString手动超时 / 邮件发布配置参数名说明runUser启动用户默认 appstartScriptType脚本模板 / 自定义脚本customScriptContent自定义脚本文本launchScriptFileFile Parameter 上传脚本JVM / Apollo模板模式参数名默认值JVM_OPTS-server -Xmx1024m …APOLLO_ENVPROAPOLLO_METAhttp://apollo-eurka-service/APOLLO_NAMESPACESbigdata.configuration,application,…5.2 制品保留策略位置机制MinIOuploadToMinio后pruneMinioArtifacts保留最新 N 个 JAR应用服务器部署时删除{destPath}/{projectName}-*.jar超额旧文件N 由artifactRetainCount控制默认 10见config.DEFAULT_ARTIFACT_RETAIN_COUNT。5.3 凭据与环境变量同前端文档gitee_registry_ssh、minio-credentials、SSH 凭据可选MINIO_ENDPOINT、MINIO_BUCKET默认 backend-artifacts、SSH_KEY_CREDENTIAL_ID。六、流水线阶段阶段条件说明CheckOut≠ 回滚pipeline.checkoutCode代码编译同上build.compilefind JAR命名{projectName}-{BUILD_TIME}-{GIT_COMMIT}.jar打包并上传 MinIO同上cp uploadToMinio prune发布auto/manualrunPublish → deployBackendJar回滚rollbackselectRollbackVersion → deployBackendJarpostalwayssendPost 合并邮件七、共享库 APIdeploy.groovy方法说明uploadToMinio(..., retainCount)上传 JAR 并清理 MinIOdeployBackendJar(...)SSH 部署 launch.sh 本地 JAR 清理resolveCustomScriptFile(script)解析上传的脚本文件buildLaunchScript内部模板/自定义 占位符tools.groovynormalizePublishMode()— 发布模式normalizeStartScriptType()— 脚本模板/自定义parseRetainCount()— 解析保留个数八、典型场景场景publishMode备注日常 Apollo 发版自动发布startScriptType脚本模板构建不上线仅构建制品仍上传 MinIO自定义启动脚本自动发布上传 launchScriptFile回滚回滚使用当前 runUser/脚本配置生成 launch.sh磁盘控制任意artifactRetainCount5九、排错现象处理未找到 JAR检查 buildPath、buildshell双实例/端口占用确认 launch.sh 已更新find_pid 按 app_dir自定义脚本报错提供 launchScriptFile 或 customScriptContent回滚版本少retain 过小导致 MinIO 旧包被删调大保留数sudo 失败配置 sudoers 或 SSH 用户runUser十、快速检查清单共享库含 backend-launch-template.sh目标机已创建 runUsersudo 权限正确publishMode、artifactRetainCount 已配置projectName 与 MinIO 路径一致Apollo 地址在目标机可达模板模式