第22章: Monorepo環境での複数Worker差分デプロイ
個人開発プロダクトが成長すると、「メインWebアプリ(Pages)」「認証サービス(Worker)」「決済・Webhook処理(Worker)」「バッチ(Cron Worker)」など複数のプロジェクトを抱えることになります。 これを単一のリポジトリ(Monorepo)で管理し、変更のあったパッケージのみを差分ビルド・デプロイする構成を解説します。
ディレクトリ構成例(pnpm workspace)
my-saas/├── package.json├── pnpm-workspace.yaml├── turbo.json├── packages/│ ├── shared/ # 共通TypeScript型定義・ユーティリティ│ │ ├── package.json│ │ └── src/index.ts├── apps/│ ├── web/ # Cloudflare Pages(React / Next.js / Astro)│ │ ├── package.json│ │ └── wrangler.jsonc│ ├── api-gateway/ # Cloudflare Worker(メインHono API)│ │ ├── package.json│ │ └── wrangler.jsonc│ └── stripe-webhook/ # Cloudflare Worker(決済専用エンドポイント)│ ├── package.json│ └── wrangler.jsoncturbo.json のパイプライン定義
{ "$schema": "https://turbo.build/schema.json", "tasks": { "build": { "dependsOn": ["^build"], "outputs": ["dist/**"] }, "deploy": { "dependsOn": ["build"] } }}GitHub Actions での差分デプロイワークフロー
Turborepoの --filter 機能を使い、Gitの直前コミットから変更があったWorkerのみをデプロイします。
name: Monorepo Deploy
on: push: branches: [main]
jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 2
- uses: pnpm/action-setup@v3 with: version: 9
- name: Deploy changed apps only run: pnpm turbo run deploy --filter=...[HEAD^1] env: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}変更のないWorkerはビルドキャッシュが効いてスキップされ、CI/CD実行時間が大幅に短縮されます。
💡 用語解説コラム
[!NOTE] Monorepo (モノレポ)
複数の関連するアプリ(フロントエンド、API、バッチ)や共有ライブラリを単一のGitリポジトリで一元管理する開発手法。型定義や設定の共有が極めて容易になります。