运维部署
跨 Stripe/Supabase/Vercel…
适用于一次发布同时涉及 Stripe 计费、Supabase 数据库和 Vercel 前端的场景,按固定顺序可靠执行并支持回滚。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
跨 Stripe/Supabase/Ve特定
解决思路
- 按固定顺序执行:Stripe → Supabase → Vercel → Verify → Announce;先改计费,再改数据库,最后改前端,并串行执行。
- 用 `composio search "create price" --toolkits stripe`、`composio search "apply migration" --toolkits supabase`、`composio search "create deployment" --toolkits vercel` 发现可用工具。
- 用 `composio tools list stripe`、`composio tools list supabase`、`composio tools list vercel` 列出工具,并用 `--get-schema` 校验常见 slug:Stripe 的 `STRIPE_CREATE_PRODUCT`、`STRIPE_CREATE_PRICE`、`STRIPE_UPDATE_PRODUCT`、`STRIPE_LIST_PRICES`;Supabase 的 `SUPABASE_LIST_PROJECTS`、`SUPABASE_RUN_SQL_QUERY`、`SUPABASE_LIST_MIGRATIONS`、`SUPABASE_APPLY_MIGRATION`;Vercel 的 `VERCEL_CREATE_A_NEW_DEPLOYMENT`、`VERCEL_GET_A_DEPLOYMENT_BY_ID_OR_URL`、`VERCEL_LIST_DEPLOYMENTS`、`VERCEL_PROMOTE_DEPLOYMENT`。
- 在 Stripe 创建或更新价格:执行 `composio execute STRIPE_CREATE_PRICE -d '{"product":"prod_abc123","unit_amount":2900,"currency":"usd","recurring":{"interval":"month"},"lookup_key":"team-plan-v2"}'`。
- 在 Supabase 应用迁移:执行 `composio execute SUPABASE_APPLY_MIGRATION -d '{...}'`,传入 `project_id: abcxyz`、`name: add_team_tier_column`、`query: alter table teams add column tier text default 'free';`。
- 迁移后做 schema 校验:执行 `composio execute SUPABASE_RUN_SQL_QUERY -d '{...}'`,查询 `select column_name from information_schema.columns where table_name='teams' and column_name='tier';`。
- 在 Vercel 触发生产部署:执行 `composio execute VERCEL_CREATE_A_NEW_DEPLOYMENT -d '{...}'`,传入 `name: web`、`target: production`、`gitSource: {type: github, ref: main, repoId: 123456}`,从 git ref 部署。
- 轮询 Vercel 直到就绪:执行 `composio execute VERCEL_GET_A_DEPLOYMENT_BY_ID_OR_URL -d '{"idOrUrl":"dpl_xxx"}' | jq '.readyState'`。
- 验证部署:执行 `curl -fsS https://app.acme.com/api/health`,并执行 `SUPABASE_RUN_SQL_QUERY` 查询 `select count(*) from teams where tier is null;`。
- 发送发布通知:执行 `composio execute SLACK_SEND_MESSAGE -d '{...}'`,向 `releases` 频道发送消息,说明 Stripe price `team-plan-v2` 已上线、Supabase migration 已应用、Vercel production 已 promote。
- 将流水线写成工作流文件 `scripts/ship.ts`,用 `composio run --file scripts/ship.ts -- --ref main` 运行;从 argv 解析 `--ref`,默认 `main`。
- 在 `scripts/ship.ts` 中依次 `await execute("STRIPE_CREATE_PRICE", {...})` 创建价格,传入 product、unit_amount、currency、recurring、lookup_key。
- 在 `scripts/ship.ts` 中依次 `await execute("SUPABASE_APPLY_MIGRATION", {...})` 应用迁移,传入 project_id、name、query。
- 在 `scripts/ship.ts` 中依次 `await execute("VERCEL_CREATE_A_NEW_DEPLOYMENT", {...})` 创建生产部署,传入 name、target、gitSource。
- 在 `scripts/ship.ts` 中轮询等待:`while (state !== "READY" && state !== "ERROR")`,每 4000ms 调用 `VERCEL_GET_A_DEPLOYMENT_BY_ID_OR_URL` 读取 `readyState`;若最终不是 `READY` 则 `throw new Error("Vercel deploy failed")`。
- 在 `scripts/ship.ts` 中最后 `await execute("SLACK_SEND_MESSAGE", {...})` 通知发布结果,包含 ref、Stripe price id、Vercel URL。
- 若验证失败,按逆序回滚:Vercel → Supabase → Stripe → Slack。
- Vercel 回滚:用 `VERCEL_PROMOTE_DEPLOYMENT` 恢复到上一个 deployment ID。
- Supabase 回滚:应用 down migration;发布前必须始终写好配对的 `down.sql`。
- Stripe 回滚:用 `STRIPE_UPDATE_PRODUCT` 将新价格设为 `active:false` 隐藏;不要删除,因为 Stripe 对象实际不可变且影响历史发票。
- Slack 回滚:发送回滚通知。
- 排障 Stripe:若 Stripe price 可见但 checkout 仍显示旧价格,检查应用侧缓存,并确认 checkout 获取的是正确的 `lookup_key`。
- 排障 Supabase:若 migration 卡住,说明另一个连接持有锁;运行 `select pid, state, query from pg_stat_activity where state <> 'idle';`。
- 排障 Vercel:若部署卡在 `QUEUED`,用 `VERCEL_GET_A_DEPLOYMENT_BY_ID_OR_URL` 加 `?logs=1` 查看构建日志。
- 排障顺序错误:若前端在 migration 应用前读取列,始终串行化流水线;绝不要跨 Stripe/Supabase/Vercel 使用 `--parallel`。
适用边界 · 注意事项
- 未安装 Composio CLI、未 `composio login`,或未 `composio link stripe/supabase/vercel/slack` 时不要用。
- 需要完全独立、并行执行各平台变更,或不希望依赖 Composio/Stripe/Supabase/Vercel/Slack 时不要用。
- 没有配对 down migration 或可回滚的上一版 Vercel deployment 时,不要直接做生产发布/回滚流程。