一、业务背景与通用架构

1.1 现状痛点

许多企业内网开发、外包小项目或自研内部系统,完全不使用Git/Gitee/SVN等代码仓库

  • 代码仅本地开发,不做版本托管;
  • 传统Jenkins「拉取代码 → 服务内打包 → 远程部署」流程无法适用。

现有固定架构:

  • 开发端:IDEA / Cursor 本地编码,本地Maven打包生成JAR;
  • 服务端1:Jenkins(仅作中转、远程下发部署,不编译代码);
  • 服务端2:远端业务服务器(最终运行Spring Boot JAR)。

1.2 统一核心部署链路(三套方案共用)

本地IDE打包JAR → 上传JAR至Jenkins任务工作区 → 触发Jenkins构建(Build Now) 
→ Jenkins通过SSH推送JAR至业务服务器 → 停止旧进程 → 启动新JAR

1.3 通用前置配置(三套方案仅需配置一次)

  1. 安装插件Publish Over SSH(远程传包+执行脚本)。
  2. 系统配置:录入远端业务服务器SSH账号密码,连通性测试成功。
  3. 新建纯部署任务
    • 删除Git源码管理,删除Maven打包步骤;
    • Jenkins仅负责部署,不重新打包覆盖本地JAR。
  4. 开启远程构建:配置触发Token,关闭CSRF跨站校验(内网环境安全)。
  5. 生成API Token:用于文件上传和接口调用的鉴权。
  6. 配置通用启停脚本(Jenkins后置SSH脚本):
    # 停止旧Java进程
    PID=$(ps -ef | grep 'java -jar /opt/app/*.jar' | grep -v grep | awk '{print $2}')
    if [ -n "$PID" ]; then kill -9 $PID; fi
    # 后台启动新JAR
    nohup java -jar /opt/app/*.jar --spring.profiles.active=prod > /opt/app/app.log 2>&1 &
    sleep 3
    # 健康自检
    curl http://127.0.0.1:8080/actuator/health
    

二、方案一:自研IDEA插件(团队长期最优)

适用场景:团队固定使用IDEA、高频发布、多环境(测试/生产)切换,需要可视化一键操作,拒绝命令行。

实现原理
基于IntelliJ Platform SDK开发轻量化插件,内置配置面板,封装三大能力:

  1. 调用IDEA内置Maven进行本地打包;
  2. HTTP鉴权上传JAR至Jenkins任务工作区;
  3. 调用Jenkins远程构建API(等价于手动点击“Build Now”),并同步监听部署结果。

核心特性

  • 可视化配置:Jenkins地址、账号、Token、任务名、环境信息本地持久化存储。
  • 右键/工具栏快捷发布:项目右键一键发布,或点击工具栏按钮。
  • 结果反馈:IDE弹窗提示成功/失败,并可跳转Jenkins控制台日志。
  • 防覆盖逻辑:适配空部署任务,不会重新打包覆盖本地JAR。

优缺点

  • ✅ 集成度最高、零命令、上手最简单、多模块/多环境隔离完善。
  • ❌ 首次有开发成本(需编写插件并分发)。

三、方案二:IDEA External Tool(零开发,免费即用)

适用场景:单人开发、单环境、快速落地,不想编写插件代码。

配置步骤(Windows/Mac通用)

  1. 菜单:File → Settings → Tools → External Tools,点击“+”新增工具。
  2. 填写参数:
    • Name:一键Jar部署Jenkins
    • Program:sh
    • Arguments:$ProjectFileDir$/deploy-jenkins.sh
    • Working directory:$ProjectFileDir$
  3. 项目根目录新建 deploy-jenkins.sh,粘贴以下脚本:
#!/bin/bash
# ========== 使用者仅修改以下配置 ==========
JENKINS_HOST="http://192.168.1.100:8080"
JENKINS_USER="admin"
JENKINS_TOKEN="你的API令牌"
JOB_NAME="jar-deploy-empty"
BUILD_TOKEN="deploy666"
# ========================================

# 1. 本地Maven打包
mvn clean package -DskipTests
JAR_FILE=$(find target -maxdepth 1 -name "*.jar" | head -n1)
if [ -z "$JAR_FILE" ]; then
  echo "打包失败,未找到JAR包!"
  exit 1
fi

# 2. 上传JAR到Jenkins工作目录
curl -X POST -u ${JENKINS_USER}:${JENKINS_TOKEN} \
     -F "file=@${JAR_FILE}" \
     ${JENKINS_HOST}/job/${JOB_NAME}/ws/upload.jar

# 3. 触发Jenkins构建
curl -u ${JENKINS_USER}:${JENKINS_TOKEN} \
     ${JENKINS_HOST}/job/${JOB_NAME}/build?token=${BUILD_TOKEN}

echo "✅ 打包上传完成,Jenkins将自动下发至业务服务器"

使用方式:项目右键 → External Tools → 点击“一键Jar部署Jenkins”。

优缺点

  • ✅ 零开发、原生支持、配置一次永久使用,无兼容性问题。
  • ❌ 换电脑需重新配置;多环境切换需手动修改脚本参数。

四、方案三:Cursor Skill(云端保存,跨设备复用)

适用场景:使用Cursor编辑器、多设备办公、需云端同步脚本,支持多环境入参切换。

创建步骤

  1. Cursor左侧边栏 → SkillsCreate New Skill
  2. 类型选择 Shell Script,命名如“内网JAR一键部署Jenkins”。
  3. 粘贴以下脚本(支持传入 test / prod 参数):
#!/bin/bash
# Cursor Skill:一键部署,支持环境切换
ENV=$1

# 环境配置
if [ "$ENV" = "test" ]; then
  JENKINS_HOST="http://192.168.1.100:8080"
  JOB_NAME="test-jar-deploy"
else
  JENKINS_HOST="http://192.168.1.200:8080"
  JOB_NAME="prod-jar-deploy"
fi

# 公共鉴权
JENKINS_USER="admin"
JENKINS_API_TOKEN="你的API令牌"
BUILD_TRIGGER_TOKEN="deploy888"

echo "===== 开始本地Maven打包 ====="
mvn clean package -DskipTests
JAR_FILE=$(find target -name "*.jar" | head -n1)
[ -z "$JAR_FILE" ] && echo "JAR不存在,打包终止" && exit 1

echo "===== 上传JAR至Jenkins ====="
curl -s -X POST -u ${JENKINS_USER}:${JENKINS_API_TOKEN} \
     -F "file=@${JAR_FILE}" \
     ${JENKINS_HOST}/job/${JOB_NAME}/ws/upload.jar

echo "===== 触发远程构建 ====="
curl -s ${JENKINS_HOST}/job/${JOB_NAME}/build?token=${BUILD_TRIGGER_TOKEN}

# 轮询部署结果
sleep 4
BUILD_RESULT=$(curl -s -u ${JENKINS_USER}:${JENKINS_API_TOKEN} \
               ${JENKINS_HOST}/job/${JOB_NAME}/lastBuild/api/json | jq -r '.result')
if [ "$BUILD_RESULT" = "SUCCESS" ]; then
  echo "🎉 远端服务部署启动成功"
else
  echo "❌ 部署失败,请查看Jenkins控制台日志"
fi

使用方式:打开项目 → 选中Skill → 输入环境参数(test/prod)→ 点击运行。

优缺点

  • ✅ 脚本云端存储,跨设备无需重配;支持参数切换环境;内置终端,无需额外配置IDE工具。
  • ❌ 必须使用Cursor编辑器,团队需统一编辑器。

五、方案横向对比(选型速览)

方案 开发成本 跨设备复用 多环境适配 适用场景
自研IDEA插件 支持(分发) 极佳(可视化切换) 团队长期迭代,IDEA统一
IDEA External Tool 需手动导出配置 一般(改脚本) 单人开发,固定单环境
Cursor Skill 云端自动同步 优秀(入参切换) 团队统一Cursor,多环境频繁发布

六、核心避坑要点(三套方案通用)

  1. Jenkins任务禁止包含Maven打包步骤:否则Build Now会重新编译,覆盖本地已打好的JAR。
  2. 内网环境建议关闭CSRF:否则接口调用和文件上传会返回403错误。
  3. 远端业务服务器目录需预先创建:如 /opt/app,须与SSH脚本中的目录一致。
  4. Jenkins API Token权限最小化:只开放文件上传和构建权限,避免使用管理员账号。
  5. Windows需安装jq命令:否则无法解析Jenkins的JSON返回结果(方案三依赖)。

七、整体统一时序图(三套方案执行链路完全一致)

三套方案仅IDE执行载体不同,后端调用链路与Jenkins执行逻辑完全一致,通用时序如下:

业务服务器 Jenkins服务 本地Maven 开发端 (IDEA/Cursor) 业务服务器 Jenkins服务 本地Maven 开发端 (IDEA/Cursor) 触发本地打包 (mvn package) 生成JAR文件 上传JAR到任务工作区 (HTTP POST) 触发远程构建 (HTTP GET with token) 执行SSH部署任务 SSH推送JAR到 /opt/app 执行启停脚本 (停止旧进程,启动新JAR) 脚本执行结果(含健康检查) 返回部署状态(或通过轮询获取)

流程说明

  • 开发端通过插件/外部工具/Skill触发部署,本质均为调用本地Maven打包,再通过HTTP接口与Jenkins交互。
  • Jenkins收到构建请求后,利用 Publish Over SSH 插件将JAR推送至远端服务器,并执行预定义的启停脚本。
  • 部署结果可通过Jenkins的API查询(如方案三中的轮询),或由插件直接解析构建日志反馈给开发者。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