こんにちは、わかっち (@wakatchi_tech) です。

OpenAI CodexでGitHubのプライベートリポジトリに接続するときに必須の設定があるので、メモしておきます。

TL;DR;

OpenAI Codexの環境でComposer依存を解決するときにGitHubのプライベートリポジトリへアクセスするなら、GitHub PAT(Personal Access Token)を JSON で包んだCOMPOSER_AUTHをシークレットとして渡すのが王道です。

Composerが持つ“環境変数ベース認証”の仕組みをそのまま利用でき、Codex側はシークレットをコンテナに自動注入してくれるので、余計な設定ファイルをコミットせずに済みます。

なお、Codexでシークレットに設定するときは、アクセストークンそのものではなく、github-oauthのJSONで包むことをお忘れなく。

はじめに

最近Codexに触れたときに、composer install404 / authentication requiredで止まりました。

調べてみると、Codexのセットアップスクリプトは Dockerコンテナ + ネットワーク制限下で動くため、ComposerがGitHubと握手できなかった模様。

解決策は COMPOSER_AUTHをCodexのシークレットに登録すること....という、まぁ当たり前の知見にたどり着いたので、メモ代わりに手順とハマりポイントをまとめます。

この記事は次のような方にお勧めです

  • OpenAI CodexでPHP/Composerプロジェクトを動かしたい開発者
  • プライベートGitHubリポジトリを依存に含むプロジェクトをビルドしたい人
  • CI/CDやクラウドIDEでシークレット管理をスマートにしたい エンジニア
  • composer install404 / authentication requiredで止まって困っている人
  • PAT + COMPOSER_AUTH のベストプラクティスを押さえたい人

COMPOSER_AUTHってそもそも何者?

  • Composerはauth.jsonの代わりにCOMPOSER_AUTH環境変数を読む機能を持つ。
  • 値は auth.json と同じJSON を“1行で”格納するだけ {"github-oauth":{"github.com":"ghp_xxxxx..."}} (Codex では後述のシークレットに貼り付ければ OK)

この方法ならリポジトリに認証情報を置かずに済むので、GitOps 的にも安心ですね。1

GITHUB_TOKEN じゃダメなの?

GitHub Actionsでは自動生成されるGITHUB_TOKENでもプライベートリポジトリにアクセスは 一応できます。
ただし....

  1. 作用範囲が狭い
    GITHUB_TOKENは そのリポジトリ限定 で、組織横断の依存を解決したいケースでは足りません。
  2. 有効期限が短い
    ランナー実行ごとに発行され、外部サービス(Composer コンテナなど)からは再利用できない。
  3. Composer の認証形式と相性がイマイチ
    GITHUB_TOKENを環境変数に渡すだけでは Composer は認識せず、追加スクリプトで auth.json を書き換える必要がある。

これらを踏まえると、常時利用できて JSON 一発で済む COMPOSER_AUTH をシークレットに置くほうが楽だし安全です。

“限定トークン”より“専用 PAT”──が GitOps 的ベストプラクティス、というわけです。


なぜCodexでCOMPOSER_AUTHが必要になるのか

  1. Codexはローカルまたはクラウドの隔離コンテナでコードを実行する設計
  2. コンテナにはGitHub PATが入っていないため、アプリが必要とする依存ライブラリを取得できずに composer installが失敗
  3. CodexのEnvironment > Secrets で渡せるのは 環境変数とシークレット
  4. Composer の環境変数認証と相性が良い → COMPOSER_AUTH 一択 となる

dev.to の実践記事でも同じ手順が紹介されており、PHPの開発者の多くが通る道です。2


Codexの環境にシークレットを登録する

GitHubでアクセストークンを発行し、Codexのダッシュボードでシークレットを登録すれば、composer installが通るようになります。

GitHubでアクセストークンを発行

アカウントのsettings > Developer settings > Personal access tokensで、アクセストークン(PAT)を発行します。

Fine-grained-tokensとクラシックトークンのどちらでもOKです。

repo スコープがあれば OK。3

ステップ
1

JSON を 1 行で作る

発行したアクセストークンを使って文字列を作成します。

{"github-oauth":{"github.com":"<PAT>"}}

ステップ
2

Codex → EnvironmentSecretsでCOMPOSER_AUTH を追加

COMPSER_AUTHのvalueに、ステップ2で作ったJSONをコピペします。

アクセストークンをそのままコピペするだけだと、認証に失敗します。

私はJSON形式だということをすっかり忘れてて、トラブルシュートに時間を浪費しました。

ステップ
3

Setup Script で念のためチェック

Setup Scriptで: "${COMPOSER_AUTH:?}"と記述し、ターミナルで実行してみると、COMPOSER_AUTHが正しく設定いるかを確認します。

ターミナルの実行結果から、ステップ2で設定したJSONが正しく設定されているかを確認しましょう。

: "${COMPOSER_AUTH:?}"
ステップ
4

トラブルシューティング & ベストプラクティス

アクセストークンが無効で 404

PATの有効期限切れ、もしくはスコープ不足を疑う。4

以下のコマンドでチェック。

curl -H "Authorization: token <PAT>" https://api.github.com/user

JSON の改行混入でパースエラー

エディタで改行を消す or VS Code の「1行にする」コマンドで整形。

CI/CDで別レポジトリのPATが必要

GITHUB_TOKEN は対象リポジトリ限定なので、PAT を発行して秘密変数に が基本。

Stack Overflow 事例集

GitLab CI でも同じく COMPOSER_AUTH 必須、未設定だとビルド失敗する。5

SSH Instead 派もいるが、Codex では環境変数だけで完結する方が楽。6


おわりに

Codex は「コンテナでコードを動かす AI エージェント」なので、外部サービス認証の扱いがキモになります。

COMPOSER_AUTH をシークレットとして用意しておけば、Composer周りのプライベートリポジトリあるあるを一発で解決でき、セットアップスクリプトもスッキリ。

わかっち

これでもう auth.json を.gitIgnoreし忘れて焦る日々とはおさらば!

本記事の内容でハマりポイントを潰して、楽しいCodexライフをエンジョイしましょう。

本記事が少しでもお役に立てれば幸いです。

最後までお読みいただき、ありがとうございました!

参考文献
  1. Documentation on using composer with private repositories ↩︎
  2. How to Make ChatGPT Codex Work with PHP and Symfony ↩︎
  3. enerate a GitHub Personal Access Token for Private Composer Packages ↩︎
  4. Documentation on using composer with private repositories ↩︎
  5. Gitlab Autodeploy Laravel private repo composer install COMPOSER_AUTH env var not read ↩︎
  6. How to add private github repository as Composer dependency Ask Question ↩︎