GitHub ActionsとCodexでIssueドリブンな自動開発を行う

はじめに

ソフトウェア開発の効率化は常に重要な課題である。近年、AI 技術の進化により、コーディング作業の一部を自動化する試みが活発になっている。本記事では、GitHub Actions と OpenAI Codex を活用し、Issue の発行をトリガーとしてコード修正を行い、プルリクエスト(PR)の作成、さらには PR 内容の要約までを自動化する「Issue ドリブンな自動開発」の仕組みについて解説する。この仕組みの理想は、人間が新たな Issue を投げるだけで、開発が進んでいく状態を目指すものである。

Issue 発行から PR 作成までの自動化 (issue-to-pr.yaml)

自動開発のトリガーとして Issue の作成から始まる。特定のラベル(この例では codex)が付与された Issue が作成されると、GitHub Actions ワークフローがトリガーされるように作成した。

1name: Issue to PR with Codex
2
3on:
4  issues:
5    types: [labeled]
6
7jobs:
8  fix_with_codex:
9    runs-on: ubuntu-latest
10    if: github.event.label.name == 'codex' # 'codex'ラベルがついた時のみ実行
11
12    permissions:
13      contents: write
14      pull-requests: write
15      actions: write
16
17    steps:
18      - uses: actions/checkout@v4
19
20      - name: Set git user
21        run: |
22          git config user.name "github-actions[bot]"
23          git config user.email "github-actions[bot]@users.noreply.github.com"
24
25      - name: Setup Node.js
26        uses: actions/setup-node@v4
27        with:
28          node-version: "latest"
29
30      - name: Install Codex CLI
31        run: npm install -g @openai/codex
32
33      - name: Generate patch with Codex
34        env:
35          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
36        run: |
37          BRANCH="codex/issue-${{ github.event.issue.number }}"
38          git switch -c "$BRANCH"
39
40          if [ -d "node_modules" ]; then
41            rm -rf node_modules
42          fi
43          if [ -f "package-lock.json" ]; then
44            rm package-lock.json
45          fi
46
47          PROMPT="$(printf '%s\\n\\n%s\\n%s\\n' "${{ github.event.issue.title }}" "${{ github.event.issue.body }}" "最後に\`npm ci && npm run build\`を実行してエラーが出ないことを確認してください。 .gitのような'.'から始まるファイル、フォルダの中身は絶対に変更しないでください。")"
48
49          codex -a full-auto --quiet "$PROMPT"
50
51          if [[ -n $(git status --porcelain) ]]; then
52            git add .
53            git commit -m "Fix: #${{ github.event.issue.number }} - ${{ github.event.issue.title }}"
54          fi
55
56          git push -u origin "$BRANCH"
57
58      - name: Create Pull Request
59        env:
60          GH_TOKEN: ${{ secrets.PAT_TOKEN || secrets.GITHUB_TOKEN }}
61        run: |
62          gh pr create \
63            --title "Fix: #${{ github.event.issue.number }} – ${{ github.event.issue.title }}" \
64            --body  "Automated fix generated by Codex CLI." \
65            --base  main \
66            --head  "$BRANCH"

このワークフロー (.github/workflows/issue-to-pr.yaml) の主なステップは以下の通りである。

  1. トリガー: Issue に codex ラベルが付与された際に起動する。
  2. 環境セットアップ:
    • リポジトリのコードをチェックアウトする。
    • Git のユーザー情報を設定する(ボットとしてコミットするため)。
    • Node.js 環境をセットアップする。
    • OpenAI Codex CLI をインストールする。
  3. Codex による修正とパッチ生成:
    • Issue 番号に基づいた新しいブランチを作成する (codex/issue-${{ github.event.issue.number }})。
    • 既存の node_modulespackage-lock.json があれば削除し、クリーンな状態にする。
    • Issue のタイトルと本文を連結し、Codex へのプロンプトを生成する。この際、「最後にnpm ci && npm run buildを実行してエラーが出ないことを確認してください。 .git のような'.'から始まるファイル、フォルダの中身は絶対に変更しないでください。」といった指示も追加している。
    • codex -a full-auto --quiet "$PROMPT" コマンドを実行し、Codex にコードの自動修正とコミットを行わせる。
    • もし codex コマンドがコミットしなかった場合でも変更があれば、変更点をステージングし、コミットする。
    • 作成したブランチをリモートリポジトリにプッシュする。
  4. プルリクエストの作成:
    • gh pr create コマンドを使用し、修正内容を含むプルリクエストを main ブランチに向けて作成する。PR のタイトルと本文も自動生成される。

このワークフローにより、Issue の内容に基づいて Codex が自動的にコードを修正し、人間がレビュー可能なプルリクエストとして提出される。

PR 作成をトリガーとした PR 内容の自動要約 (pr-summary.yaml)

コードの変更が行われ、プルリクエストが作成されると、次にその変更内容を把握するフェーズに入る。この手間を軽減するため、PR がオープンされたことをトリガーに、変更内容の要約を自動生成し、PR にコメントとしてのこすワークフローも作成した。

1name: PR summary by codex
2on:
3  pull_request_target:
4    types: [opened]
5
6jobs:
7  pr-summary-by-codex:
8    runs-on: ubuntu-latest
9    permissions:
10      contents: read
11      pull-requests: write
12    steps:
13      - name: Switch to head branch
14        uses: actions/checkout@v4
15        with:
16          ref: ${{ github.event.pull_request.head.sha }}
17
18      - name: Setup Node.js
19        uses: actions/setup-node@v4
20        with:
21          node-version: "latest"
22
23      - name: Summary and comment
24        run: |
25          npm install -g @openai/codex
26
27          gh pr diff ${PR_NUMBER} > pr-diff.txt
28
29          codex -m o4-mini -a auto-edit --quiet \
30            "pr-diff.txt から更新差分を日本語で要約して。変更があったファイルの内容を確認して。プルリクエストとして要約内容をcodex-summary.md に保存して。"
31
32          gh pr comment --body-file codex-summary.md "${PR_URL}"
33        env:
34          OPENAI_API_KEY: ${{secrets.OPENAI_API_KEY}}
35          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
36          PR_URL: ${{ github.event.pull_request.html_url }}
37          PR_NUMBER: ${{ github.event.number }}

このワークフロー (.github/workflows/pr-summary.yaml) の主なステップは以下の通りである。

  1. トリガー: プルリクエストがオープンされた際に起動する (pull_request_target イベントの opened タイプ)。
  2. 環境セットアップ:
    • PR の HEAD ブランチ(変更が含まれるブランチ)のコードをチェックアウトする。
    • Node.js 環境をセットアップする。
  3. 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 を投げるだけという、より高度な自動開発ループの実現が期待される。