GitHub ActionsとCodexでIssueドリブンな自動開発を行う
はじめに
ソフトウェア開発の効率化は常に重要な課題である。近年、AI技術の進化により、コーディング作業の一部を自動化する試みが活発になっている。本記事では、GitHub ActionsとOpenAI Codexを活用し、Issueの発行をトリガーとしてコード修正を行い、プルリクエスト(PR)の作成、さらにはPR内容の要約までを自動化する「Issueドリブンな自動開発」の仕組みについて解説する。この仕組みの理想は、人間が新たなIssueを投げるだけで、開発が進んでいく状態を目指すものである。
issue-to-pr.yaml
)
Issue発行からPR作成までの自動化 (自動開発のトリガーとしてIssueの作成から始まる。特定のラベル(この例では codex
)が付与されたIssueが作成されると、GitHub Actionsワークフローがトリガーされるように作成した。
name: Issue to PR with Codex
on:
issues:
types: [labeled]
jobs:
fix_with_codex:
runs-on: ubuntu-latest
if: github.event.label.name == 'codex' # 'codex'ラベルがついた時のみ実行
permissions:
contents: write
pull-requests: write
actions: write
steps:
- uses: actions/checkout@v4
- name: Set git user
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "latest"
- name: Install Codex CLI
run: npm install -g @openai/codex
- name: Generate patch with Codex
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
BRANCH="codex/issue-${{ github.event.issue.number }}"
git switch -c "$BRANCH"
if [ -d "node_modules" ]; then
rm -rf node_modules
fi
if [ -f "package-lock.json" ]; then
rm package-lock.json
fi
PROMPT="$(printf '%s\\n\\n%s\\n%s\\n' "${{ github.event.issue.title }}" "${{ github.event.issue.body }}" "最後に\`npm ci && npm run build\`を実行してエラーが出ないことを確認してください。 .gitのような'.'から始まるファイル、フォルダの中身は絶対に変更しないでください。")"
codex -a full-auto --quiet "$PROMPT"
if [[ -n $(git status --porcelain) ]]; then
git add .
git commit -m "Fix: #${{ github.event.issue.number }} - ${{ github.event.issue.title }}"
fi
git push -u origin "$BRANCH"
- name: Create Pull Request
env:
GH_TOKEN: ${{ secrets.PAT_TOKEN || secrets.GITHUB_TOKEN }}
run: |
gh pr create \
--title "Fix: #${{ github.event.issue.number }} – ${{ github.event.issue.title }}" \
--body "Automated fix generated by Codex CLI." \
--base main \
--head "$BRANCH"
このワークフロー (.github/workflows/issue-to-pr.yaml
) の主なステップは以下の通りである。
-
トリガー: Issueに
codex
ラベルが付与された際に起動する。 -
環境セットアップ:
- リポジトリのコードをチェックアウトする。
- Gitのユーザー情報を設定する(ボットとしてコミットするため)。
- Node.js環境をセットアップする。
- OpenAI Codex CLIをインストールする。
-
Codexによる修正とパッチ生成:
- Issue番号に基づいた新しいブランチを作成する (
codex/issue-${{ github.event.issue.number }}
)。 - 既存の
node_modules
とpackage-lock.json
があれば削除し、クリーンな状態にする。 - Issueのタイトルと本文を連結し、Codexへのプロンプトを生成する。この際、「最後に
npm ci && npm run build
を実行してエラーが出ないことを確認してください。 .gitのような'.'から始まるファイル、フォルダの中身は絶対に変更しないでください。」といった指示も追加している。 -
codex -a full-auto --quiet "$PROMPT"
コマンドを実行し、Codexにコードの自動修正とコミットを行わせる。 - もし
codex
コマンドがコミットしなかった場合でも変更があれば、変更点をステージングし、コミットする。 - 作成したブランチをリモートリポジトリにプッシュする。
- Issue番号に基づいた新しいブランチを作成する (
-
プルリクエストの作成:
-
gh pr create
コマンドを使用し、修正内容を含むプルリクエストをmain
ブランチに向けて作成する。PRのタイトルと本文も自動生成される。
-
このワークフローにより、Issueの内容に基づいてCodexが自動的にコードを修正し、人間がレビュー可能なプルリクエストとして提出される。
pr-summary.yaml
)
PR作成をトリガーとしたPR内容の自動要約 (コードの変更が行われ、プルリクエストが作成されると、次にその変更内容を把握するフェーズに入る。この手間を軽減するため、PRがオープンされたことをトリガーに、変更内容の要約を自動生成し、PRにコメントとしてのこすワークフローも作成した。
name: PR summary by codex
on:
pull_request_target:
types: [ opened ]
jobs:
pr-summary-by-codex:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- name: Switch to head branch
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "latest"
- name: Summary and comment
run: |
npm install -g @openai/codex
gh pr diff ${PR_NUMBER} > pr-diff.txt
codex -m o4-mini -a auto-edit --quiet \
"pr-diff.txt から更新差分を日本語で要約して。変更があったファイルの内容を確認して。プルリクエストとして要約内容をcodex-summary.md に保存して。"
gh pr comment --body-file codex-summary.md "${PR_URL}"
env:
OPENAI_API_KEY: ${{secrets.OPENAI_API_KEY}}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_URL: ${{ github.event.pull_request.html_url }}
PR_NUMBER: ${{ github.event.number }}
このワークフロー (.github/workflows/pr-summary.yaml
) の主なステップは以下の通りである。
-
トリガー: プルリクエストがオープンされた際に起動する (
pull_request_target
イベントのopened
タイプ)。 -
環境セットアップ:
- PRのHEADブランチ(変更が含まれるブランチ)のコードをチェックアウトする。
- Node.js環境をセットアップする。
-
Codexによる要約とコメント:
- OpenAI Codex CLIをインストールする。
-
gh pr diff ${PR_NUMBER} > pr-diff.txt
コマンドでPRの差分を取得し、pr-diff.txt
ファイルに保存する。 -
codex -m o4-mini -a auto-edit --quiet "pr-diff.txt から更新差分を日本語で要約して。変更があったファイルの内容を確認して。プルリクエストとして要約内容をcodex-summary.md に保存して。"
コマンドを実行し、Codexに差分ファイルの日本語での要約を依頼し、結果をcodex-summary.md
に保存する。ここではo4-mini
モデルを使用している。 -
gh pr comment --body-file codex-summary.md "${PR_URL}"
コマンドで、生成された要約 (codex-summary.md
) を該当のPRにコメントとして投稿する。
これにより、レビュアーはPRを開くとすぐに、Codexによって生成された変更点の要約を読むことができ、レビューの効率化が期待できる。
実際の動作
- 人間によるIssueの作成
- コード修正 + PR作成とPRの変更点の要約
今後の展望
今後として、外部のAIエージェントに大きなプロジェクトの構想をインプットとして与え、それを具体的な作業単位である細かいIssue群に分解してもらうことが考えられる。そして、分解されたIssueをGitHubのMCPを通じて自動的に発行する。
こうして大量に作成されたIssueを、本記事で紹介したようなCodexベースの自動修正・PR作成ワークフローと連携させることで、人間が初期の仕様を記述するだけで、AIエージェント群が並列的に作業を進め、最終的にプロジェクトが完成するという、より高度な自律的開発体制の実現できると考える。
まとめ
本記事では、GitHub ActionsとCodex CLIを活用して、Issueの作成からコード修正、PR作成、そしてPR内容の要約までを自動化する「Issueドリブンな自動開発」の仕組みを紹介した。
- Issue → 自動修正 → 自動PR作成
- PR作成 → 自動要約コメント
これらの自動化は、開発の初期段階における手間を大幅に削減し、開発者がより本質的な作業に集中できる環境を提供する。そして、将来的には「mainへのマージ → 次のIssue自動作成」というサイクルを回すことで、人間は新たなIssueを投げるだけという、より高度な自動開発ループの実現が期待される。
Discussion