vibecoding发布系统 📅 2026/7/12 2:20:51 justgotrip-publishJustGoTrip 发布系统 —— 面向内部研发团队的代码发布平台支持一键打包部署、灰度滚动发布、回滚、GitLab Webhook 自动触发等完整发布流程。目录功能概览技术栈模块结构核心概念快速开始配置说明发布流程详解Webhook 自动触发路由摘除与恢复API 接口Docker 部署监控与可观测性常见问题功能概览功能说明一键发布 (OneKey)Git 拉取 → Maven/npm 构建 → rsync 同步 → SSH 重启全流程自动化仅部署 (Deploy)跳过构建直接 rsync 已有制品 SSH 重启仅打包 (Pack)本地构建并缓存制品供后续复用回滚 (Rollback)指定历史版本重新部署任务重试对失败任务一键重试无需重新填写参数GitLab Webhook 触发Push/Tag Push 事件自动匹配规则并入队部署多环境支持local / dev / test / prod 多套配置Nacos 统一管理生产配置滚动发布多节点按间隔逐台发布支持 iptables / HTTP 路由摘除HTTP 预热重启后自动发起 HTTP 探活最多重试 3 次磁盘检查发布前检查目标机器磁盘使用率超 95% 阻断发布远程日志查看通过 SSH tail 查看目标机器最近 200 行日志访问足迹记录用户最近访问的业务首页快速跳转钉钉通知可选发布结果推送钉钉群Prometheus 指标/actuator/prometheus暴露 JVM 业务指标Swagger UI/swagger-ui/index.html在线接口文档Flyway 数据库迁移启动时自动执行 SQL 脚本版本管理数据库结构技术栈分类组件语言 / 运行时Java 21框架Spring Boot 3.x、Spring Cloud Alibaba持久层MyBatis-Plus、Druid / HikariCP 连接池数据库MySQL 8.xjustgotrip_publish缓存 / 分布式锁RedisRedisson、Sentinel 高可用模板引擎ThymeleafWeb 服务器Undertow128 worker / 4 IO 线程GitLab 集成gitlab4j-api 6.xSSH / SCPJSch 0.2.x服务注册Nacos Discovery配置中心Nacos Config数据库迁移Flyway构建工具Maven支持多模块-pl构建、npmAngular 前端容器化Dockeropenjdk:21-jdk-slim模块结构justgotrip-publish/ ├── publish-justgotrip-domain/ # 领域层实体类、枚举 │ └── entity/ # PublishBiz, PublishApp, PublishTask, PublishFlow ... │ └── enums/ # TaskStatus, TaskType, VersionStatus ├── publish-justgotrip-persistent/ # 持久层MyBatis-Plus Mapper XML │ └── mapper/ # PublishBizMapper, PublishTaskMapper ... ├── publish-justgotrip-business/ # 业务层核心 Service │ └── service/ # DeployService, WarService, GitService, GitLabService ... │ └── task/ # AsyncDeploy, AsyncService异步任务 │ └── util/ # JSchUtil, SyncUtils, FlowFactory ... └── publish-statics-application/ # 应用层Spring Boot 启动入口 Controller └── controller/ # DeployController, PackController, HistoryController ... └── config/ # AuthFilter, CorsFilter, AsyncConfig └── resources/ ├── templates/ # Thymeleaf 页面模板 ├── static/ # 前端静态资源 ├── db/migration/ # Flyway SQL 迁移脚本 └── scripts/ # 远程机器安装脚本供 wget 下载核心概念PublishBiz业务一个需要发布的应用单元关联一个 GitLab 项目projectId和 Git 仓库地址。一个 Biz 可包含多个 App多节点。PublishApp应用实例Biz 下的单个部署节点记录目标机器 IP、部署路径、启动命令env字段、应用类型jar/python。PublishTask发布任务一次发布操作的记录包含版本号code、任务类型、目标节点列表、状态等。PublishFlow发布流程步骤Task 下每一个子步骤git pull、build、rsync、restart的执行记录含耗时、stdout/stderr 输出。任务类型TaskType类型说明onekey一键打包 部署最常用deploy仅部署跳过打包直接同步已有制品pkg仅打包构建并缓存不发布rollback回滚到指定历史版本retry重试失败任务任务状态TaskStatus状态说明create已创建等待执行running执行中succ成功fail失败killed手动终止cancelled取消如并发锁抢占失败timeout超时构建超时上限 30 分钟快速开始环境要求JDK 21Maven 3.8或使用项目内置./mvnwMySQL 8.x创建数据库justgotrip_publishRedis 6rsync发布服务器上需安装SSH 可达目标部署机器本地启动# 1. 克隆代码gitclone http://139.224.53.160:7088/hotel/justgotrip-publish.gitcdjustgotrip-publish# 2. 编译打包跳过测试./mvnw clean package-DskipTests# 3. 启动激活 dev profilejava-jarpublish-statics-application/target/publish-statics-application.jar\--spring.profiles.activedev启动成功后访问http://localhost:9099配置说明配置分三层优先级Nacos 动态配置application-{env}.ymlapplication.yml。关键配置项数据源spring.datasourcespring:datasource:url:jdbc:mysql://HOST:3306/justgotrip_publish?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghaiusername:YOUR_DB_USERpassword:YOUR_DB_PASSRedis生产 Sentinel 模式spring:data:redis:password:YOUR_REDIS_PASSsentinel:master:mymasternodes:-172.x.x.x:26379-172.x.x.x:26379-172.x.x.x:26379发布服务配置publish:server:default-user:root# SSH 默认用户名default-pass:YOUR_PASS# SSH 默认密码生产建议通过 Nacos 加密配置current-env:prod# 当前环境标识tgz-host:# 脚本下载服务器空则 fallback 到 self-urlself-url:http://publish-server:9099# 本服务对外地址repo:base-path:/data/publish/repo# Git 代码本地缓存根目录build:maven-profile:prod# Maven 构建激活的 profileroute-center:strategy:none# none | iptables | httpGitLab 集成gitlab:url:https://gitlab.yourcompany.comprivate-token:GITLAB_ADMIN_TOKEN# 管理员 token用于后台操作admin-token:# 可选管理员专用 token钉钉通知可选dingtalk:webhook:https://oapi.dingtalk.com/robot/send?access_tokenYOUR_TOKEN多环境 ProfileProfile激活方式说明local默认本地开发关闭 Nacos手动管理 Flywaydev-P dev开发环境连开发库Nacos 可选test-P test测试环境prod-P prod生产环境Nacos 管理所有配置发布流程详解一键发布OneKey完整链路用户提交发布表单 │ ▼ DeployController.deployBiz() │ 校验参数检查 bizLock ▼ PublishTask 入库statusrunning │ ▼ AsyncDeploy.deploy()异步线程 │ ├─ [1] WarService.packWar2() │ ├─ GitService.ensurePath() → git clone / fetch checkout │ └─ 执行构建命令 │ • Java: mvn clean package -DskipTests [-P profile] │ • 多模块: mvn clean package -pl module -am -DskipTests │ • Angular: npm install npm run build │ • 自定义: biz.preScript 字段指定 │ ├─ [2] 对每个目标 App 节点支持 interval 间隔滚动 │ ├─ [2a] 路由摘除strategyiptables → disablePortstrategyhttp → HTTP 接口 │ ├─ [2b] 磁盘检查df -h使用率 ≥ 95% 则跳过 │ ├─ [2c] DeployService.syncCode() → rsync 代码到远程 │ ├─ [2d] DeployService.restart() │ │ • jar → cd path {env 字段启动命令} │ │ • python → supervisorctl restart {appName} │ ├─ [2e] HTTP 预热最多重试 3 次间隔 2s │ └─ [2f] 路由恢复 │ └─ PublishTask 更新最终状态succ / fail每个步骤对应一条PublishFlow记录页面实时展示各步骤状态。构建超时单次构建最大等待时间30 分钟超时后强制 kill 进程任务标记为timeout。并发控制同一 Biz 同一时刻只允许一个发布任务运行LockService基于 Redis 分布式锁key:warBiz-{bizId}。Webhook 自动触发配置 GitLab Webhook在 GitLab 项目 → Settings → Webhooks 添加URL: http://YOUR_PUBLISH_HOST:9099/webhook/trigger Events: Push events, Tag push events触发逻辑GitLab Push/Tag Push 事件 │ ▼ TriggerController → TriggerService.trigger() │ ├─ 根据 projectId 查找匹配的 PublishBiz ├─ 根据分支名匹配 PublishRelationbiz branch → app 的绑定关系 └─ 创建 PublishTask 并放入内存队列 │ ▼每 6 秒消费一条防止并发冲突 自动执行部署支持的事件事件说明push普通分支推送tag_push打 tag 触发merge_request当前忽略可扩展systemGitLab 系统事件记录日志路由摘除与恢复部署时可自动将节点从流量路由中摘除部署完成后自动恢复实现无损滚动发布。三种策略strategy说明none不摘除默认直接发布iptablesSSH 登录目标机执行iptables -A INPUT -p tcp --dport X -j DROP部署后-D恢复http调用路由中心 HTTP 接口摘除/恢复支持自定义 URL 模板和鉴权 tokenHTTP 模式配置示例publish:route-center:strategy:httpbreak-request-sleep:20000# 摘除后等待流量排干的毫秒数默认 20shttp:offline-url-pattern:http://{ip}:{port}/offline_service?token{token}namepublish-serviceonline-url-pattern:http://{ip}:{port}/online_service?token{token}namepublish-servicetoken:YOUR_ROUTE_TOKENsuccess-keyword:succESS# 响应中标识成功的关键词大小写敏感API 接口页面路由Thymeleaf MVC路径说明GET /deploy发布首页展示可发布业务列表GET /deploy/go?bizIdprofile业务发布页选择版本和节点POST /deploy/go提交发布任务GET /deploy/rollback/go?bizIdprofile回滚页面GET /deploy/clear?bizIdprofile清理本地 Git 缓存GET /history/task/go?id任务执行详情含各步骤流程状态GET /history/task/retry?id重试任务GET /history/task/stop?id停止任务GET /package/war?bizIdcodeprofile独立打包页面AJAX 数据接口路径说明GET /ajax/tags?bizId获取指定业务的 GitLab tags branches 列表GET /ajax/branches?bizId仅返回 branchesGET /ajax/appStatus?appId获取 App 运行状态GET /ajax/history/biz?bizIdprofile获取业务发布历史GET /ajax/biz?userName获取用户有权限的业务列表GET /ajax/history?status获取任务列表支持running过滤Webhook 接口路径说明POST /webhook/trigger接收 GitLab push/tag_push 事件管理接口Actuator路径说明GET /actuator/health健康检查GET /actuator/prometheusPrometheus 指标采集GET /actuator/info应用信息Swagger UI访问http://HOST:9099/swagger-ui/index.html查看完整 REST API 文档。Docker 部署构建镜像# 先编译./mvnw clean package-DskipTests-Pprod# 构建镜像cdpublish-statics-applicationdockerbuild-tjustgotrip-publish:latest.运行容器dockerrun-d\--namejustgotrip-publish\-p9099:9099\-v/data/publish/repo:/data/publish/repo\-v/data/publish/logs:/app/logs\-eJAVA_OPTS-Xms512m -Xmx2g -XX:UseG1GC\justgotrip-publish:latestJVM 参数说明Dockerfile 默认 JVM 参数参数说明--add-opens java.base/...JSch SSH 兼容性所需的模块开放Java 21 强封装-Xms512m -Xmx2g堆内存初始 / 最大-XX:UseG1GC使用 G1 垃圾回收器-XX:MaxGCPauseMillis200GC 最大暂停目标 200ms监控与可观测性Prometheus Grafana应用默认暴露/actuator/prometheus可配合 Prometheus 采集以下指标JVM 堆内存、GC 次数/耗时Undertow 活跃连接数、请求数HikariCP 连接池使用情况自定义业务指标tag:applicationjustgotrip-publish日志logging:level:com.justgotrip.publish:INFO# 生产环境# com.justgotrip.publish: DEBUG # 开发/排查时远程日志查看SSH tail最近 200 行通过RLogController提供页面入口。常见问题Q: 构建失败提示mvn: command not foundWarService启动时会自动探测/opt/homebrew/bin/mvn、/usr/local/bin/mvn、/usr/bin/mvn。若均未找到可通过配置指定publish:build:mvn:/path/to/your/mvnQ: Git clone 失败仓库目录未创建检查publish.repo.base-path路径是否存在且有写权限gitlab.private-token是否配置且有效网络是否可达 GitLab 地址Q: SSH 连接目标机失败检查publish.server.default-user/default-pass配置确认发布服务器到目标机器 22 端口可达Java 21 下 JSch 需要--add-opens java.base/sun.net.www.protocol.sshALL-UNNAMEDDockerfile 已内置Q: 同一业务发布时提示「正在进行其他发布任务」同一 Biz 同时只允许一个发布等上一个任务完成或手动 stop后重试。锁存储在 Redis服务重启会自动释放。Q: Webhook 触发后未自动部署确认 GitLab Webhook URL 配置正确/webhook/trigger检查PublishRelation表中是否配置了该项目的 branch → app 映射查看服务日志TriggerService相关输出Q: 磁盘使用率告警后跳过了节点目标机器磁盘使用率 ≥ 95% 时该节点会被跳过但不会导致整体任务失败。请先清理目标机器磁盘再重试发布任务。项目信息项目值GroupIdcom.justgotripArtifactIdjustgotrip-publish父 POMjustgotrip-core:2.0.0-SNAPSHOT服务端口9099维护者xuzhennan创建时间2026-06-23