personal-deploy
Personal Deploy
自动化前后端整体打包、上传和远程部署。构建在项目根目录执行,确保前端(若有)与后端打成一个可部署的 jar。本技能为通用技能,安装到 ~/.agents/skills/ 后可供 Cursor、Qoder 等引用。
安装
npx skills add http://skills.whatis.vip --skill personal-deploy -g
安装后技能根目录为 ~/.agents/skills/personal-deploy/。
自动检测
部署前自动检测以下信息,无需硬编码:
- 项目根目录: 使用当前工作区路径(Cursor workspace)
- 后端模块: 在项目根目录搜索匹配
*-backend的目录名 - 构建产物:
<后端模块>/target/<后端模块>.jar(该 jar 已含前端静态资源时即整体包)
检测命令示例:
# 在项目根目录下查找后端模块
ls -d *-backend 2>/dev/null | head -1
如果找到多个 *-backend 目录,列出并让用户选择。
服务器凭证
每个项目使用独立配置文件,按项目名命名,存储在技能根目录下的 configs/ 目录。技能通过 npx skills add http://skills.whatis.vip --skill personal-deploy -g 安装时,根目录为 ~/.agents/skills/personal-deploy/,即配置文件路径为 ~/.agents/skills/personal-deploy/configs/。Cursor、Qoder 等可引用该目录或使用各自 agent 的 skill 目录。
项目名提取规则:从后端模块名 xxx-backend 中提取前缀 xxx 作为项目名。
例如 godknows-backend → 项目名 godknows → 配置文件 configs/godknows.json。
首次部署该项目
如果 configs/<项目名>.json 不存在,使用 AskQuestion 工具询问:
| 字段 | 问题 |
|---|---|
| server_host | 服务器地址(如 root@1.2.3.4) |
| server_password | 服务器密码 |
| server_dir | 服务器上的部署目录(默认 /root/package) |
将回答保存到 configs/<项目名>.json:
{
"server_host": "root@1.2.3.4",
"server_password": "xxx",
"server_dir": "/root/package"
}
后续部署
直接读取 configs/<项目名>.json 中的凭证。
部署流程
严格按顺序执行以下步骤:
Step 1: 整体打包(前端 + 后端)
在项目根目录执行 Maven,不要只进后端目录打包:
cd <项目根目录> && mvn clean package -DskipTests -q
- 若存在
*-frontend模块且其pom.xml配置了frontend-maven-plugin,Maven 会先构建前端(npm install + build 输出到 META-INF/resources),再构建后端;后端依赖前端模块时,最终<后端模块>.jar为含前端的 fat jar。 - 若无前端模块,则仅构建后端,行为不变。
确认 exit code 为 0 后继续。
Step 2: 上传 jar
使用 skill 自带的上传脚本(位于技能根目录 scripts/upload-jar.sh)。技能根目录全局安装时为 ~/.agents/skills/personal-deploy:
bash ~/.agents/skills/personal-deploy/scripts/upload-jar.sh <项目根目录>/<后端模块>/target/<后端模块>.jar
脚本最后一行输出为下载直链 URL,提取并记录。
Step 3: 服务器下载 jar
sshpass -p '<password>' ssh -o StrictHostKeyChecking=no <host> \
"cd <server_dir> && curl -L -o <后端模块>.jar '<下载URL>'"
Step 4: 停止旧服务
sshpass -p '<password>' ssh -o StrictHostKeyChecking=no <host> \
"cd <server_dir> && ps -ef | grep <后端模块>.jar | grep -v grep | awk '{print \$2}' | xargs kill -9 2>/dev/null; echo done"
Step 5: 启动新服务
sshpass -p '<password>' ssh -o StrictHostKeyChecking=no <host> \
"cd <server_dir> && nohup java -jar <后端模块>.jar > nohup_bootstrap.log 2>&1 &"
Step 6: 验证
等待 10-15 秒后执行:
sshpass -p '<password>' ssh -o StrictHostKeyChecking=no <host> \
"ps -ef | grep <后端模块>.jar | grep -v grep && echo 'Service running'"
检查启动日志:
sshpass -p '<password>' ssh -o StrictHostKeyChecking=no <host> \
"grep -E '(Started|ERROR)' <server_dir>/nohup_bootstrap.log | tail -5"
注意事项
- 打包:必须在项目根目录执行
mvn clean package,才能把前端(若有)和后端打成一个 jar;仅在后端目录打包则不会包含前端。 - Step 4 和 Step 5 必须分开执行(否则 kill 可能连同 SSH 会话一起杀掉)
- SSH 端口等信息在
server_host中体现(如需非 22 端口可在 host 中指定)。 - 上传使用
scripts/upload-jar.sh通过临时文件服务中转,避免直接 SSH 传输超时 - 启动使用
nohup后台运行,SSH 断开后服务不受影响 - 日志写入
nohup_bootstrap.log,会覆盖上次的日志