開発効率化

Codex ProでGitHub Actionsからブログ記事を自動生成する方法

Codex CLIをGitHub Actionsで非対話実行し、MDX記事、サムネイル、NewsSection更新まで自動生成する構成を解説します。Next.jsとFirestoreを使うブログ運用に合わせた実践例です。

2026年6月18日
CodexGitHub Actions自動化Next.jsFirestore
Codex ProでGitHub Actionsからブログ記事を自動生成する方法

はじめに

ブログ運用で、こんな作業が積み残しになっていませんか?

  • 技術ニュースを調べて、記事テーマを決める
  • MDXのfrontmatter、本文、Mermaid図、コード例を書く
  • サムネイル画像を用意し、画像レジストリを更新する
  • Next.jsの一覧コンポーネントに新着記事を追加する
  • 最後に yarn build で壊れていないか確認する

この一連の作業は、判断が必要なので単純なスクリプトだけでは扱いにくい一方、毎回の型はかなり決まっています。そこで使えるのが Codex CLIの非対話実行GitHub Actions の組み合わせです。

本記事では、架空の業務ブログ「OpsNote」を題材に、Codex Pro利用者がGitHub Actionsからブログ記事生成を自動化する設計を解説します。CI/CDではAPIキー認証を基本にし、ChatGPTログイン済みの ~/.codex/auth.json をSecretに入れる方式は、信頼できるプライベートCI向けの応用として扱います。

全体像

今回作るワークフローは、毎朝または手動実行でCodexを起動し、リポジトリ内のルールを読ませて、記事生成からビルド検証まで行う構成です。

ポイントは、Codexに「自由にブログを書いて」と渡さないことです。既存記事確認、画像レジストリ確認、公式情報確認、ビルド検証までをチェックリスト化します。

役割使うもの理由
記事生成codex execCIでTUIを開かずにCodexを実行できる
実行基盤GitHub Actionscronと手動実行を両方扱える
コンテンツMDXNext.jsブログと相性が良い
状態管理Firestore生成履歴や承認状態を後から参照できる
検証yarn build公開前にMDXやTypeScriptの破損を検出する

事前準備

Codex CLIの非対話実行は codex exec で行います。公式ドキュメント上でも、CIやスケジュールジョブのように対話TUIを開けない場面向けの実行方法として説明されています。

認証は次のように分けます。

方法向いているケース注意点
OPENAI_API_KEY一般的なCI/CD、自動化OpenAI Platformの従量課金になる
CODEX_ACCESS_TOKENBusiness / EnterpriseでChatGPT workspaceの統制を使う自動化作成権限と期限管理が必要
CODEX_AUTH_JSONChatGPTログイン済みCLIを信頼CIへ持ち込む応用auth.json はパスワード同等に扱う

GitHub ActionsのSecretには、少なくとも OPENAI_API_KEY または CODEX_AUTH_JSON のどちらかを登録します。

ハンズオン1: プロンプトをファイル化する

まず、Codexに渡す指示を固定化します。例として .github/codex/prompts/write-blog.md を作ります。

あなたはOpsNoteのブログ執筆エージェントです。

必ず最初に content/blog/、image-registry.json、プロジェクトルール、公式ドキュメントを確認してください。

成果物:
- content/blog/{slug}.mdx
- public/images/blog/{slug}.jpg
- public/images/blog/image-registry.json の更新
- src/components/NewsSection.tsx の先頭に新記事を追加

記事条件:
- Web系エンジニア向け
- Next.js + Firestore + GitHub Actions + TypeScriptの例を含める
- Mermaid図、表、コードブロックを含める
- dateは実行日のJST
- draft: false

このファイルを置く狙いは、プロンプトをGit管理することです。毎回Actions内で長い文字列を組み立てるより、レビュー可能で差分も追いやすくなります。

ハンズオン2: GitHub ActionsからCodexを起動する

次にワークフローを作ります。公式の openai/codex-action@v1 は固定プロンプトのレビューや移行作業に向きます。ブログ生成では日付や任意テーマを動的に混ぜたいので、ここではCLIを直接呼ぶ形にします。

name: Generate Blog

