CI/CD設計書 - GitHub Actionsによる自動デプロイ & AI投稿
GitHub Actionsを活用したCI/CDパイプラインの設計書。自動ビルドからCloudflare Pagesへのデプロイ、Pagefindインデックス生成、AI記事自動生成まで、ワークフロー設計の全体像を解説します。
はじめに
本記事は、ブログシステムの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_dispatch | AI記事の自動生成・コミット・デプロイ起動 |
パイプラインフロー
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)で完結します:
actions/checkout@v4- リポジトリのチェックアウトactions/setup-node@v4- Node.js 22のセットアップnpm ci- 依存関係の厳密インストールnpm run build- Astroによる静的サイトビルド(出力先dist/)npx pagefind --site dist- 全文検索インデックスの生成_site/への配置 -dist/を_site/blog-modern/へコピーし、ルートには/blog-modern/へのリダイレクトHTMLを配置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
フォールバック戦略
- Claude Code CLI(サブスクリプション認証)を最初に試行
- 失敗時は Claude API にフォールバック
- さらに失敗時は OpenAI API にフォールバック
- すべて失敗時はワークフローをエラー終了
手動投稿(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_TOKEN | Cloudflare Pagesデプロイ認証(Pages編集権限のみの最小権限トークン) | deploy.yml | ○ |
CLOUDFLARE_ACCOUNT_ID | Cloudflareアカウント識別子 | deploy.yml | ○ |
CLAUDE_CODE_OAUTH_TOKEN | Claude Code CLI認証(サブスクリプション) | ai-auto-post.yml | ○ |
ANTHROPIC_API_KEY | Claude API呼び出し(フォールバック) | ai-auto-post.yml | △ |
OPENAI_API_KEY | OpenAI 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ダッシュボード |
障害対応
ビルド失敗時
- Actionsログでエラー内容を確認
- ローカルで
npm run buildを実行し再現確認 - コード修正 → push → 自動リビルド
デプロイ失敗時
- wranglerのエラーログを確認(トークン無効・権限不足・プロジェクト名誤りが典型)
CLOUDFLARE_API_TOKEN/CLOUDFLARE_ACCOUNT_IDのSecrets設定を確認- 必要に応じてActionsから「Deploy Blogs」を
workflow_dispatchで手動再実行
AI投稿後にデプロイが走らないとき
- ai-auto-postのログで
gh workflow run deploy.ymlステップの成否を確認 - ワークフローの
permissions.actions: writeが設定されているか確認
AI API失敗時
- APIキーの有効性を確認
- APIの利用制限を確認
- フォールバックプロバイダーの状態を確認
- 必要に応じて手動で
workflow_dispatchから再実行
まとめ
本CI/CD設計は、「push → 自動ビルド → Pagefindインデックス生成 → Cloudflare Pagesへ自動デプロイ」と「スケジュール → AI記事生成 → 自動コミット → デプロイの明示dispatch」の2つのパイプラインを実現します。リポジトリを非公開に保ったまま、運用コストゼロで自動化されたブログ運用基盤を提供します。本記事はダイジェスト版で、完全版の設計書はダウンロードページからMarkdownファイルとして入手できます。
※ 本記事の内容は執筆時点の情報であり、正確性を保証するものではありません。ご利用の際は免責事項をご確認ください。
Related / 関連記事
関連記事
AI自動投稿パイプライン構築記 - 寝ている間にブログが更新される仕組み
毎月1日・15日の深夜3時、AIが記事を書いてこのブログに公開されるまでを人手ゼロで回す仕組みの構築記。ネタ切れ対策のキュー、Claude Codeのヘッドレス実行、cronの時差の罠、品質をプロンプトで縛る話まで。
基本設計書 - 社内ブログシステム
Astroで構築しCloudflare Pagesでホスティングする社内マイブログシステムの基本設計書。システム構成、技術スタック選定理由、機能仕様、データ設計、セキュリティ設計を網羅します。
Comments / コメント