|
| 1 | +# ローカル環境とCI環境のPrismaバージョン不一致解決計画 |
| 2 | + |
| 3 | +**作成日**: 2025-11-20 |
| 4 | + |
| 5 | +**優先度**: High |
| 6 | + |
| 7 | +**対象**: CI自動デプロイメント(preview、production) |
| 8 | + |
| 9 | +--- |
| 10 | + |
| 11 | +## 概要 |
| 12 | + |
| 13 | +ローカル環境で指定されているPrisma v5.22とCI環境で使用されるPrisma v7.xのバージョン不一致を解決するための計画です。 |
| 14 | + |
| 15 | +### 現象 |
| 16 | + |
| 17 | +- **エラー**: CI環境で `schema.prisma` の `url` および `directUrl` 属性が廃止されたとのエラーが発生 |
| 18 | +- **原因**: `.github/workflows/ci.yml` で `pnpm dlx prisma migrate deploy` を実行する際、レジストリから最新版(v7.x)をダウンロードしているため |
| 19 | +- **期待動作**: ローカル環境と同じPrisma v5.22(`package.json`で指定)をCI環境でも使用すること |
| 20 | + |
| 21 | +--- |
| 22 | + |
| 23 | +## 背景 |
| 24 | + |
| 25 | +### Prisma バージョン戦略 |
| 26 | + |
| 27 | +- **ローカル環境**: v5.22.0(明示的に指定) |
| 28 | +- **CI環境(現在)**: v7.x(最新版、意図しない) |
| 29 | +- **理由**: Lucia v2.7.7(認証ライブラリ)との互換性維持 |
| 30 | + |
| 31 | +### コマンドの挙動の違い |
| 32 | + |
| 33 | +| コマンド | 動作 | バージョン | |
| 34 | +| ------------------ | -------------------------------- | ---------------------------------- | |
| 35 | +| `pnpm dlx prisma` | レジストリからダウンロード&実行 | **最新版(v7.x)** | |
| 36 | +| `pnpm exec prisma` | node_modules内のバージョンを実行 | **package.json指定版(v5.22)** ✅ | |
| 37 | + |
| 38 | +**参照**: [pnpm公式ドキュメント](https://pnpm.io/cli/dlx) と [pnpm exec](https://pnpm.io/cli/exec) |
| 39 | + |
| 40 | +--- |
| 41 | + |
| 42 | +## 前提条件 |
| 43 | + |
| 44 | +1. **Lucia v2互換性**: 現在の`@lucia-auth/adapter-prisma` v3.0.2はPrisma v5対応設計 |
| 45 | + - Lucia v3も開発終了(deprecated)のため移行の必然性あり |
| 46 | + - ただし即座のアップグレードは非推奨(検証不足) |
| 47 | + |
| 48 | +2. **Prisma v7への本格移行**: 将来的に以下が必要 |
| 49 | + - `schema.prisma`から`url`/`directUrl`を`prisma.config.ts`に移行 |
| 50 | + - Lucia認証ライブラリの刷新検討 |
| 51 | + - 本対応は「今後のタスク」セクションに記載 |
| 52 | + |
| 53 | +3. **現在の選択肢**: v5.22に留まり、バージョン指定の堅牢化 |
| 54 | + |
| 55 | +--- |
| 56 | + |
| 57 | +## 修正計画 |
| 58 | + |
| 59 | +### 対象ファイル |
| 60 | + |
| 61 | +- `.github/workflows/ci.yml` |
| 62 | + |
| 63 | +### 修正内容 |
| 64 | + |
| 65 | +#### 1. preview ジョブ |
| 66 | + |
| 67 | +```yaml |
| 68 | +# 修正前 |
| 69 | +- name: Apply all pending migrations to the database |
| 70 | + run: pnpm dlx prisma migrate deploy |
| 71 | + env: |
| 72 | + DATABASE_URL: ${{ secrets.PREVIEW_DATABASE_URL }} |
| 73 | + DIRECT_URL: ${{ secrets.PREVIEW_DIRECT_URL }} |
| 74 | + |
| 75 | +# 修正後 |
| 76 | +- name: Apply all pending migrations to the database |
| 77 | + run: pnpm exec prisma migrate deploy |
| 78 | + env: |
| 79 | + DATABASE_URL: ${{ secrets.PREVIEW_DATABASE_URL }} |
| 80 | + DIRECT_URL: ${{ secrets.PREVIEW_DIRECT_URL }} |
| 81 | +``` |
| 82 | +
|
| 83 | +#### 2. production ジョブ |
| 84 | +
|
| 85 | +```yaml |
| 86 | +# 修正前 |
| 87 | +- name: Apply all pending migrations to the database |
| 88 | + run: pnpm dlx prisma migrate deploy |
| 89 | + env: |
| 90 | + DATABASE_URL: ${{ secrets.PRODUCTION_DATABASE_URL }} |
| 91 | + DIRECT_URL: ${{ secrets.PRODUCTION_DIRECT_URL }} |
| 92 | + |
| 93 | +# 修正後 |
| 94 | +- name: Apply all pending migrations to the database |
| 95 | + run: pnpm exec prisma migrate deploy |
| 96 | + env: |
| 97 | + DATABASE_URL: ${{ secrets.PRODUCTION_DATABASE_URL }} |
| 98 | + DIRECT_URL: ${{ secrets.PRODUCTION_DIRECT_URL }} |
| 99 | +``` |
| 100 | +
|
| 101 | +### 修正の効果 |
| 102 | +
|
| 103 | +| 項目 | 修正前 | 修正後 | |
| 104 | +| -------------- | ----------------------------- | --------------- | |
| 105 | +| 実行バージョン | v7.x(最新) | v5.22(指定版) | |
| 106 | +| エラー発生 | ✅ 発生(datasource url廃止) | ❌ 発生しない | |
| 107 | +| 環境一貫性 | ❌ ローカルと異なる | ✅ 統一 | |
| 108 | +| Lucia互換性 | ❌ 不安定 | ✅ 維持 | |
| 109 | +
|
| 110 | +--- |
| 111 | +
|
| 112 | +## 実装チェックリスト |
| 113 | +
|
| 114 | +### ステップ1: ファイル修正 |
| 115 | +
|
| 116 | +- [x] `.github/workflows/ci.yml` の preview ジョブ内「Apply all pending migrations to the database」ステップで `pnpm dlx` を `pnpm exec` に変更 |
| 117 | +- [x] `.github/workflows/ci.yml` の production ジョブ内「Apply all pending migrations to the database」ステップで `pnpm dlx` を `pnpm exec` に変更 |
| 118 | + |
| 119 | +### ステップ2: 動作確認 |
| 120 | + |
| 121 | +- [x] ローカルユニットテスト実行: `pnpm test:unit` ✅ パス (1683 passed | 1 skipped) |
| 122 | +- [ ] preview環境へのデプロイ実行、ログ確認(DATABASE_URL、DIRECT_URLが正しく参照されているか) |
| 123 | +- [ ] production環境へのデプロイ実行、ログ確認 |
| 124 | +- [ ] マイグレーション実行完了の確認 |
| 125 | + |
| 126 | +### ステップ3: ドキュメント |
| 127 | + |
| 128 | +- [x] このファイルに実装完了記録を追記 |
| 129 | + |
| 130 | +--- |
| 131 | + |
| 132 | +## 検証項目 |
| 133 | + |
| 134 | +| 項目 | 方法 | 期待値 | |
| 135 | +| -------------------- | ------------------------------------------------- | ------------------ | |
| 136 | +| バージョン確認 | CI ログで `prisma` コマンド実行時のバージョン表示 | v5.22.0 | |
| 137 | +| マイグレーション成功 | preview/production環境でのデプロイ完了 | エラーなし | |
| 138 | +| スキーマ整合性 | データベースのスキーマ検証 | 既存スキーマと同一 | |
| 139 | + |
| 140 | +--- |
| 141 | + |
| 142 | +## 今後のタスク(将来対応) |
| 143 | + |
| 144 | +### タスク1: Prisma v7への本格移行 |
| 145 | + |
| 146 | +**対象**: Prisma v5.22 → v7.x へのアップグレード |
| 147 | + |
| 148 | +**必要な実装**: |
| 149 | + |
| 150 | +1. `prisma/prisma.config.ts` を新規作成(datasource設定を移行) |
| 151 | +2. `prisma/schema.prisma` から `url` と `directUrl` を削除 |
| 152 | +3. `PrismaClient` の初期化時に `adapter` または `accelerateUrl` を指定 |
| 153 | +4. CI環境での環境変数設定を見直し |
| 154 | +5. すべてのテスト実行確認 |
| 155 | + |
| 156 | +**優先度**: Medium(Lucia検証後) |
| 157 | + |
| 158 | +**参照**: [Prisma v7 migration guide](https://pris.ly/d/config-datasource) |
| 159 | + |
| 160 | +### タスク2: Lucia 認証ライブラリの刷新検討 |
| 161 | + |
| 162 | +**背景**: |
| 163 | + |
| 164 | +- Lucia v2: 開発終了(レガシー) |
| 165 | +- Lucia v3: メンテナンスモード(deprecated) |
| 166 | +- Prisma v7への対応状況が不明確 |
| 167 | + |
| 168 | +**必要な検討**: |
| 169 | + |
| 170 | +1. 代替ライブラリ調査(例: Better Auth, NextAuth.js v5、Auth.js等) |
| 171 | +2. 機能要件確認(ユーザー認証、セッション管理など) |
| 172 | +3. 既存実装との互換性評価 |
| 173 | +4. 段階的移行戦略の立案 |
| 174 | +5. テストスイートの拡充 |
| 175 | + |
| 176 | +**優先度**: Medium |
| 177 | + |
| 178 | +**依存関係**: タスク1(Prisma v7)の完了後推奨 |
| 179 | + |
| 180 | +### タスク3: prisma.config.ts移行ガイド作成 |
| 181 | + |
| 182 | +**対象**: 開発チーム向けドキュメント |
| 183 | + |
| 184 | +**含める内容**: |
| 185 | + |
| 186 | +- `prisma.config.ts` の設定方法 |
| 187 | +- `schema.prisma` の移行チェックリスト |
| 188 | +- 環境変数の新しい管理方法 |
| 189 | +- よくある問題とトラブルシューティング |
| 190 | + |
| 191 | +**優先度**: Low(タスク1完了後) |
| 192 | + |
| 193 | +--- |
| 194 | + |
| 195 | +## 参考: Prisma v7 breaking changes |
| 196 | + |
| 197 | +### datasource url廃止の理由 |
| 198 | + |
| 199 | +Prisma v7では以下の設計変更により、`datasource`内で接続URLを指定することを廃止: |
| 200 | + |
| 201 | +1. **構成の分離**: スキーマ定義と環境設定を明確に分離 |
| 202 | +2. **ランタイムの柔軟性**: PrismaClientの初期化時に接続情報を指定可能に |
| 203 | +3. **Accelerate対応**: データベース接続の最適化オプション(proxy層)への対応 |
| 204 | + |
| 205 | +### v5.22で対応している属性 |
| 206 | + |
| 207 | +- ✅ `provider`(データベースプロバイダー) |
| 208 | +- ✅ `url`(環境変数参照: `env("DATABASE_URL")`) |
| 209 | +- ✅ `directUrl`(環境変数参照: `env("DIRECT_URL")`) |
| 210 | +- ✅ `shadowDatabaseUrl`(テスト・マイグレーション用DB) |
| 211 | + |
| 212 | +### v7.xで廃止された属性 |
| 213 | + |
| 214 | +- ❌ `url`(schema.prisma内での指定) |
| 215 | +- ❌ `directUrl`(schema.prisma内での指定) |
| 216 | + |
| 217 | +--- |
| 218 | + |
| 219 | +## Q&A |
| 220 | + |
| 221 | +### Q1: なぜ `prisma.config.ts` は v5.22でサポートされていないのか? |
| 222 | + |
| 223 | +**A**: `prisma.config.ts` はPrisma v6.18.0で試験的機能(Early Access)として導入されました。v5.22ではこの機能が存在しないため、使用できません。したがって、現在v5.22を使用する場合は、`schema.prisma`内で接続情報を指定する従来の方法が唯一の選択肢です。 |
| 224 | + |
| 225 | +### Q2: v5.22のままでいつまで使用可能か? |
| 226 | + |
| 227 | +**A**: 公式のサポート終了日は明記されていませんが、新機能やセキュリティ修正の提供は期待できません。v7系への移行は数ヶ月〜1年以内の実施が推奨されます。 |
| 228 | + |
| 229 | +### Q3: 修正後、スキーマファイルに変更は必要か? |
| 230 | + |
| 231 | +**A**: いいえ。修正はCIの実行コマンドのみです。`prisma/schema.prisma` は変更不要です。 |
| 232 | + |
| 233 | +--- |
| 234 | + |
| 235 | +## 実装完了記録 |
| 236 | + |
| 237 | +### 実装日 |
| 238 | + |
| 239 | +- [x] 2025-11-20 |
| 240 | + |
| 241 | +### 修正内容 |
| 242 | + |
| 243 | +- [x] preview ジョブ: `pnpm dlx` → `pnpm exec` に変更 |
| 244 | +- [x] production ジョブ: `pnpm dlx` → `pnpm exec` に変更 |
| 245 | + |
| 246 | +### テスト結果 |
| 247 | + |
| 248 | +- [x] ローカルユニットテスト: ✅ PASS (1683 tests, 1 skipped) |
| 249 | +- [ ] CI実行: ✅ / ❌(GitHub Actions実行待機中) |
| 250 | +- [ ] preview環境デプロイ: ✅ / ❌ |
| 251 | +- [ ] production環境デプロイ: ✅ / ❌ |
| 252 | +- [ ] マイグレーション実行: ✅ / ❌ |
| 253 | + |
| 254 | +### 備考 |
| 255 | + |
| 256 | +**修正内容**: |
| 257 | + |
| 258 | +- `pnpm dlx prisma migrate deploy` → `pnpm exec prisma migrate deploy` |
| 259 | +- `pnpm dlx` はレジストリから最新版(v7.x)をダウンロード実行する |
| 260 | +- `pnpm exec` は `node_modules` 内の指定版(v5.22)を実行する |
| 261 | +- 修正後、CI環境でもローカル環境と同じPrisma v5.22が使用される |
| 262 | + |
| 263 | +**得られた教訓**: |
| 264 | + |
| 265 | +1. **バージョン指定の重要性**: `pnpm dlx` と `pnpm exec` の挙動の違いを理解することが、環境の一貫性確保に不可欠 |
| 266 | +2. **コマンドの選択が与える影響**: 一見単純なコマンド名の違いが、CI/CD環境で大きな問題につながる可能性 |
| 267 | +3. **Prisma のバージョン管理**: メジャーバージョン間のbreaking changes(v5 → v7での `datasource url` 廃止)は、移行戦略とテストが重要 |
| 268 | +4. **段階的アプローチの有効性**: 即座のメジャーバージョンアップグレードより、バージョン指定の堅牢化で環境統一を優先するのが安全 |
| 269 | + |
| 270 | +--- |
| 271 | + |
| 272 | +## 参照リンク |
| 273 | + |
| 274 | +- 📖 [pnpm dlx ドキュメント](https://pnpm.io/cli/dlx) |
| 275 | +- 📖 [pnpm exec ドキュメント](https://pnpm.io/cli/exec) |
| 276 | +- 📖 [Prisma v7 datasource config](https://pris.ly/d/config-datasource) |
| 277 | +- 📖 [Prisma v7 PrismaClient config](https://pris.ly/d/prisma7-client-config) |
0 commit comments