はじめに#
Codex CLIの基本的な使い方を習得したら、次のステップは既存の開発ワークフローへの統合です。シェルスクリプトやGit hook、CI/CDパイプラインと組み合わせることで、Codex CLIの真価を発揮できます。
本記事では、Codex CLIを開発ワークフローにシームレスに統合するための実践的なパターンを解説します。APIトークンの安全な管理方法、コスト最適化のテクニック、そして自動化のベストプラクティスを網羅し、チーム開発での効率的な運用を実現するためのガイドを提供します。
非対話型モード(codex exec)の活用#
スクリプトやCI/CDパイプラインでCodex CLIを使用する場合、codex execコマンドによる非対話型モードが基本となります。
基本的な使い方#
codex execは、プロンプトを引数として渡し、結果を標準出力に出力します。
1
2
3
4
5
6
7
8
|
# 基本的な実行
codex exec "このリポジトリの構成を要約して"
# 結果をファイルに保存
codex exec "直近10コミットのリリースノートを生成して" | tee release-notes.md
# 最終メッセージをファイルに出力
codex exec -o result.txt "READMEを更新して"
|
実行中の進捗はstderrに出力され、最終結果のみがstdoutに出力されるため、パイプ処理やリダイレクトとの相性が優れています。
権限とサンドボックスの設定#
非対話型モードでは、デフォルトで読み取り専用サンドボックスが適用されます。自動化のユースケースに応じて、最小限の権限を設定することが重要です。
1
2
3
4
5
6
7
8
|
# 読み取り専用(デフォルト)
codex exec "コードベースを分析して"
# ファイル編集を許可
codex exec --full-auto "リンターエラーを修正して"
# より広いアクセスを許可(制御された環境でのみ使用)
codex exec --sandbox danger-full-access "依存関係を更新して"
|
danger-full-accessオプションは、隔離されたCI runnerやコンテナ内など、制御された環境でのみ使用してください。
JSON形式での出力#
スクリプトでCodexの出力を処理する場合、--jsonフラグでJSON Lines形式の出力を取得できます。
1
|
codex exec --json "リポジトリ構成を要約して" | jq .
|
JSON Linesストリームには、thread.started、turn.started、turn.completed、item.*などのイベントが含まれます。
1
2
3
4
|
{"type":"thread.started","thread_id":"0199a213-81c0-7800-8aa1-bbab2a035a53"}
{"type":"turn.started"}
{"type":"item.completed","item":{"id":"item_3","type":"agent_message","text":"..."}}
{"type":"turn.completed","usage":{"input_tokens":24763,"output_tokens":122}}
|
構造化出力の生成#
下流の処理で安定したフィールドが必要な場合、--output-schemaオプションでJSONスキーマを指定できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# スキーマファイルを用意
cat > schema.json << 'EOF'
{
"type": "object",
"properties": {
"project_name": { "type": "string" },
"programming_languages": {
"type": "array",
"items": { "type": "string" }
}
},
"required": ["project_name", "programming_languages"],
"additionalProperties": false
}
EOF
# スキーマに従った出力を生成
codex exec "プロジェクトメタデータを抽出して" \
--output-schema ./schema.json \
-o ./project-metadata.json
|
シェルスクリプトとの連携#
日常的な開発タスクをシェルスクリプトで自動化する例を紹介します。
コードレビュー自動化スクリプト#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#!/bin/bash
# review.sh - 変更されたファイルのコードレビューを自動実行
set -e
# 変更されたファイルを取得
CHANGED_FILES=$(git diff --name-only HEAD~1)
if [ -z "$CHANGED_FILES" ]; then
echo "レビュー対象のファイルがありません"
exit 0
fi
echo "レビュー対象ファイル:"
echo "$CHANGED_FILES"
# Codexでレビューを実行
codex exec --sandbox read-only \
"以下のファイルの変更をレビューしてください。
潜在的なバグ、パフォーマンス問題、セキュリティリスクを指摘してください。
変更されたファイル:
$CHANGED_FILES"
|
テスト失敗の自動診断スクリプト#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#!/bin/bash
# diagnose-test-failure.sh - テスト失敗時の自動診断
set -e
TEST_OUTPUT=$(npm test 2>&1) || true
if echo "$TEST_OUTPUT" | grep -q "FAIL"; then
echo "テスト失敗を検出しました。Codexで診断を実行します..."
codex exec --sandbox read-only \
"以下のテスト失敗を分析し、原因と修正案を提示してください:
$TEST_OUTPUT"
else
echo "すべてのテストが成功しました"
fi
|
リリースノート自動生成スクリプト#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#!/bin/bash
# generate-release-notes.sh - コミット履歴からリリースノートを生成
VERSION=$1
PREVIOUS_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
if [ -z "$PREVIOUS_TAG" ]; then
COMMIT_RANGE="HEAD"
else
COMMIT_RANGE="$PREVIOUS_TAG..HEAD"
fi
COMMITS=$(git log $COMMIT_RANGE --pretty=format:"%s" --no-merges)
codex exec --sandbox read-only \
"以下のコミットメッセージからバージョン $VERSION のリリースノートを生成してください。
機能追加、バグ修正、破壊的変更をカテゴリ分けしてください。
コミット:
$COMMITS" \
-o "RELEASE_NOTES_${VERSION}.md"
echo "リリースノートを生成しました: RELEASE_NOTES_${VERSION}.md"
|
Git hookとの組み合わせ#
Git hookを活用することで、コミットやプッシュのタイミングでCodexを自動実行できます。
pre-commit hook: コミットメッセージの提案#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#!/bin/bash
# .git/hooks/prepare-commit-msg
COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2
# マージコミットやamendの場合はスキップ
if [ "$COMMIT_SOURCE" = "merge" ] || [ "$COMMIT_SOURCE" = "commit" ]; then
exit 0
fi
# ステージされた変更を取得
STAGED_DIFF=$(git diff --cached --stat)
if [ -z "$STAGED_DIFF" ]; then
exit 0
fi
# Codexでコミットメッセージを提案
SUGGESTED_MSG=$(codex exec --sandbox read-only \
"以下のgit diffから、Conventional Commits形式のコミットメッセージを1行で提案してください:
$STAGED_DIFF" 2>/dev/null)
if [ -n "$SUGGESTED_MSG" ]; then
echo "# Codex suggested: $SUGGESTED_MSG" >> "$COMMIT_MSG_FILE"
fi
|
pre-push hook: プッシュ前のコード品質チェック#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#!/bin/bash
# .git/hooks/pre-push
echo "プッシュ前のコード品質チェックを実行中..."
# 直近のコミットの変更を分析
RESULT=$(codex exec --sandbox read-only \
"プッシュ対象の変更を分析し、以下の問題がないかチェックしてください:
1. 明らかなバグやエラー
2. セキュリティ上の問題
3. パフォーマンスの懸念
問題がなければ'OK'とだけ回答してください。
問題がある場合は詳細を説明してください。" 2>/dev/null)
if echo "$RESULT" | grep -qi "^OK$"; then
echo "チェック完了: 問題なし"
exit 0
else
echo "潜在的な問題が検出されました:"
echo "$RESULT"
read -p "プッシュを続行しますか? (y/N): " CONFIRM
if [ "$CONFIRM" != "y" ] && [ "$CONFIRM" != "Y" ]; then
echo "プッシュを中止しました"
exit 1
fi
fi
|
post-merge hook: マージ後の自動整理#
1
2
3
4
5
6
7
8
9
10
|
#!/bin/bash
# .git/hooks/post-merge
echo "マージ後のコードベース整理を確認中..."
codex exec --sandbox read-only \
"マージ後の変更を確認し、以下について提案してください:
1. 不要になった可能性のあるコード
2. 更新が必要なドキュメント
3. 追加が推奨されるテスト" | head -50
|
CI/CDパイプラインへの統合#
Codex CLIをCI/CDパイプラインに組み込むことで、継続的な品質改善を自動化できます。
GitHub Actionsでのテスト失敗自動修正#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
name: Codex auto-fix on CI failure
on:
workflow_run:
workflows: ["CI"]
types: [completed]
permissions:
contents: write
pull-requests: write
jobs:
auto-fix:
if: ${{ github.event.workflow_run.conclusion == 'failure' }}
runs-on: ubuntu-latest
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
FAILED_HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
FAILED_HEAD_BRANCH: ${{ github.event.workflow_run.head_branch }}
steps:
- uses: actions/checkout@v4
with:
ref: ${{ env.FAILED_HEAD_SHA }}
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: "20"
- name: Install dependencies
run: |
if [ -f package-lock.json ]; then npm ci; else npm i; fi
- name: Install Codex
run: npm i -g @openai/codex
- name: Authenticate Codex
run: codex login --api-key "$OPENAI_API_KEY"
- name: Run Codex
run: |
codex exec --full-auto --sandbox workspace-write \
"リポジトリを読み込み、テストスイートを実行し、
すべてのテストを通過させるために必要な最小限の変更を特定し、
その変更のみを実装して停止してください。
無関係なファイルをリファクタリングしないでください。"
- name: Verify tests
run: npm test --silent
- name: Create pull request
if: success()
uses: peter-evans/create-pull-request@v6
with:
branch: codex/auto-fix-${{ github.event.workflow_run.run_id }}
base: ${{ env.FAILED_HEAD_BRANCH }}
title: "fix: Codexによるテスト失敗の自動修正"
body: |
このPRはCodex CLIによって自動生成されました。
CI失敗を検出し、テストを通過させるための修正を適用しています。
|
Codex GitHub Actionの活用#
openai/codex-action@v1を使用すると、CLIのインストールや認証を自動化できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
name: Codex pull request review
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
codex:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
outputs:
final_message: ${{ steps.run_codex.outputs.final-message }}
steps:
- uses: actions/checkout@v5
with:
ref: refs/pull/${{ github.event.pull_request.number }}/merge
- name: Pre-fetch base and head refs
run: |
git fetch --no-tags origin \
${{ github.event.pull_request.base.ref }} \
+refs/pull/${{ github.event.pull_request.number }}/head
- 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
safety-strategy: drop-sudo
sandbox: workspace-write
post_feedback:
runs-on: ubuntu-latest
needs: codex
if: needs.codex.outputs.final_message != ''
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 }}
|
GitLab CI/CDでの統合例#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
# .gitlab-ci.yml
stages:
- test
- codex-review
test:
stage: test
script:
- npm ci
- npm test
codex-review:
stage: codex-review
image: node:20
only:
- merge_requests
script:
- npm i -g @openai/codex
- codex login --api-key "$OPENAI_API_KEY"
- |
codex exec --sandbox read-only \
"このマージリクエストの変更をレビューし、
改善点やリスクがあれば指摘してください。" \
-o review-result.md
artifacts:
paths:
- review-result.md
expire_in: 1 week
|
ワークフロー統合の全体像#
flowchart TD
subgraph "開発者のローカル環境"
A[コード変更] --> B[Git hook]
B --> C{pre-commit}
C -->|コミットメッセージ提案| D[Codex CLI]
D --> E[コミット]
E --> F{pre-push}
F -->|品質チェック| G[Codex CLI]
end
subgraph "CI/CD パイプライン"
H[プッシュ/PR] --> I[テスト実行]
I -->|失敗| J[Codex自動修正]
J --> K[修正PR作成]
I -->|成功| L[コードレビュー]
L --> M[Codex Action]
M --> N[レビューコメント投稿]
end
G --> H
K --> HAPIトークン管理とセキュリティ#
Codex CLIを自動化環境で使用する際は、APIトークンの適切な管理が重要です。
認証方法の選択#
| 認証方法 |
用途 |
メリット |
デメリット |
| ChatGPTログイン |
開発者のローカル環境 |
プラン内の使用量に含まれる |
対話型フローが必要 |
| APIキー |
CI/CD、自動化 |
環境変数で簡単に設定可能 |
従量課金 |
| デバイスコード認証 |
ヘッドレス環境 |
ブラウザ不要 |
追加の設定が必要 |
CI環境での認証#
CI環境では、CODEX_API_KEY環境変数を使用します。
1
2
3
4
5
6
|
# GitHub Actionsの場合
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
# 単一実行時に異なるAPIキーを使用
- run: CODEX_API_KEY=${{ secrets.DIFFERENT_KEY }} codex exec "タスク"
|
CODEX_API_KEYはcodex execでのみサポートされています。
資格情報の安全な保存#
資格情報の保存方法は設定ファイルで制御できます。
1
2
3
|
# ~/.codex/config.toml
# file | keyring | auto
cli_auth_credentials_store = "keyring"
|
| オプション |
説明 |
file |
~/.codex/auth.jsonに保存 |
keyring |
OSの資格情報ストアに保存(推奨) |
auto |
可能ならOS資格情報ストア、なければファイル |
auth.jsonはパスワードと同様に扱い、コミットや共有を絶対に避けてください。
ヘッドレス環境での認証#
SSHで接続したリモートサーバーなど、ブラウザが使えない環境では、デバイスコード認証を使用します。
1
2
|
# デバイスコード認証
codex login --device-auth
|
表示されたURLをローカルマシンのブラウザで開き、ワンタイムコードを入力して認証を完了します。
認証情報をリモートマシンにコピーする方法もあります。
1
2
3
|
# ローカルからリモートに認証情報をコピー
ssh user@remote 'mkdir -p ~/.codex'
scp ~/.codex/auth.json user@remote:~/.codex/auth.json
|
組織での管理設定#
エンタープライズ環境では、managed_config.tomlとrequirements.tomlで組織全体のポリシーを強制できます。
1
2
3
4
|
# /etc/codex/requirements.toml
# 危険なモードを禁止
allowed_approval_policies = ["untrusted", "on-request", "on-failure"]
allowed_sandbox_modes = ["read-only", "workspace-write"]
|
1
2
3
4
5
6
7
|
# /etc/codex/managed_config.toml
# 組織のデフォルト設定
approval_policy = "on-request"
sandbox_mode = "workspace-write"
[sandbox_workspace_write]
network_access = false
|
セキュリティチェックリスト#
CI/CDでCodexを使用する際は、以下のセキュリティ対策を実施してください。
| 項目 |
対策 |
| APIキーの保護 |
GitHub Secretsなどのシークレット管理機能を使用 |
| 権限の最小化 |
safety-strategy: drop-sudoを使用 |
| サンドボックス |
必要最小限のサンドボックスモードを選択 |
| プロンプトインジェクション対策 |
PR本文やIssueからの入力をサニタイズ |
| 監査ログ |
OTELを有効化してログを収集 |
| キーのローテーション |
漏洩が疑われる場合は即座にローテーション |
利用料金の最適化#
Codex CLIの利用料金を最適化するためのテクニックを紹介します。
プラン別の利用制限#
| プラン |
ローカルメッセージ |
クラウドタスク |
コードレビュー |
| Plus($20/月) |
45-225 |
10-60 |
10-25 |
| Pro($200/月) |
300-1500 |
50-400 |
100-250 |
| Business($30/ユーザー/月) |
45-225 |
10-60 |
10-25 |
| APIキー |
従量課金 |
利用不可 |
利用不可 |
コスト最適化のテクニック#
Codexの使用量を効率的に管理するためのベストプラクティスを紹介します。
GPT-5.1-Codex-Miniの活用#
シンプルなタスクには軽量モデルを使用することで、使用量を約4倍に延長できます。
1
2
3
4
5
|
# シンプルなタスクにはminiモデルを使用
codex exec -m gpt-5.1-codex-mini "このファイルのタイポを修正して"
# 複雑なタスクには標準モデルを使用
codex exec -m gpt-5.2-codex "アーキテクチャを分析して改善案を提示して"
|
プロンプトの最適化#
1
2
3
4
5
|
# 悪い例: 曖昧で広範なプロンプト
codex exec "このプロジェクトを改善して"
# 良い例: 具体的で焦点を絞ったプロンプト
codex exec "src/utils/validation.ts の validateEmail 関数のエラーハンドリングを改善して"
|
AGENTS.mdの最適化#
大規模プロジェクトでは、AGENTS.mdをネストして必要なコンテキストのみを提供します。
project/
├── AGENTS.md # プロジェクト全体の概要(簡潔に)
├── frontend/
│ └── AGENTS.md # フロントエンド固有の詳細
└── backend/
└── AGENTS.md # バックエンド固有の詳細
MCPサーバーの管理#
不要なMCPサーバーは無効化して、コンテキストサイズを削減します。
1
2
3
4
|
# ~/.codex/config.toml
# 必要なMCPサーバーのみを有効化
[mcp]
servers = ["essential-server"]
|
使用量の監視#
現在の使用量は/statusコマンドまたはダッシュボードで確認できます。
1
2
|
# セッション中に使用量を確認
/status
|
使用量制限に達した場合の対処法は以下の通りです。
- GPT-5.1-Codex-Miniモデルに切り替える
- ChatGPTクレジットを購入して使用量を拡張
- APIキーでの従量課金に切り替える
コスト最適化の判断フロー#
flowchart TD
A[タスクの種類を判断] --> B{複雑さ}
B -->|シンプル| C[GPT-5.1-Codex-Mini]
B -->|複雑| D[GPT-5.2-Codex]
C --> E{使用量制限}
D --> E
E -->|余裕あり| F[ChatGPTプランで実行]
E -->|制限に近い| G{緊急度}
G -->|高| H[クレジット購入]
G -->|低| I[翌日まで待機]
F --> J[実行]
H --> J
I --> JTypeScript SDKによるプログラマティック制御#
より高度な制御が必要な場合は、Codex SDKを使用してプログラムからCodexを操作できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import { Codex } from "@openai/codex-sdk";
const codex = new Codex();
const thread = codex.startThread();
// 最初のタスクを実行
const result = await thread.run(
"CI失敗の診断と修正計画を作成して"
);
console.log(result);
// 同じスレッドで続行
const fixResult = await thread.run("計画を実行して");
console.log(fixResult);
// 過去のスレッドを再開
const threadId = "<thread-id>";
const resumedThread = codex.resumeThread(threadId);
const resumeResult = await resumedThread.run("続きから作業を再開して");
console.log(resumeResult);
|
SDKはNode.js 18以降が必要で、サーバーサイドでの使用を想定しています。
まとめ#
Codex CLIを既存の開発ワークフローに統合することで、開発効率を大幅に向上させることができます。
本記事で解説した主要なポイントは以下の通りです。
- 非対話型モード(codex exec) を活用することで、スクリプトやCI/CDパイプラインからCodexを自動実行できる
- シェルスクリプトとの連携 により、コードレビュー、テスト診断、リリースノート生成などの日常タスクを自動化できる
- Git hookとの組み合わせ で、コミットやプッシュのタイミングでCodexを自動実行できる
- CI/CDパイプラインへの統合 により、テスト失敗の自動修正やPRレビューの自動化が可能になる
- APIトークンの安全な管理 と組織ポリシーの強制により、セキュアな運用を実現できる
- 利用料金の最適化 として、軽量モデルの活用やプロンプトの最適化が効果的である
Codex CLIは単なるAIアシスタントではなく、開発ワークフロー全体を強化するツールです。本記事のパターンを参考に、自分のプロジェクトに最適な統合方法を見つけてください。
参考リンク#