環境変数 `VITE_PORT` によるPlaywright並列実行のサポート

basecamp/lexxy

playwright.config.jsvite.config.js にハードコードされていたポート番号を VITE_PORT 環境変数で上書き可能にしました。これにより、複数のWorktreeで並列にPlaywrightテストを実行できるようになります。

背景

これまでの実装では、テスト用Viteサーバーのポートが 5173 に固定されていたため、複数のWorktreeを同時に使用する場合に深刻な競合が発生していました。具体的には、reuseExistingServer オプションの存在により、後から起動したPlaywrightが既に別のWorktreeで起動済みのViteサーバーをそのまま再利用してしまい、意図しないWorktreeのコードに対してテストが実行されるという問題がありました。

この問題はモノレポやGit Worktreeを活用した並列開発フローで顕在化します。ポート衝突であれば起動エラーとして発見できますが、reuseExistingServer による誤った再利用は気づかないままテストが通過・失敗するため、より厄介な問題です。

技術的な変更

VITE_PORT 環境変数を読み取り、未設定時は従来通り 5173 をデフォルト値として使用するよう、2ファイルを変更しています。

playwright.config.js では、ファイル先頭で vitePort 変数を定義し、baseURLwebServer.url の両方に適用しています。

変更前:

use: {
  baseURL: "http://localhost:5173",
  ...
},
webServer: {
  command: `npx vite --config ${import.meta.dirname}/vite.config.js`,
  url: "http://localhost:5173",
  reuseExistingServer: !isCI,
},

変更後:

const vitePort = process.env.VITE_PORT || "5173"

use: {
  baseURL: `http://localhost:${vitePort}`,
  ...
},
webServer: {
  command: `npx vite --config ${import.meta.dirname}/vite.config.js`,
  url: `http://localhost:${vitePort}`,
  reuseExistingServer: !isCI,
},

vite.config.js では、server.portparseInt で数値に変換して設定しています。

変更前:

server: {
  port: 5173,
  strictPort: true,
},

変更後:

server: {
  port: parseInt(process.env.VITE_PORT || "5173", 10),
  strictPort: true,
},

playwright.config.js 側は文字列テンプレートとして扱うため文字列のまま保持し、Viteの設定ではポート番号として数値が必要なため parseInt で変換している点に注意が必要です。これにより、並列実行は VITE_PORT=5174 yarn test:browser のように起動するだけで実現できます。

設計判断

VITE_PORT という単一の環境変数playwright.config.jsvite.config.js の両方を制御する設計が採用されています。

PlaywrightのWebServerブロックはViteプロセスを子プロセスとして起動しますが、その子プロセス側(vite.config.js)も同じ環境変数を参照するため、両者の設定が自動的に同期されます。別々の変数を用意した場合、設定のズレがサイレントな障害を引き起こすリスクがあり、単一変数での制御はその問題を回避する合理的な判断です。

また、strictPort: true はこの変更前から設定されており、指定ポートが使用中の場合は別ポートにフォールバックせず即座にエラーを返します。これにより、意図しないポートでのサーバー起動を防ぎ、reuseExistingServer による誤接続のリスクをさらに低減しています。

まとめ

わずか数行の変更ながら、ハードコードされたポート番号という設定の硬直性が引き起こすWorktree並列運用の問題を根本から解消しています。VITE_PORT という単一の環境変数でPlaywrightとViteの両設定を一貫して制御する設計は、設定の同期ズレによる障害を防ぐシンプルかつ堅牢なアプローチです。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
c5ce6273

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

「リード文(総論)→背景・技術的な変更・設計判断(各論)→まとめ(結論)」という構成が明確に守られています。各セクションの役割がはっきりしており、論理的な流れが秀逸です。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

PR番号のリンク記法が、ガイドラインで推奨される `[#123](URL)` の形式ではなく `[PR #837](URL)` となっています。ファイル名付きシンタックスハイライトは正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

Playwright, Vite, Git Worktreeなどの用語を前提としており、専門知識を持つエンジニアという対象読者に完全に適合しています。冗長な説明がなく、簡潔です。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクション、各パラグラフが「総論→各論」の構造で書かれており、すべての段落がトピックセンテンスで始まっています。1段落1トピックの原則も守られており、非常に読みやすいです。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

`playwright.config.js`と`vite.config.js`のコード引用は、提供されたDiffの内容を正確に反映しています。ファイル名も一致しており、技術的な理解を正しく補助しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`reuseExistingServer`, `strictPort`, `Worktree` などの技術用語が文脈に応じて正確に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

ポート競合の問題、`reuseExistingServer` が引き起こす副作用、単一の環境変数で親子プロセスを制御する仕組みなど、技術的な説明はすべて正確かつ論理的です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張(ポート番号、問題点、解決策)は、PRのDescriptionやDiffの内容によって裏付けられています。根拠のない推測や憶測は含まれていません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#837)、ポート番号(5173)などの数値や固有名詞はすべて正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトル「環境変数 `VITE_PORT` によるPlaywright並列実行のサポート」は、PRのタイトル「Allow parallel Playwright runs via VITE_PORT env var」と完全に一致しており、内容を的確に要約しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

PR情報に含まれない外部知識(バージョンのサポート状況、リリース日程など)の追加はなく、提供された情報源に忠実です。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「これまでの実装では」といった時間表現は、PRの文脈と一致しており、事実を正確に伝えています。