0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Codex CLIのexecをAPIキー認証でCIに組み込む

0
Posted at

はじめに

OpenAI Codex CLI には、対話セッションを開かずにタスクを実行できる exec サブコマンドがあります1。CI パイプラインや使い捨てコンテナのような、人間が張り付いてターミナルを操作できない環境で Codex CLI を動かせるかどうかは、この exec が実用に耐えるかどうかにかかっています。

対象読者は、Claude Code や Codex CLI のようなエージェント型 CLI ツールを CI・自動化パイプラインに組み込みたい開発者です。

この記事では、npm でインストールしたばかりの Codex CLI(codex-cli 0.149.1)を、ブラウザログインを使わず 環境変数の API キーだけ でログインさせ、exec サブコマンドで実際にファイル操作タスクを実行するところまでをクラウドのヘッドレスサンドボックス環境で検証しました。あわせて、対話 TUI(/import などのスラッシュコマンドを含む)がこの環境でどうなるかも確認しています。

TL;DR

  • codex login --with-api-key は標準入力から API キーを読み込むだけで完結し、ブラウザ・TTY なしでログインできる
  • codex exec は非対話でタスクを実行でき、--sandbox workspace-write を付けるとファイルの新規作成・編集もできる
  • --json を付けると thread.started / item.completed / turn.completed のイベント列が出力され、CI でのパースに使える構造化ログになる
  • 対話 TUI(引数なしで codex を起動するモード)は、exec が使う経路とは別に WebSocket 接続を張りにいく実装になっており、このクラウドサンドボックス環境では起動画面のまま応答が返らなかった。/import のような TUI 専用スラッシュコマンドは、この経路が塞がれている限り到達できない
  • つまり CI・自動化パイプラインへの組み込みは exec 一本に絞るのが現実的

検証環境

npx 経由で最新版をそのまま実行し、バージョンとインストール診断を確認しました。

npx --yes @openai/codex --version
# codex-cli 0.149.1

npx --yes @openai/codex doctor

doctor の出力の一部です。

✗ install      npm install -g @openai/codex would update a different install
✗ updates      update would target a different npm install
⚠ websocket    Responses WebSocket failed; HTTPS fallback may still work
✓ runtime      npm (... version 0.149.1)
✓ git          git version 2.43.0

install / updates の警告は npx 実行時特有のパッケージルート不一致(グローバルインストールの場所と npx が展開した一時ディレクトリが違う)なので今回は無視して問題ありません。一方 websocket の警告(Responses WebSocket failed)は、後述する TUI の挙動と符合する重要な手がかりでした。

APIキーだけでログインする

Codex CLI はブラウザ経由の OAuth ログインに加えて、標準入力から API キーを渡すログイン方法をサポートしています。

npx --yes @openai/codex login --help
--with-api-key
        Read the API key from stdin (e.g. `printenv OPENAI_API_KEY | codex login --with-api-key`)

実際に試すと、ログイン前は次のように未ログイン状態でした。

npx --yes @openai/codex login status
# Not logged in

環境変数 OPENAI_API_KEY をパイプで渡すと、ブラウザを一切開かずにログインが完了します。

printenv OPENAI_API_KEY | npx --yes @openai/codex login --with-api-key
# Reading API key from stdin...
# Successfully logged in

npx --yes @openai/codex login status
# Logged in using an API key - sk-proj-***

CI のシークレットストアに API キーを 1 つ登録しておけば、ジョブ起動時にこの 2 行を実行するだけでログインが完結します。ブラウザ・デバイスコード入力・TTY のいずれも不要です。

execで非対話タスクを実行する

ログインができたら exec サブコマンドで実際にタスクを投げてみます。まずは読み取りだけの単純な計算タスクです。

npx --yes @openai/codex exec "echo hello test"
OpenAI Codex v0.149.1
--------
workdir: /home/user/zenn-blog-automation
model: gpt-5.6-sol
provider: openai
approval: never
sandbox: read-only
--------
user
echo hello test
codex
コマンドを実行します。
exec
/bin/bash -lc 'echo hello test' in /home/user/zenn-blog-automation
 succeeded in 0ms:
hello test

codex
hello test
tokens used
11,573

model: gpt-5.6-sol と表示されている点に注目してください。GPT-5.6 Sol は 2026年7月に Amazon Bedrock 経由で GA したモデルで2、Codex CLI からもこの新モデルがデフォルトで使われることを実機で確認できました。

次に、ファイルを実際に作成するタスクを --sandbox workspace-write 付きで実行しました。Codex CLI は既定で git 管理下のディレクトリでの実行を前提にしており、それ以外のディレクトリでは --skip-git-repo-check が必要でした。

mkdir -p /tmp/codex-test && cd /tmp/codex-test
npx --yes @openai/codex exec \
  --sandbox workspace-write \
  --skip-git-repo-check \
  "create a file named hello.txt containing the text 'codex exec works'"
