多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

无Git代码托管下,3套JAR一键部署Jenkins方案(适配内网离线开发)|TaoToken 统一 Key 通道实践

无Git代码托管下,3套JAR一键部署Jenkins方案(适配内网离线开发)|TaoToken 统一 Key 通道实践 1. 内网无 Git 托管时JAR 部署 Jenkins 到底卡在哪内网离线开发最典型的场景是这样的代码只存在本地 IDEA 或 Cursor 工程目录里没有 GitLab、没有 Gitee、也没有 SVN团队约定“谁开发谁打包”。但服务端又确实需要一套自动化的部署入口于是 Jenkins 被拉来当“中转站”——它不编译代码只负责把本地打好的 JAR 推到业务服务器并重启进程。这个链路听起来简单真正落地时会撞上三个硬问题。第一Jenkins 默认的“源码管理 Maven 构建”流程完全用不上因为源码根本不在仓库里任务里必须把 Git 和 Maven 步骤全部删掉否则 Build Now 会重新编译把你本地辛苦打好的 JAR 覆盖成一份旧代码产物。第二内网没有外网Jenkins 插件市场打不开Publish Over SSH 这类必需插件得提前离线下载 hpi 文件手动安装。第三本地 IDE 到 Jenkins 的上传、触发、结果回读全靠 HTTP 接口和 Token 鉴权一旦 CSRF 没关或 Token 权限不对就会收到 403 或 401。我试过在一个完全断网的机房里搭这套东西最深的体会是Jenkins 在这里的角色不是 CI而是“带鉴权的文件分发 远程命令执行器”。理解这一点后面三套方案自研 IDEA 插件、IDEA External Tool、Cursor Skill本质上都只是“谁来触发本地打包并调用 Jenkins 接口”的差异后端链路完全一致。先把统一链路说清楚三套方案共用本地 IDE 打包 JAR → HTTP 上传 JAR 到 Jenkins 任务工作区 → 触发远程构建带 Token→ Jenkins 通过 Publish Over SSH 推送 JAR 到业务服务器 → 执行启停脚本停旧进程、起新 JAR、健康自检。这条链路里Jenkins 任务必须是“空部署任务”无源码管理、无构建步骤只保留构建后 SSH 动作。下面先把 Jenkins 侧的一次性前置配置做扎实再分别讲三套触发方案。前置配置清单只做一次安装 Publish Over SSH 插件离线 hpi 手动上传系统配置里录入业务服务器 SSH 账号密码并点“Test Configuration”确认连通新建自由风格任务删除源码管理和 Maven 步骤开启“触发远程构建”并设置 Token内网环境关闭 CSRF生成 API Token 用于上传和接口调用配置后置 SSH 启停脚本。启停脚本建议直接放在 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.activeprod /opt/app/app.log 21 sleep 3 # 健康自检 curl -s http://127.0.0.1:8080/actuator/health注意/opt/app目录必须提前在业务服务器上创建好且与脚本路径一致否则 SSH 推送会失败。这一步踩过的坑最多很多人卡在“构建成功但服务没起来”八成是目录不存在或权限不对。2. TaoToken 统一 Key 通道让 IDEA 与 Cursor 的模型调用一次配好内网离线开发还有一个容易被忽略的痛点IDEA 和 Cursor 里的 AI 辅助编码、代码补全、对话能力需要模型 API 通道。如果每个工具各自填一套 Base URL 和 Key换工具、换人、换机器都要重配非常碎。TaoToken 在这里的作用就是提供统一的 Key 与 API 通道把 IDEA、Cursor 等工具的模型调用收敛到一处配置。它的定位是统一模型调用入口官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 这个不加 UTM。你需要先在控制台创建 API Key控制台地址 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content Key 管理页 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。配置时三个要素必须齐全Base URL、API Key、Model ID。缺任何一个都会报鉴权或模型不存在。Base URL 统一填https://taotoken.net/apiKey 填控制台生成的令牌Model ID 按你实际要用的模型名填。对于 Cursor可以在设置里找到模型配置区域把 OpenAI 兼容的 Base URL 指向 TaoToken填入 Key 和 Model ID。对于 IDEA 里的 AI 插件比如 Continue、CodeGPT 这类支持自定义 OpenAI 兼容端点的同样填这三个值。这样 IDEA 和 Cursor 共用同一个 Key 通道换机器时只改一处。如果你用的是 Claude Code 这类工具接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里面有对应的 Base URL 和 Key 填写示例。需要说明的是TaoToken 是合规的模型调用通道不是任何形式的非法中转配置时按官方文档填写即可。统一 Key 通道的价值在内网场景下尤其明显离线环境里工具装好之后模型调用配置只需要维护一份团队里谁换电脑、谁加新工具照着同一套 Base URL Key Model ID 填就行不用每个工具单独申请。3. 三套 JAR 一键部署方案的可复制配置这一节给出三套方案里最关键的配置文件片段路径和原文保持一致方便直接复制。3.1 方案一自研 IDEA 插件团队长期最优适用团队固定用 IDEA、高频发布、多环境切换。插件基于 IntelliJ Platform SDK内置配置面板封装本地 Maven 打包、HTTP 上传 JAR、调用 Jenkins 远程构建 API 三件事。配置持久化用 IDEA 的PersistentStateComponent存成 XML路径在项目.idea/下。核心配置结构如下{ jenkinsHost: http://192.168.1.100:8080, jenkinsUser: admin, jenkinsToken: 你的API令牌, jobName: jar-deploy-empty, buildToken: deploy666, env: prod }插件里调用 Jenkins 上传和触发的逻辑与脚本方案一致只是用 Java HTTP Client 实现。优点是集成度最高、零命令、多环境可视化切换缺点是首次有开发成本需要打包分发。3.2 方案二IDEA External Tool零开发免费即用单人开发、单环境、想快速落地用这个。菜单 File → Settings → Tools → External Tools点“”新增Name 填“一键Jar部署Jenkins”Program 填shArguments 填$ProjectFileDir$/deploy-jenkins.shWorking directory 填$ProjectFileDir$。项目根目录新建deploy-jenkins.sh#!/bin/bash # 使用者仅修改以下配置 JENKINS_HOSThttp://192.168.1.100:8080 JENKINS_USERadmin JENKINS_TOKEN你的API令牌 JOB_NAMEjar-deploy-empty BUILD_TOKENdeploy666 # # 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”。优点是零开发、原生支持、配置一次永久用缺点是换电脑要重配多环境要手动改脚本参数。3.3 方案三Cursor Skill云端保存跨设备复用用 Cursor、多设备办公、想云端同步脚本选这个。Cursor 左侧边栏 → Skills → Create New Skill类型选 Shell Script命名“内网JAR一键部署Jenkins”粘贴#!/bin/bash # Cursor Skill一键部署支持环境切换 ENV$1 if [ $ENV test ]; then JENKINS_HOSThttp://192.168.1.100:8080 JOB_NAMEtest-jar-deploy else JENKINS_HOSThttp://192.168.1.200:8080 JOB_NAMEprod-jar-deploy fi JENKINS_USERadmin JENKINS_API_TOKEN你的API令牌 BUILD_TRIGGER_TOKENdeploy888 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→ 运行。优点是脚本云端存储、跨设备免重配、支持参数切换环境缺点是必须用 Cursor团队要统一编辑器。三套方案横向对比方案开发成本跨设备复用多环境适配适用场景自研 IDEA 插件高支持分发极佳可视化切换团队长期迭代IDEA 统一IDEA External Tool零需手动导出配置一般改脚本单人开发固定单环境Cursor Skill零云端自动同步优秀入参切换团队统一 Cursor多环境频繁发布4. 验证请求与成功结果连通性怎么确认配置完不等于能用必须做连通性验证。分三层本地打包、Jenkins 上传触发、远端服务健康。第一层本地打包验证。在项目根目录执行mvn clean package -DskipTests确认target/下生成了 JAR。如果这一步失败后面全免谈。第二层Jenkins 接口验证。先用 curl 单独测上传和触发排除脚本封装带来的干扰# 测试上传 curl -v -X POST -u admin:你的API令牌 \ -F filetarget/app.jar \ http://192.168.1.100:8080/job/jar-deploy-empty/ws/upload.jar # 测试触发 curl -v -u admin:你的API令牌 \ http://192.168.1.100:8080/job/jar-deploy-empty/build?tokendeploy666上传成功会返回 200 或 201触发成功返回 201 或 302。如果返回 403检查 CSRF 是否关闭返回 401检查 Token 是否正确。第三层远端服务健康。Jenkins 构建完成后在业务服务器上执行curl -s http://127.0.0.1:8080/actuator/health返回{status:UP}说明新 JAR 已正常启动。同时可以看 Jenkins 控制台日志确认 SSH 推送和启停脚本执行没有报错。对于 TaoToken 的模型调用通道验证方式是发一个最小请求。以 OpenAI 兼容接口为例curl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer 你的Key \ -H Content-Type: application/json \ -d {model:你的ModelID,messages:[{role:user,content:ping}]}返回正常 JSON 说明 Base URL、Key、Model ID 三要素都对。如果报 401检查 Key报模型不存在检查 Model ID 拼写。5. 本篇常见错排查401、403、local proxy failed 与 OAuth实际部署时报错集中在几个固定位置逐个对照。401 Unauthorized出现在 Jenkins 接口或 TaoToken 调用。Jenkins 侧多半是 API Token 填错或用了登录密码代替 TokenTaoToken 侧是 Key 无效或没带Bearer前缀。检查-u user:token里的 token 是不是控制台生成的 API Token而不是登录密码。403 Forbidden内网 Jenkins 最常见。原因是 CSRF 跨站校验没关接口调用和文件上传被拦。解决方式是在 Jenkins 全局安全配置里关闭“防止跨站点请求伪造”内网环境可以这么做。另外检查 Token 权限是否最小化到只开放上传和构建。local proxy failed这个报错通常出现在工具侧配置了本地代理但代理不可达。内网离线环境里如果 IDE 或 Cursor 的模型调用配置里残留了本地代理地址就会报这个。解决方式是清掉代理设置Base URL 直接指向https://taotoken.net/api不要经过任何本地转发。reading choices 相关报错一般是模型返回结构不符合预期常见于 Model ID 填错或接口路径不对。确认 Base URL 是https://taotoken.net/api请求路径是/v1/chat/completionsModel ID 与控制台一致。OAuth 报错如果工具走的是 OAuth 授权流程而不是 API Key会提示 OAuth 失败。内网场景建议统一用 API Key 方式不走 OAuth。Claude Code 这类工具的接入方式在文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里有说明按文档填 Base URL 和 Key。JAR 上传后服务没更新检查 Jenkins 任务里是否残留了 Maven 构建步骤。如果有Build Now 会重新编译覆盖你上传的 JAR。正确做法是任务里只保留 SSH 后置动作。Windows 下 jq 命令找不到方案三依赖 jq 解析 Jenkins JSON 返回。Windows 需要单独安装 jq 并加入 PATH否则轮询结果那一步会失败。SSH 推送失败检查 Publish Over SSH 的连通性测试是否通过业务服务器/opt/app目录是否存在且有写权限SSH 账号是否有执行 kill 和 nohup 的权限。6. 长期编码与 Agent 场景的通道选择三套 JAR 部署方案解决的是“内网无 Git 托管下怎么把本地产物推到服务器”的问题而 IDEA、Cursor 里的模型调用解决的是“开发过程中 AI 辅助怎么稳定可用”的问题。两者叠加才是完整的内网离线开发体验。如果你的场景是长期编码、频繁用 Agent 类工具建议把模型调用通道固定下来用统一的 Base URL Key Model ID 配置。Coding Plan 入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 适合需要长期稳定调用的团队。模型对话验证入口在 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 可以先用它确认 Key 和 Model ID 可用再填进 IDE。回到部署本身最后给一个实操建议三套方案里先用 IDEA External Tool 把链路跑通确认 Jenkins 空任务、Publish Over SSH、启停脚本都没问题再决定要不要升级到自研插件或 Cursor Skill。链路本身是通的换的只是触发载体。把deploy-jenkins.sh里的 JENKINS_HOST、JOB_NAME、BUILD_TOKEN 三个值改成你自己的右键跑一次看 Jenkins 控制台日志和业务服务器健康检查通了就说明整套内网离线部署站住了。
返回列表