CI / CD
GitHub ActionsによるCI/CDパイプラインの設定。ブランチごとのワークフローとCloudflare Pagesへのデプロイ。
GitHub Actionsで動作するCI/CD設定です。ワークフローファイルは.github/workflows/にあります。
ワークフロー一覧
| ファイル | トリガー | パイプライン |
|---|---|---|
main-deploy.yml | mainへのpush | Build → E2E tests → Production deploy |
pr-checks.yml | main向けPR | Build → Preview deploy |
preview-deploy.yml | preview/expreview/**へのpush | Build → Preview deploy(ブランチ名付き) |
main-deploy.yml: 本番デプロイ
mainブランチへのpushごとに実行されます。
ジョブフロー
- Build — Astroブログ(
pnpm build)とドキュメントサイト(pnpm doc:build)をビルド - E2E Tests — ブログのビルド出力に対してPlaywright smoke testsを実行
- Deploy — 両方の出力を結合し、Cloudflare Pagesに本番デプロイ(buildとtestsの両方がパスした場合のみ)
並行実行制御
同時に1つのみ実行。先行するデプロイが進行中の場合、後続の実行は待機します(キャンセルはしない)。
pr-checks.yml: PRチェック
mainブランチ向けのPRが作成・更新されるたびに実行されます。
ジョブフロー
- Build — Astroブログとドキュメントサイトをビルド
- Preview Deploy — 両方の出力を結合し、Cloudflare Pagesにプレビューデプロイし、PRコメントにプレビューURLを投稿
並行実行制御
同じPRの進行中のランは、新しいランが開始するとキャンセルされます。
preview-deploy.yml: プレビューブランチデプロイ
previewブランチとexpreview/**ブランチへのpushで実行されます。PRプレビューとは異なり、ブランチ名ベースのURLにデプロイされます。
ジョブフロー
- Build — Astroブログとドキュメントサイトをビルド
- Prepare — デプロイディレクトリにビルド出力を結合し、Cloudflare Pages Functions をコピー
- Deploy — ブランチ名付きでCloudflare Pagesにデプロイ
- Status — コミットステータスを設定、関連PRにコメント
プレビューURL
ブランチ名からデプロイURLが生成されます。
| ブランチ | デプロイURL |
|---|---|
preview | https://preview.zudo-paper.pages.dev |
expreview/foo | https://expreview-foo.zudo-paper.pages.dev |
デプロイ先
Cloudflare Pagesにデプロイされます。
| 環境 | トリガー | デプロイコマンド |
|---|---|---|
| Production | mainへのpush | wrangler pages deploy --branch=main |
| PR Preview | PR作成/更新 | wrangler pages deploy --branch=pr-<number> |
| Preview | preview/expreview/**へのpush | wrangler pages deploy --branch=<branch-name> |
ビルドスコープ
ブログとドキュメントの両方がCIでビルドされます。
| パッケージ | ビルドコマンド | 出力ディレクトリ | 配信パス |
|---|---|---|---|
Blog (blog/) | pnpm build | blog/dist/ | /pj/zpaper/ |
Doc (doc/) | pnpm doc:build | doc/dist/ | /pj/zpaper/doc/ |
Cloudflare Pages Functions
検索APIとキーワードログAPIはCloudflare Pages Functionsとしてデプロイされます。
ファイルベースルーティング
Cloudflare Pages Functionsはディレクトリ構造に基づいて自動的にルーティングされます。
| リクエストパス | 関数ファイル |
|---|---|
/pj/zpaper/api/search | functions/pj/zpaper/api/search.ts |
/pj/zpaper/api/keyword-logs | functions/pj/zpaper/api/keyword-logs.ts |
依存関係
Pages FunctionsはTypeScriptで記述され、デプロイ時にwranglerのesbuildでバンドルされます。外部依存関係(minisearch)はデプロイディレクトリにnpm installでインストールされます。
データストレージ
キーワードログの保存にCloudflare KVを使用しています。KEYWORD_LOGSバインディングでwrangler.tomlに設定されています。
本番サイトでのプロキシチェーン
本番サイト(takazudomodular.com)では、zmodプロジェクトの設定で/pj/zpaper/*がzpaper Cloudflare Pagesサイト(zudo-paper.pages.dev)にプロキシされます。APIリクエストもこのプロキシ経由で転送され、Pages Functionsで処理されます。
takazudomodular.com/pj/zpaper/api/search
→ zudo-paper.pages.dev/pj/zpaper/api/search (プロキシ)
→ functions/pj/zpaper/api/search.ts (Pages Function)
デプロイディレクトリ構造
Cloudflare Pagesにデプロイされる結合出力の構造です。wrangler pages deployはfunctions/ディレクトリをデプロイディレクトリの兄弟として検出し、自動的にesbuildでバンドルします。
node_modules/ ← Functions依存関係(minisearch等)
functions/ ← Cloudflare Pages Functions(wranglerが自動検出)
pj/
zpaper/
api/
search.ts
keyword-logs.ts
search-data.json
deploy/ ← 静的アセット出力ディレクトリ
_redirects ← リダイレクトルール
pj/
zpaper/ ← Blog (Astro static export)
articles/
tags/
search/
...
doc/ ← Doc site (zudo-doc/Astro build)
docs/
...
Secrets
GitHub Actionsで使用されるシークレット。リポジトリのSettings → Secretsで設定します。
| Secret | 用途 |
|---|---|
CLOUDFLARE_API_TOKEN | Cloudflare APIトークン |
CLOUDFLARE_ACCOUNT_ID | CloudflareアカウントID |
IFTTT_PROD_NOTIFY | 本番デプロイ通知用IFTTT Webhook |