デプロイ
GitHub Actions CI/CDを使用してzudo-docサイトをCloudflare Pagesにデプロイする。
概要
zudo-docは完全な静的サイトジェネレーターです。pnpm buildの出力はHTML、CSS、JavaScriptファイルのディレクトリであり、どこでもデプロイできます。デフォルトのデプロイ先はCloudflare Pagesで、CI/CDの自動化にはGitHub Actionsを使用します。
CIパイプラインは合計ビルド時間を短縮するために並列ジョブに分割されています。サイト生成とドキュメント履歴の抽出は独立したジョブとして実行され、デプロイ前にマージされます。
Cloudflare Pages
ビルドされたサイトはwrangler pages deployを使用してCloudflare Pagesにデプロイされます。デプロイアーティファクトには以下が含まれます:
- Astroのビルド出力(
dist/) - 事前生成されたdocヒストリーJSONファイル(
docHistoryが有効な場合) /からサイトのベースパスへのリダイレクトルール
ℹ️ Info
/からのリダイレクトはビルド出力に含まれる静的な_redirectsファイルです。Cloudflare Pagesがネイティブに処理するため、Workerやサーバーロジックは不要です。
CIパイプラインの構造
プロジェクトでは2つのGitHub Actionsワークフローを使用します。
本番環境(main-deploy.yml)
mainへのプッシュでトリガーされます。4つのジョブが実行されます:
- build-site — シャロークローン(
fetch-depth: 1)、SKIP_DOC_HISTORY=1 pnpm buildでAstroサイトをビルド - build-history — フルクローン(
fetch-depth: 0)、@zudo-doc/doc-history-server generateを実行してすべてのコンテンツファイルのgit履歴を事前抽出 - deploy — サイトと履歴のアーティファクトをマージし、Cloudflare Pages(本番環境)にデプロイ
- notify — デプロイステータスをIFTTTウェブフックで通知
コンカレンシー: group: production-deploy, cancel-in-progress: false — 先行するデプロイはキャンセルされずに完了が許可されます。
PRチェック(pr-checks.yml)
mainを対象としたプルリクエストでトリガーされます。5つのジョブが実行されます:
- typecheck —
pnpm checkを実行(Astro型チェック) - build-site — シャロークローン、
SKIP_DOC_HISTORY=1 pnpm build、その後check:links - build-history — フルクローン、docヒストリーの生成
- e2e — Playwrightエンドツーエンドテストを実行(フルクローン、
SKIP_DOC_HISTORYなしで履歴をインラインに埋め込み) - preview — アーティファクトをマージしてCloudflare Pagesにプレビューをデプロイ、PRコメントとしてURLを投稿
コンカレンシー: group: pr-checks-{pr-number}, cancel-in-progress: true — 古い実行はCIの消費を節約するためにキャンセルされます。
プレビューデプロイ
各PRは以下のURLにプレビューデプロイを取得します:
https://pr-{number}.zudo-doc.pages.dev
URLはpreviewジョブによってPRのコメントとして自動的に投稿されます。
SKIP_DOC_HISTORY
SKIP_DOC_HISTORY=1が設定されると、Astroインテグレーションはビルド中のインライン履歴生成をスキップします。このフラグが必要な理由は、履歴生成にフルgitクローンが必要でありすべてのコミットを走査するため、メインビルドジョブ内で実行するには時間がかかりすぎるためです。
| コンテキスト | 値 | 理由 |
|---|---|---|
CI build-siteジョブ | SKIP_DOC_HISTORY=1 | 履歴は独立したbuild-historyジョブが生成する |
CI e2eジョブ | 未設定 | E2Eテストはインラインで履歴機能を検証する |
ローカルpnpm build | 未設定 | 履歴はビルド出力に直接埋め込まれる |
💡 Tip
SKIP_DOC_HISTORY=1なしでローカルでpnpm buildを実行すると、履歴生成がインラインで実行されます。遅くなりますが、独立した履歴アーティファクトなしで動作する自己完結型のdist/が生成されます。
ジョブ間のデータ共有
ビルドアーティファクトはactions/upload-artifactではなくactions/cacheを使用してジョブ間で共有されます。キャッシュキーはクロスラン汚染を防ぐためにgithub.run_idにスコープされています:
key: dist-${{ github.run_id }}
key: doc-history-${{ github.run_id }}
deploy(またはpreview)ジョブは両方のキャッシュを復元し、wrangler pages deployを呼び出す前にdist/ディレクトリをマージします。
📝 Note
ジョブ間のデータ転送にactions/cacheを使用すること(アーティファクトではなく)は、大きなZIPアーカイブのアップロードとダウンロードのオーバーヘッドを回避します。キャッシュエントリは一時的なイントラランデータに対してより効率的です。
必要なシークレット
リポジトリのSettings → Secrets and variables → Actionsで設定します:
| シークレット | 説明 |
|---|---|
CLOUDFLARE_API_TOKEN | Pagesデプロイ権限を持つCloudflare APIトークン |
CLOUDFLARE_ACCOUNT_ID | CloudflareアカウントID |
IFTTT_PROD_NOTIFY | デプロイ通知用のIFTTTウェブフックURL(オプション) |
⚠️ Warning
CLOUDFLARE_API_TOKENにはCloudflare Pages: Edit権限が必要です。アカウント全体へのアクセス権限を付与するのではなく、特定のPagesプロジェクトにスコープすることを推奨します。