skills/whatis.vip/personal-deploy

personal-deploy

SKILL.md

Personal Deploy

自动化前后端整体打包、上传和远程部署。构建在项目根目录执行,确保前端(若有)与后端打成一个可部署的 jar。本技能为通用技能,安装到 ~/.agents/skills/ 后可供 Cursor、Qoder 等引用。

安装

npx skills add http://skills.whatis.vip --skill personal-deploy -g

安装后技能根目录为 ~/.agents/skills/personal-deploy/

自动检测

部署前自动检测以下信息,无需硬编码:

  1. 项目根目录: 使用当前工作区路径(Cursor workspace)
  2. 后端模块: 在项目根目录搜索匹配 *-backend 的目录名
  3. 构建产物: <后端模块>/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,会覆盖上次的日志
Weekly Installs
4
First Seen
12 days ago
Installed on
gemini-cli4
github-copilot4
codex4
kimi-cli4
amp4
cline4