배포 파이프라인 (Stripe / Supabase / Vercel)
Composio CLI를 사용하여 Stripe, Supabase, Vercel 전반에 걸친 단계적 릴리스를 쉘에서 조정합니다. 단일 스크립트로 전체 '출시' 시퀀스(제품/가격 업데이트, DB 마이그레이션, 프론트엔드 배포, 스모크 테스트, 체인지로그 게시)를 시작합니다.
사용 시기
- 결제, 데이터베이스, 프론트엔드를 함께 변경하는 풀스택 제품 출시.
- Stripe 가격 변경 및 Supabase 마이그레이션과 함께 Vercel 프리뷰 빌드를 프로덕션으로 승격.
- 동일한 시퀀스가 반복되어 안정성이 필요한 주간 릴리스 트레인.
사전 요구 사항
curl -fsSL https://composio.dev/install | bash
composio login
composio link stripe
composio link supabase
composio link vercel
composio link slack # 릴리스 공지용
도구 검색
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로 확인):
Stripe
STRIPE_CREATE_PRODUCTSTRIPE_CREATE_PRICESTRIPE_UPDATE_PRODUCTSTRIPE_LIST_PRICES
Supabase
SUPABASE_LIST_PROJECTSSUPABASE_RUN_SQL_QUERYSUPABASE_LIST_MIGRATIONSSUPABASE_APPLY_MIGRATION
Vercel
VERCEL_CREATE_A_NEW_DEPLOYMENTVERCEL_GET_A_DEPLOYMENT_BY_ID_OR_URLVERCEL_LIST_DEPLOYMENTSVERCEL_PROMOTE_DEPLOYMENT
파이프라인
순서가 중요합니다: Stripe → Supabase → Vercel → 검증 → 알림. 결제 변경은 DB보다 먼저, DB는 프론트엔드보다 먼저.
1. Stripe: 가격 생성 또는 업데이트
composio execute STRIPE_CREATE_PRICE -d '{
"product":"prod_abc123",
"unit_amount":2900,
"currency":"usd",
"recurring":{"interval":"month"},
"lookup_key":"team-plan-v2"
}'
2. 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'\'';"
}'
적용 후 스키마 확인:
composio execute SUPABASE_RUN_SQL_QUERY -d '{
"project_id":"abcxyz",
"query":"select column_name from information_schema.columns where table_name='\''teams'\'' and column_name='\''tier'\'';"
}'
3. Vercel: 배포 + 승격
# Git ref에서 프로덕션 배포 트리거
composio execute VERCEL_CREATE_A_NEW_DEPLOYMENT -d '{
"name":"web",
"target":"production",
"gitSource":{"type":"github","ref":"main","repoId":123456}
}'
준비될 때까지 폴링:
composio execute VERCEL_GET_A_DEPLOYMENT_BY_ID_OR_URL -d '{"idOrUrl":"dpl_xxx"}' \
| jq '.readyState'
4. 검증
curl -fsS https://app.acme.com/api/health
composio execute SUPABASE_RUN_SQL_QUERY -d '{
"project_id":"abcxyz","query":"select count(*) from teams where tier is null;"
}'
5. 알림
composio execute SLACK_SEND_MESSAGE -d '{
"channel":"releases",
"text":"✅ Team Plan v2 출시됨. Stripe 가격 `team-plan-v2` 활성화, Supabase 마이그레이션 적용됨, Vercel 프로덕션 승격됨."
}'
파이프라인을 워크플로 파일로
scripts/ship.ts, composio run --file scripts/ship.ts -- --ref main으로 실행:
const ref = process.argv[process.argv.indexOf("--ref") + 1] ?? "main";
// 1. Stripe
const price = await execute("STRIPE_CREATE_PRICE", {
product: "prod_abc123", unit_amount: 2900, currency: "usd",
recurring: { interval: "month" }, lookup_key: "team-plan-v2"
});
// 2. Supabase
await execute("SUPABASE_APPLY_MIGRATION", {
project_id: "abcxyz",
name: "add_team_tier_column",
query: "alter table teams add column tier text default 'free';"
});
// 3. Vercel
const dep = await execute("VERCEL_CREATE_A_NEW_DEPLOYMENT", {
name: "web", target: "production",
gitSource: { type: "github", ref, repoId: 123456 }
});
// 4. 준비 완료까지 대기
let state = "QUEUED";
while (state !== "READY" && state !== "ERROR") {
await new Promise(r => setTimeout(r, 4000));
const d = await execute("VERCEL_GET_A_DEPLOYMENT_BY_ID_OR_URL", { idOrUrl: dep.id });
state = d.readyState;
}
if (state !== "READY") throw new Error("Vercel 배포 실패");
// 5. 알림
await execute("SLACK_SEND_MESSAGE", {
channel: "releases",
text: `✅ ${ref} 출시됨. Stripe 가격 ${price.id}, Vercel ${dep.url}.`
});
롤백 계획
검증에 실패하면 역순으로 되돌립니다:
- Vercel:
VERCEL_PROMOTE_DEPLOYMENT로 이전 배포 ID로 승격. - Supabase: 다운 마이그레이션 적용 (배포 전에 항상 쌍이 되는
down.sql을 작성). - Stripe:
STRIPE_UPDATE_PRODUCT로 새 가격 비활성화 (active:false); 삭제하지 마세요 — Stripe 객체는 사실상 변경 불가능하며 과거 청구서에 영향을 줍니다. - Slack: 롤백 공지.
문제 해결
- Stripe 가격이 보이지만 체크아웃에 여전히 예전 가격이 표시됨 → 앱 측 캐시 문제;
lookup_key가 체크아웃에서 가져오는 키와 일치하는지 확인. - Supabase 마이그레이션이 멈춤 → 다른 연결이 락을 보유 중;
select pid, state, query from pg_stat_activity where state <> 'idle';실행. - Vercel 배포가
QUEUED에서 멈춤 →VERCEL_GET_A_DEPLOYMENT_BY_ID_OR_URL에?logs=1을 추가하여 빌드 로그 확인. - 순서 버그 (프론트엔드가 마이그레이션 적용 전에 컬럼을 읽음) → 항상 파이프라인을 직렬화; Stripe/Supabase/Vercel 간에
--parallel을 절대 사용하지 마세요.
전체 CLI 참조: docs.composio.dev/docs/cli