on:
  schedule:
    - cron: "0 0 * * *" # 09:00 JST
  workflow_dispatch:
    inputs:
      topic:
        description: "記事テーマ"
        required: false
        type: string

permissions:
  contents: write

concurrency:
  group: generate-blog
  cancel-in-progress: false

jobs:
  write:
    runs-on: ubuntu-latest
    timeout-minutes: 120
    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: "20"
          cache: "yarn"

      - run: yarn install --frozen-lockfile

      - name: Build prompt
        run: |
          TODAY_JST="$(TZ=Asia/Tokyo date +%F)"
          TOPIC="${{ github.event.inputs.topic }}"
          {
            cat .github/codex/prompts/write-blog.md
            echo
            echo "本日の日付: ${TODAY_JST}(JST)"
            echo "指定テーマ: ${TOPIC:-未指定。最新情報から選定}"
          } > "$RUNNER_TEMP/blog-prompt.md"

      - name: Run Codex
        env:
          CODEX_API_KEY: ${{ secrets.OPENAI_API_KEY }}
        run: |
          curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh
          codex exec "$(cat "$RUNNER_TEMP/blog-prompt.md")" \
            --sandbox workspace-write \
            --ask-for-approval never

      - name: Validate
        run: yarn build

画像ダウンロードや外部ドキュメント確認までCodexに任せる場合、環境によっては workspace-write では足りないことがあります。その場合でも、danger-full-access は隔離されたプライベートRunnerに限定し、Secretを渡すイベントを絞るべきです。

ハンズオン3: Next.jsとFirestoreに生成履歴を残す

記事を自動生成すると、「いつ、どのテーマで、誰の認証情報で、どのslugが作られたか」を追えることが大事になります。Next.js側で管理画面を持つなら、Firestoreに生成履歴を保存しておくと運用しやすくなります。

import { FieldValue, getFirestore } from "firebase-admin/firestore";

type GeneratedBlogLog = {
  slug: string;
  title: string;
  topic: string;
  workflowRunId: string;
  status: "generated" | "build_failed" | "published";
};

export async function saveGeneratedBlogLog(input: GeneratedBlogLog) {
  const db = getFirestore();
  await db.collection("generatedBlogRuns").doc(input.workflowRunId).set({
    ...input,
    createdAt: FieldValue.serverTimestamp(),
  });
}

Firebase Admin SDKの初期化は既存の共通モジュールに寄せ、Actions側では FIREBASE_SERVICE_ACCOUNT_JSON をSecretに入れます。本番公開前に承認フローを挟む場合は、statusgenerated で止めます。

運用時のチェックポイント

自動生成は便利ですが、放置できる仕組みではありません。次の4点は最初から組み込みます。

チェック実装例
重複防止content/blog/ を先に読ませ、既存テーマと同じ記事を書かせない
画像の多様性image-registry.json を必ず確認させ、使用済みカテゴリを避ける
捏造防止公式ドキュメントで確認できないコマンドやAPIを書かせない
公開前検証yarn build を必須にし、失敗したらActionsを落とす

GitHub Actionsの schedule はUTC基準です。JSTの朝9時に実行したい場合は 0 0 * * * になります。permissions は必要最小限にし、記事をcommitするジョブだけ contents: write を付けます。

まとめ

Codex ProとGitHub Actionsを組み合わせると、ブログ記事生成を「レビュー可能な自動ワークフロー」に移せます。

要点は次の通りです。

  • CIでは codex exec を使うと、Codex CLIを非対話で実行できる
  • 認証はAPIキー推奨。auth.json を使う場合は信頼できるCIだけに限定する
  • プロンプトはファイル化し、既存記事、画像レジストリ、公式情報確認、ビルド検証を必須化する
  • Next.jsブログでは、MDX、サムネイル、一覧コンポーネント更新まで1つの成果物として扱う
  • Firestoreに生成履歴を残すと、承認・再生成・監査がしやすくなる

まずは workflow_dispatch だけで始め、生成結果を数回レビューしてから schedule を有効化しましょう。自動化の価値は、完全放置ではなく、品質チェックの型を毎回外さないところにあります。

参考資料