zpaper-draft

Type to search...

to open search from anywhere

CI / CD

GitHub ActionsによるCI/CDパイプラインの設定。ブランチごとのワークフローとCloudflare Pagesへのデプロイ。

GitHub Actionsで動作するCI/CD設定です。ワークフローファイルは.github/workflows/にあります。

ワークフロー一覧

ファイルトリガーパイプライン
main-deploy.ymlmainへのpushBuild → E2E tests → Production deploy
pr-checks.ymlmain向けPRBuild → Preview deploy
preview-deploy.ymlpreview/expreview/**へのpushBuild → Preview deploy(ブランチ名付き)

main-deploy.yml: 本番デプロイ

mainブランチへのpushごとに実行されます。

ジョブフロー

  1. Build — Astroブログ(pnpm build)とドキュメントサイト(pnpm doc:build)をビルド
  2. E2E Tests — ブログのビルド出力に対してPlaywright smoke testsを実行
  3. Deploy — 両方の出力を結合し、Cloudflare Pagesに本番デプロイ(buildとtestsの両方がパスした場合のみ)

並行実行制御

同時に1つのみ実行。先行するデプロイが進行中の場合、後続の実行は待機します(キャンセルはしない)。

pr-checks.yml: PRチェック

mainブランチ向けのPRが作成・更新されるたびに実行されます。

ジョブフロー

  1. Build — Astroブログとドキュメントサイトをビルド
  2. Preview Deploy — 両方の出力を結合し、Cloudflare Pagesにプレビューデプロイし、PRコメントにプレビューURLを投稿

並行実行制御

同じPRの進行中のランは、新しいランが開始するとキャンセルされます。

preview-deploy.yml: プレビューブランチデプロイ

previewブランチとexpreview/**ブランチへのpushで実行されます。PRプレビューとは異なり、ブランチ名ベースのURLにデプロイされます。

ジョブフロー

  1. Build — Astroブログとドキュメントサイトをビルド
  2. Prepare — デプロイディレクトリにビルド出力を結合し、Cloudflare Pages Functions をコピー
  3. Deploy — ブランチ名付きでCloudflare Pagesにデプロイ
  4. Status — コミットステータスを設定、関連PRにコメント

プレビューURL

ブランチ名からデプロイURLが生成されます。

ブランチデプロイURL
previewhttps://preview.zudo-paper.pages.dev
expreview/foohttps://expreview-foo.zudo-paper.pages.dev

デプロイ先

Cloudflare Pagesにデプロイされます。

環境トリガーデプロイコマンド
Productionmainへのpushwrangler pages deploy --branch=main
PR PreviewPR作成/更新wrangler pages deploy --branch=pr-<number>
Previewpreview/expreview/**へのpushwrangler pages deploy --branch=<branch-name>

ビルドスコープ

ブログとドキュメントの両方がCIでビルドされます。

パッケージビルドコマンド出力ディレクトリ配信パス
Blog (blog/)pnpm buildblog/dist//pj/zpaper/
Doc (doc/)pnpm doc:builddoc/dist//pj/zpaper/doc/

Cloudflare Pages Functions

検索APIとキーワードログAPIはCloudflare Pages Functionsとしてデプロイされます。

ファイルベースルーティング

Cloudflare Pages Functionsはディレクトリ構造に基づいて自動的にルーティングされます。

リクエストパス関数ファイル
/pj/zpaper/api/searchfunctions/pj/zpaper/api/search.ts
/pj/zpaper/api/keyword-logsfunctions/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 deployfunctions/ディレクトリをデプロイディレクトリの兄弟として検出し、自動的に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_TOKENCloudflare APIトークン
CLOUDFLARE_ACCOUNT_IDCloudflareアカウントID
IFTTT_PROD_NOTIFY本番デプロイ通知用IFTTT Webhook