Skip to content

ローカル開発DBがE2Eで毎回消える → テストDB分離 + 本番データインポート機構 #56

Description

@ryota-murakami

背景 / 不満

ローカル開発で貯めたタスクが、E2E を走らせるたびに毎回消える

根本原因は E2E 用 DB と開発用 DB が同一であること:

  • e2e/global-setup.ts が全テスト前に pnpm db:reset を実行
  • db:reset = prisma migrate reset --force && pnpm prisma:seedpackage.json
  • これが .envDATABASE_URL(= compose.yml の単一 corelive DB)をそのまま drop → migrate → seed する
  • さらに各 spec の test.beforeAll(resetDatabase)e2e/web/_helpers/db.ts)も同じ DB を reset

→ 開発中の実データを保持する場所が存在しない。

加えて「本番データをローカルで触りたい / ローカルのタスクを本番に上げたい」というニーズもあるが、Clerk の Development / Production インスタンスでユーザーIDが別物なので、単純な dump/restore では自分のデータが見えない(user_id 不一致)。


ゴール

  1. E2E が開発用データを破壊しない(最優先・低リスク)
  2. 本番データを安全にローカルへ取り込める(Clerk ID 付け替え込み)
  3. (任意)ローカルのタスクを明示的に本番へ push できる

提案

① E2E 用 DB を物理分離 ★まず最初

postgres コンテナはそのまま、DB を 2 つに分ける(別コンテナ不要):

用途 DB 名 向き先
開発 corelive_dev .envDATABASE_URL
E2E(使い捨て) corelive_test E2E 実行時のみ上書き
  • prisma/init.sqlcorelive_test も初期作成
  • e2e/global-setup.ts / _helpers/db.tsdb:reset 系を DATABASE_URL=...corelive_test 付きで実行(env 上書き)
  • これで E2E が何度 reset しても corelive_dev は無傷 ✨

→ 日々のストレスの大半はここで解消。

db:import-prod script(本番 → ローカル取り込み)

pg_dump(本番, 自分の user_id のタスクのみ)
  → dump 内の本番 Clerk user_id を ローカル dev Clerk user_id に置換
  → corelive_dev に insert
  • pnpm db:import-prod 一発で「本番の今の状態」をローカルに落とす
  • Clerk dev/prod の user_id マッピングは .env に持たせる(例: PROD_CLERK_USER_ID / LOCAL_CLERK_USER_ID
  • Clerk 側に prod→dev のユーザー同期公式機能は基本無い想定 → seed script で ID 付け替えが現実的

③ (任意)ローカル → 本番 push

  • リアルタイム同期は事故る(テストデータ本番流出)ので 明示的に叩く push script 止まりにする
  • 優先度低

進め方

  • まず ①(DB 分離)を単独 PR で。差分が小さく、E2E の挙動だけ変わる
  • ② は ① の後。Clerk ID 付け替えロジックが肝
  • ③ は必要になったら

関連ファイル

  • e2e/global-setup.ts
  • e2e/web/_helpers/db.ts
  • package.jsondb:reset / db:truncate / prisma:seed
  • compose.yml
  • prisma/init.sql
  • .envDATABASE_URL, CLERK_*

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions