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

はじめに
ブログ運用で、こんな作業が積み残しになっていませんか?
- 技術ニュースを調べて、記事テーマを決める
- 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 exec | CIでTUIを開かずにCodexを実行できる |
| 実行基盤 | GitHub Actions | cronと手動実行を両方扱える |
| コンテンツ | MDX | Next.jsブログと相性が良い |
| 状態管理 | Firestore | 生成履歴や承認状態を後から参照できる |
| 検証 | yarn build | 公開前にMDXやTypeScriptの破損を検出する |
事前準備
Codex CLIの非対話実行は codex exec で行います。公式ドキュメント上でも、CIやスケジュールジョブのように対話TUIを開けない場面向けの実行方法として説明されています。
認証は次のように分けます。
| 方法 | 向いているケース | 注意点 |
|---|---|---|
OPENAI_API_KEY | 一般的なCI/CD、自動化 | OpenAI Platformの従量課金になる |
CODEX_ACCESS_TOKEN | Business / EnterpriseでChatGPT workspaceの統制を使う自動化 | 作成権限と期限管理が必要 |
CODEX_AUTH_JSON | ChatGPTログイン済み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に入れます。本番公開前に承認フローを挟む場合は、status を generated で止めます。
運用時のチェックポイント
自動生成は便利ですが、放置できる仕組みではありません。次の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 を有効化しましょう。自動化の価値は、完全放置ではなく、品質チェックの型を毎回外さないところにあります。