SuperAPI AI 工具集

vercel-deploy

部署与运维

查看项目

更新于 10-15 18:13

技能介绍

用途

vercel-deploy 用于把已存在的 Vercel 项目从本地目录部署到生产环境。它被设计为非交互式执行:过程中不会挂起等待输入,不会创建新项目,也不会假设任何隐式状态。只通过本技能的 CLI 流程部署,不依赖 Vercel 的 Git 自动部署集成。

所需密钥与输入

必需密钥(来自密钥存储,作为环境变量提供):

  • VERCEL_TOKEN — 具有部署权限的访问令牌,这是唯一真正的密钥。

必需输入(以 KEY=value 形式在技能调用或任务描述中传入,需从参数解析,不从环境变量读取):

  • DEPLOY_DIR — 可部署目录的路径(例如 ./ui 或仓库根目录)
  • PROD_DOMAIN — 预期生产域名(例如 pylot.fellowship.dev)
  • VERCEL_ORG_ID — 组织/团队 ID(以 team_ 开头)
  • VERCEL_PROJECT_ID — 项目 ID(以 prj_ 开头)

这些值来自仓库 playbook(GET /admin/playbooks/<repo>),而非密钥。由操作员读取 playbook 后在调用时传入。

可选输入:

  • DEPLOY_BRANCH — 部署所用 Git 分支,未指定时默认 main,部署前总会先检出并拉取。
  • DEPLOY_AUTHOR — 已验证的 Vercel 团队成员 Git 名称,若与 DEPLOY_EMAIL 一同提供,Stage 00 会在部署前修复提交作者。仅在 Vercel 强制要求提交作者为团队成员时需要。
  • DEPLOY_EMAIL — 与作者匹配的 Git 邮箱,设置 DEPLOY_AUTHOR 时必须提供。

主要能力与执行流程

技能按阶段顺序执行,每个阶段的检查点必须通过后才进入下一阶段,状态通过 /tmp/vercel-deploy-ctx.env 在阶段间传递。

  • Stage 00 author-fix(条件性):未提供 DEPLOY_AUTHOR 时跳过。当 Vercel 强制团队成员校验(TEAM_ACCESS_REQUIRED / seatBlock)时,机器人账号会阻止 CLI 部署,修复方式是以团队成员为作者创建一个空提交。
  • Stage 01 preflight:校验密钥与输入是否存在、vercel CLI 是否可用、部署目录是否存在,并检出与拉取部署分支。
  • Stage 02 link:直接写入 .vercel/project.json(不使用 vercel link),并通过 Vercel API 校验项目存在;若不存在则停止,不创建。
  • Stage 03 deploy:非交互执行 npx vercel deploy --prod --token=... --yes,从输出中提取部署 URL。
  • Stage 04 poll:轮询 Vercel API 直到部署状态为 READY 或 ERROR,超时 120 秒。
  • Stage 05 verify:确认生产域名可达(HTTP 200、301 或 302),随后输出结果。

禁止事项

  • 绝不创建新的 Vercel 项目,若不存在则停止并报告失败。
  • 绝不假设项目自动关联,始终显式验证或写入 .vercel/project.json。
  • 绝不将 Git 仓库连接到 Vercel 项目,所有部署均为 CLI 推送。
  • 绝不运行不带 --token 和 --yes 的 vercel,否则 CLI 会永久挂起。
  • 绝不运行 vercel link,它会交互式提示,应直接写入 .vercel/project.json。
  • 绝不运行 vercel project create 或等价命令。

执行模型与错误处理

顺序执行,不跳过阶段,每个检查点都被验证;失败即停并报告。每次 vercel 或 npx vercel 调用都必须带 --token="$VERCEL_TOKEN" --yes。若任一阶段失败,打印失败阶段与具体错误,如可用则包含 Vercel API 响应体,发出失败标记,且不自动重试。

适用场景

适用于已有 Vercel 项目、需要从本地目录以非交互方式推送到生产环境的自动化部署场景,尤其适合需要绕过 Git 自动部署、以 playbook 提供的输入进行受控部署的流水线。

限制

技能不创建新项目,项目必须已存在。需预先准备 VERCEL_TOKEN 与四个必需输入。轮询阶段超时为 120 秒。失败后不自动重试。Git 连接、交互式 link 与项目创建均在禁止之列。