🚗

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ワークフローがトリガーされるように作成した。

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) の主なステップは以下の通りである。

  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にコメントとしてのこすワークフローも作成した。

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) の主なステップは以下の通りである。

  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を投げるだけという、より高度な自動開発ループの実現が期待される。

Discussion