codex
I'll create `hello.txt` in the workspace and verify its contents.
apply patch
patch: completed
diff --git a/hello.txt b/hello.txt
new file mode 100644
--- /dev/null
+++ b/hello.txt
@@ -0,0 +1 @@
+codex exec works
ls -la /tmp/codex-test
# -rw-r--r-- 1 root root 17 hello.txt
cat /tmp/codex-test/hello.txt
# codex exec works

実際にファイルが作成され、内容も指示どおりでした。workspace-write サンドボックスは apply patch(ファイル差分の適用)と exec(コマンド実行)の両方をログに残すため、CI のジョブログとして何が行われたかを後から追跡できます。

--jsonでCIパース向けの構造化出力にする

CI に組み込むなら、人間が読む整形済みテキストより機械的にパースできる形式がほしくなります。--json を付けると 1 行 1 イベントの JSON Lines 形式になります。

npx --yes @openai/codex exec \
  --sandbox read-only \
  --skip-git-repo-check \
  --json \
  "what is 2+2, answer with just the number"
{"type":"thread.started","thread_id":"01a031c4-b9d0-7432-b203-c0901da6123d"}
{"type":"turn.started"}
{"type":"item.completed","item":{"id":"item_0","type":"agent_message","text":"4"}}
{"type":"turn.completed","usage":{"input_tokens":11455,"cached_input_tokens":0,"cache_write_input_tokens":11452,"output_tokens":5,"reasoning_output_tokens":0}}

turn.completed イベントにトークン使用量が入っているため、CI 上で「このジョブが何トークン消費したか」をそのままログ集計に流用できます。item.completedtext を拾えば最終出力だけを取り出すのも簡単です。

以下は、ここまでの exec 呼び出しの流れを整理した図です。

対話TUIはこの環境では応答が返らなかった

比較として、引数なしで codex を実行する対話 TUI モードも試しました。TUI は疑似端末(PTY)を要求するため、Python の pty モジュールで疑似端末を用意し、端末の色問い合わせ(OSC 10/11)にもダミー応答を返すようにした上で起動しています。

import pty, os, subprocess
master, slave = pty.openpty()
p = subprocess.Popen(["npx", "--yes", "@openai/codex"], stdin=slave, stdout=slave, stderr=slave)

起動後 30 秒以上待っても、画面には起動スピナー(⠙⠹⠸⠼)が表示されたまま先へ進みませんでした。exec は同じネットワーク環境・同じ API キーで正常に応答が返ってきているため、OpenAI 側の API 疎通そのものは問題ありません。doctor が起動直後に警告していた Responses WebSocket failed; HTTPS fallback may still work という一文と合わせて考えると、対話 TUI は WebSocket 経由のストリーミング接続を前提にしており、このクラウドサンドボックス環境ではその接続が確立できずに待機し続けている、というのが最も筋の通る説明です(exec は HTTPS フォールバック側の経路を使っていると推測されます。Codex CLI 自体がこの切り分けを明示するログを出さないため、断定はできません)。

/import のような便利機能はこの対話 TUI 側でのみ提供されるスラッシュコマンドです。TUI に到達できない環境では、当然 /import にも到達できません。つまり CI・自動化パイプラインで Codex CLI を使う設計をするなら、TUI 専用機能を前提にせず exec で完結する運用に倒すのが安全です。

著者視点の発見ポイント

このリポジトリの運用パイプライン自体が Claude Code のクラウドスケジュール実行で動いており、「別のエージェント CLI をこの環境から呼び出せるか」は他人事ではない検証でした。実際に手を動かして分かったのは、「ログインできるか」と「対話操作ができるか」は別軸で確認しないといけない という点です。API キーでのログイン自体は一瞬で完結したのに、対話 TUI は 30 秒以上待っても応答が返らず、exec との違いが浮き彫りになりました。

doctor コマンドが最初から websocket 警告を出していたことにも意味があると気づいたのは、TUI がハングしてから doctor の出力を読み返した後でした。新しい CLI ツールをサンドボックス環境に導入するときは、doctor のような診断コマンドがあれば実行タスクを投げる前に一度読んでおくと、ハングの原因の当たりを付けやすくなります。

まとめ

  • Codex CLI(codex-cli 0.149.1)は printenv OPENAI_API_KEY | codex login --with-api-key でブラウザ・TTY なしにログインできる
  • exec --sandbox workspace-write で非対話のままファイル作成・編集タスクを実行でき、--json で CI パース向けの構造化ログも得られる
  • 対話 TUI はこのクラウドサンドボックス環境では起動画面から進まず、doctor が警告する WebSocket 接続失敗と符合する
  • /import を含む TUI 専用機能はこの制約の影響を受けるため、CI・自動化パイプラインへの組み込みは exec に一本化するのが現実的

関連記事

参考リンク

  1. Non-interactive mode | ChatGPT Learn — Codex CLI 公式ドキュメント。codex exec をCI/自動化パイプラインから呼び出す非対話実行が説明されている

  2. OpenAI GPT-5.6 Sol, Terra, and Luna now generally available on Amazon Bedrock — AWS公式アナウンス(2026年7月)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?