コンテンツにスキップ

第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.jsonc

turbo.json のパイプライン定義

{
"$schema": "https://turbo.build/schema.json",
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"]
},
"deploy": {
"dependsOn": ["build"]
}
}
}

GitHub Actions での差分デプロイワークフロー

Turborepoの --filter 機能を使い、Gitの直前コミットから変更があったWorkerのみをデプロイします。

.github/workflows/deploy.yml
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リポジトリで一元管理する開発手法。型定義や設定の共有が極めて容易になります。