Codex GitHub アクション¶
Codex GitHub アクション(openai/codex-action@v1)を使用すると、CI/CD ジョブで Codex を実行したり、パッチを適用したり、GitHub Actions ワークフローからレビューを投稿したりできます。
このアクションは Codex CLI をインストールし、API key を指定すると Responses API プロキシを起動して、指定した権限のもとで codex exec を実行します。
次のような場合に、このアクションを使用します。
- CLI を自分で管理せずに、pull request やリリースに対する Codex のフィードバックを自動化する場合。
- CI パイプラインの一部として、Codex による品質チェックを変更のゲートとして使用する場合。
- ワークフローファイルから、繰り返し実行可能な Codex タスク(コードレビュー、リリース準備、マイグレーション)を実行する場合。
CI の例については、非対話モードを参照し、openai/codex-action リポジトリでソースを確認してください。
前提条件¶
- OpenAI key を GitHub secret(例:
OPENAI_API_KEY)として保存し、ワークフローから参照します。 - ジョブを Linux または macOS runner で実行します。Windows の場合は
safety-strategy: unsafeを設定します。 - Codex がリポジトリの内容を読み取れるように、アクションを呼び出す前にコードをチェックアウトします。
- 実行するプロンプトを決めます。
promptでインラインテキストを指定するか、prompt-fileでリポジトリにコミットしたファイルを指定できます。
ワークフローの例¶
次のサンプルワークフローは、新しい pull request をレビューし、Codex のレスポンスを取得して、PR に投稿します。
name: Codex pull request review
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
codex:
runs-on: ubuntu-latest
permissions:
contents: read
outputs:
final_message: ${{ steps.run_codex.outputs.final-message }}
steps:
- uses: actions/checkout@v5
with:
ref: refs/pull/${{ github.event.pull_request.number }}/merge
fetch-depth: 0
persist-credentials: false
- name: Run Codex
id: run_codex
uses: openai/codex-action@v1
with:
openai-api-key: ${{ secrets.OPENAI_API_KEY }}
prompt-file: .github/codex/prompts/review.md
output-file: codex-output.md
post_feedback:
runs-on: ubuntu-latest
needs: codex
if: needs.codex.outputs.final_message != ''
permissions:
issues: write
pull-requests: write
steps:
- name: Post Codex feedback
uses: actions/github-script@v7
with:
github-token: ${{ github.token }}
script: |
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
body: process.env.CODEX_FINAL_MESSAGE,
});
env:
CODEX_FINAL_MESSAGE: ${{ needs.codex.outputs.final_message }}
.github/codex/prompts/review.md を独自のプロンプトファイルに置き換えるか、prompt input を使用してインラインテキストを指定してください。この例では、後から確認したり artifact としてアップロードしたりできるよう、最終的な Codex メッセージを codex-output.md にも書き込みます。
codex exec の設定¶
codex exec のオプションに対応するアクション input を設定して、Codex の実行方法を細かく調整します。
promptまたはprompt-file(どちらか一方を選択): タスクに関するインラインの指示、または Markdown やテキストのリポジトリパスです。プロンプトを.github/codex/prompts/に保存することを検討してください。codex-args: 追加の CLI フラグです。JSON 配列(例:["--ephemeral"])または shell 文字列(--profile ci)を指定して、セッション、プロファイル、MCP 設定を構成します。modelおよびeffort: 使用する Codex エージェント設定を選択します。デフォルトを使用する場合は空のままにします。sandbox: サンドボックスモード(workspace-write、read-only、danger-full-access)を、実行中に Codex が必要とする権限に合わせます。output-file: 後続のステップでアップロードまたは diff できるよう、最終的な Codex メッセージをディスクに保存します。codex-version: 特定の CLI リリースに固定します。最新の公開バージョンを使用する場合は空欄のままにします。codex-home: 複数のステップで設定ファイルまたは MCP セットアップを再利用する場合は、共有 Codex home directory を指定します。
権限の管理¶
制限しない限り、Codex は GitHub ホスト runner 上で広範なアクセス権を持ちます。次の input を使用して、アクセス範囲を制御します。
safety-strategy(デフォルトはdrop-sudo)は、Codex の実行前にsudoを削除します。これはジョブに対して不可逆であり、メモリ内の secret を保護します。Windows ではsafety-strategy: unsafeを設定する必要があります。unprivileged-userはsafety-strategy: unprivileged-userとcodex-userを組み合わせて、Codex を特定のアカウントとして実行します。そのユーザーがチェックアウトしたリポジトリを読み書きできることを確認してください(所有権を修正する方法については、unprivileged-userの例を参照してください)。read-onlyは Codex によるファイル変更やネットワークの使用を防ぎますが、Codex は引き続き昇格された権限で実行されます。secret の保護をread-onlyだけに頼らないでください。sandboxは、Codex 自体のファイルシステムおよびネットワークへのアクセスを制限します。タスクを完了できる範囲で、最も狭いオプションを選択してください。allow-usersおよびallow-botsは、ワークフローをトリガーできるユーザーを制限します。デフォルトでは、書き込みアクセス権を持つユーザーだけがアクションを実行できます。追加の信頼するアカウントを明示的に列挙するか、デフォルトの動作にする場合はフィールドを空のままにします。
出力の取得¶
このアクションは、最後の Codex メッセージを final-message output から出力します。上記の例のように job output に割り当てるか、後続のステップで直接処理します。runner から完全なトランスクリプトを収集する場合は、output-file とアップロードされた artifact 機能を組み合わせてください。構造化データが必要な場合は、--output-schema を codex-args に渡して、JSON の形式を強制します。
セキュリティチェックリスト¶
- ワークフローを開始できるユーザーを制限します。全員がリポジトリに対して Codex を実行できるようにするのではなく、信頼できるイベントまたは明示的な承認を優先してください。
- prompt injection を避けるため、pull request、コミットメッセージ、issue 本文からの prompt input をサニタイズします。Codex に渡す前に、HTML コメントや非表示テキストを確認してください。
OPENAI_API_KEYを保護するため、safety-strategyをdrop-sudoに維持するか、Codex を権限のないユーザーに移行します。マルチテナント runner では、アクションをunsafeモードのままにしないでください。- ジョブの最後のステップとして Codex を実行し、後続のステップが予期しない状態変更を引き継がないようにします。
- プロキシログまたはアクション出力によって secret の内容が漏えいした疑いがある場合は、直ちに key をローテーションします。
トラブルシューティング¶
- prompt と prompt-file の両方を設定した: 重複している input を削除し、ソースを 1 つだけ指定してください。
- responses-api-proxy がサーバー情報を書き込まなかった: API key が存在し、有効であることを確認してください。プロキシは
openai-api-keyを指定した場合にのみ起動します。 sudoの削除を期待したが、sudoが成功した: 以前のステップでsudoが復元されていないこと、および runner の OS が Linux または macOS であることを確認してください。新しいジョブで再実行します。drop-sudo後に権限エラーが発生する: アクションの実行前に書き込みアクセスを付与します(例:chmod -R g+rwX "$GITHUB_WORKSPACE"を使用するか、権限のないユーザーパターンを使用します)。- 権限のないトリガーがブロックされた: デフォルトの書き込みアクセス権を持つ collaborator 以外のサービスアカウントにも許可する必要がある場合は、
allow-usersまたはallow-botsinput を調整します。