Blog 設計書

CI/CD設計書 - GitHub Actionsによる自動デプロイ & AI投稿

GitHub Actionsを活用したCI/CDパイプラインの設計書。自動ビルドからCloudflare Pagesへのデプロイ、Pagefindインデックス生成、AI記事自動生成まで、ワークフロー設計の全体像を解説します。

11 min read

はじめに

本記事は、ブログシステムのCI/CD設計書をブログ記事として公開するものです。GitHub Actionsを中心としたパイプライン設計、AI自動投稿ワークフロー、セキュリティ設計について解説します。

パイプライン概要

ワークフロー一覧

ワークフロートリガー目的
deploy.yml(Deploy Blogs)push (main, blog-modern/** 変更時) / workflow_dispatchビルド・検索インデックス生成・Cloudflare Pagesへのデプロイ
ai-auto-post.yml(AI Auto Post)schedule / workflow_dispatchAI記事の自動生成・コミット・デプロイ起動

パイプラインフロー

flowchart LR
    A["push /<br/>workflow_dispatch"] --> B["Checkout<br/>+ Node.js 22"]
    B --> C["npm ci"]
    C --> D["Astro Build"]
    D --> E["Pagefind<br/>インデックス生成"]
    E --> F["_site/ へ配置<br/>(ルートは /blog-modern/<br/>へリダイレクト)"]
    F --> G["wrangler pages deploy<br/>→ Cloudflare Pages"]

デプロイワークフロー詳細

トリガー設定

on:
  push:
    branches: [main]
    paths:
      - "blog-modern/**"
  workflow_dispatch:

パスフィルターにより、blog-modern/ 配下に変更がある場合のみワークフローが実行されます。workflow_dispatch はAI自動投稿からの明示起動にも使用します(理由は後述)。

ジョブ構成

単一の build-deploy ジョブ(ubuntu-latest)で完結します:

  1. actions/checkout@v4 - リポジトリのチェックアウト
  2. actions/setup-node@v4 - Node.js 22のセットアップ
  3. npm ci - 依存関係の厳密インストール
  4. npm run build - Astroによる静的サイトビルド(出力先 dist/
  5. npx pagefind --site dist - 全文検索インデックスの生成
  6. _site/ への配置 - dist/_site/blog-modern/ へコピーし、ルートには /blog-modern/ へのリダイレクトHTMLを配置
  7. npx wrangler@4 pages deploy _site --project-name=dawneel-blog --branch=main - Cloudflare Pagesへデプロイ

環境設定

permissions:
  contents: read

concurrency:
  group: pages
  cancel-in-progress: true
  • permissions: デプロイはリポジトリへ書き込まないため contents: read のみの最小権限
  • concurrency: 新しいデプロイ開始時に進行中のデプロイをキャンセル(常に最新コミットを配信)
  • 認証: CLOUDFLARE_API_TOKEN(Pages編集権限のみ)と CLOUDFLARE_ACCOUNT_ID をGitHub Secretsから環境変数として注入

公開URL

パス内容
//blog-modern/ へリダイレクト
/blog-modern/ブログ本体(https://dawneel.lacue.uk/blog-modern/

AI自動投稿ワークフロー

スケジュール設定

on:
  schedule:
    - cron: "0 9 1,15 * *" # 毎月1日・15日 18:00 JST
  workflow_dispatch:

手動実行(workflow_dispatch)では、トピック(省略時はtopics.jsonから自動選択)とAIプロバイダー(claude / openai)を指定できます。

生成プロセスフロー

flowchart TD
    A["トリガー発火<br/>(cron / 手動)"] --> B["トピック選択<br/>(topics.json / 指定)"]
    B --> C["AI API呼び出し<br/>(Claude / OpenAI)"]
    C --> D["Markdown生成<br/>(frontmatter + 本文)"]
    D --> E["git commit & push"]
    E --> F["deploy.yml を<br/>明示的に dispatch"]

トピック管理

scripts/topics.json でトピックのキューを管理:

{
  "topics": [
    {
      "title": "トピック名",
      "category": "AI入門",
      "tags": ["AI", "入門"],
      "audience": "IT未経験の新卒エンジニア",
      "used": false
    }
  ]
}

--auto フラグ指定時、used: false のトピックを先頭から順に選択し、生成後に used: true に更新します。あらかじめキューに積んだテーマを月2回のペースで消費していく設計です。

デプロイ起動の設計判断

GitHub Actionsの仕様として、GITHUB_TOKEN によるpushは他ワークフローのpushトリガーを発火しません(ワークフローの無限連鎖を防ぐための制限)。このため、記事をpushしただけではデプロイが走らず、gh workflow run でデプロイワークフローを明示的にdispatchしています。

git commit -m "feat: auto-generated blog post [ai-post]"
git push
# Pushes made with GITHUB_TOKEN never fire the push trigger of
# other workflows, so dispatch the deploy workflow explicitly.
gh workflow run deploy.yml --ref main

これに伴い、ワークフローの権限には contents: write(コミット用)に加えて actions: write(dispatch用)を付与しています。

permissions:
  contents: write
  actions: write

フォールバック戦略

  1. Claude Code CLI(サブスクリプション認証)を最初に試行
  2. 失敗時は Claude API にフォールバック
  3. さらに失敗時は OpenAI API にフォールバック
  4. すべて失敗時はワークフローをエラー終了

手動投稿(Claude Code連携)

手動枠の記事はClaude Codeとの対話で作成します。自動投稿と異なり、必ずユーザーレビューを通してから公開する運用です。

ユーザー: 記事の作成を指示


Claude Code: 記事生成 → src/content/blog/ に保存


ユーザー: レビュー・修正指示 → 承認


git commit & push(運営者の認証情報)


deploy.yml が push トリガーで自動起動

運営者自身のpushは GITHUB_TOKEN ではないため、pushトリガーが通常どおり発火します。明示dispatchが必要なのはAI自動投稿ワークフローのみです。

手動投稿 vs 自動投稿

項目手動(Claude Code)自動(GitHub Actions)
トリガーユーザーの指示cronスケジュール(毎月1日・15日)
トピックユーザー指定topics.jsonから自動選択
レビューユーザーレビュー必須なし(自動公開)
デプロイ起動pushトリガーgh workflow run による明示dispatch
投稿頻度随時月2回

ブランチ戦略

個人ブログのため、main直接運用を採用:

main ─────●────●────●────●────●────▶
           │    │    │    │    │
          手動  AI   手動  AI   CI
          投稿  自動  投稿  自動  修正
  • 大きな変更時のみ feature/xxx ブランチを作成
  • mainへのpush(blog-modern/** の変更)で自動デプロイが発火

シークレット管理

シークレット名用途使用ワークフロー必須
CLOUDFLARE_API_TOKENCloudflare Pagesデプロイ認証(Pages編集権限のみの最小権限トークン)deploy.yml
CLOUDFLARE_ACCOUNT_IDCloudflareアカウント識別子deploy.yml
CLAUDE_CODE_OAUTH_TOKENClaude Code CLI認証(サブスクリプション)ai-auto-post.yml
ANTHROPIC_API_KEYClaude API呼び出し(フォールバック)ai-auto-post.yml
OPENAI_API_KEYOpenAI API(フォールバック)ai-auto-post.yml
  • GitHub Secretsで管理(リポジトリ設定 → Secrets and variables → Actions)
  • ワークフロー内で ${{ secrets.XXX }} として参照
  • コードやログに露出しない設計(Actionsが自動マスク)

監視・通知

GitHub標準通知

  • ワークフロー失敗時にメール通知(GitHub設定に準拠)
  • Actionsタブでワークフロー実行履歴を確認可能

監視対象

項目確認方法
ビルド成功率Actions → ワークフロー実行履歴
デプロイ状態Cloudflare Pagesダッシュボード(Deployments)
AI投稿成功率ai-auto-postワークフローログ
API使用量Anthropic/OpenAIダッシュボード

障害対応

ビルド失敗時

  1. Actionsログでエラー内容を確認
  2. ローカルで npm run build を実行し再現確認
  3. コード修正 → push → 自動リビルド

デプロイ失敗時

  1. wranglerのエラーログを確認(トークン無効・権限不足・プロジェクト名誤りが典型)
  2. CLOUDFLARE_API_TOKEN / CLOUDFLARE_ACCOUNT_ID のSecrets設定を確認
  3. 必要に応じてActionsから「Deploy Blogs」を workflow_dispatch で手動再実行

AI投稿後にデプロイが走らないとき

  1. ai-auto-postのログで gh workflow run deploy.yml ステップの成否を確認
  2. ワークフローの permissions.actions: write が設定されているか確認

AI API失敗時

  1. APIキーの有効性を確認
  2. APIの利用制限を確認
  3. フォールバックプロバイダーの状態を確認
  4. 必要に応じて手動で workflow_dispatch から再実行

まとめ

本CI/CD設計は、「push → 自動ビルド → Pagefindインデックス生成 → Cloudflare Pagesへ自動デプロイ」と「スケジュール → AI記事生成 → 自動コミット → デプロイの明示dispatch」の2つのパイプラインを実現します。リポジトリを非公開に保ったまま、運用コストゼロで自動化されたブログ運用基盤を提供します。本記事はダイジェスト版で、完全版の設計書はダウンロードページからMarkdownファイルとして入手できます。

※ 本記事の内容は執筆時点の情報であり、正確性を保証するものではありません。ご利用の際は免責事項をご確認ください。

Share

Related / 関連記事

関連記事

Comments / コメント

コメント