<p class="wp-block-paragraph">こんにちは、わかっち (<a href="https://twitter.com/wakatchi_tech">@wakatchi_tech</a>) です。</p>
<p class="wp-block-paragraph">OpenAI CodexでGitHubのプライベートリポジトリに接続するときに必須の設定があるので、メモしておきます。</p>
<h2 class="wp-block-heading" id="vk-htags-f017e58a-ecc6-4358-b807-d3c8e45e4983">TL;DR;</h2>
<p class="wp-block-paragraph" style="font-size:18px">OpenAI Codexの環境で<strong>Compose</strong>r依存を解決するときにGitHubのプライベートリポジトリへアクセスするなら、GitHub PAT(Personal Access Token)を JSON で包んだ<strong><span data-color="#ff6900" style="background: linear-gradient(transparent 60%,rgba(255, 105, 0, 0.7) 0);" class="vk_highlighter">COMPOSER_AUTH</span></strong>をシークレットとして渡すのが王道です。</p>
<p class="wp-block-paragraph" style="font-size:18px">Composerが持つ“環境変数ベース認証”の仕組みをそのまま利用でき、Codex側はシークレットをコンテナに自動注入してくれるので、余計な設定ファイルをコミットせずに済みます。</p>
<p class="wp-block-paragraph">なお、Codexでシークレットに設定するときは、アクセストークンそのものではなく、<code>github-oauth</code>のJSONで包むことをお忘れなく。</p>
<h2 class="wp-block-heading" id="vk-htags-89285c4e-8501-40d2-9e9f-435127c4c9fe">はじめに</h2>
<p class="wp-block-paragraph" style="font-size:18px">最近Codexに触れたときに、<code>composer install</code>が<strong>404 / authentication required</strong>で止まりました。</p>
<p class="wp-block-paragraph" style="font-size:18px">調べてみると、Codexのセットアップスクリプトは Dockerコンテナ + ネットワーク制限下で動くため、ComposerがGitHubと握手できなかった模様。</p>
<p class="wp-block-paragraph" style="font-size:18px">解決策は <strong><span data-color="#ff6900" style="background: linear-gradient(transparent 60%,rgba(255, 105, 0, 0.7) 0);" class="vk_highlighter">COMPOSER_AUTH</span></strong>をCodexのシークレットに登録すること....という、まぁ当たり前の知見にたどり着いたので、メモ代わりに手順とハマりポイントをまとめます。 </p>
<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-md--margin-top"></div></div>
<div class="wp-block-vk-blocks-border-box vk_borderBox vk_borderBox-background-transparent has-text-color has-pale-cyan-blue-color is-style-vk_borderBox-style-solid-kado-tit-tab"><div class="vk_borderBox_title_container has-background has-pale-cyan-blue-background-color"><i class=""></i><h4 class="vk_borderBox_title"><strong>この記事は次のような方にお勧めです</strong></h4></div><div class="vk_borderBox_body">
<ul class="wp-block-list">
<li style="font-size:18px">OpenAI CodexでPHP/Composerプロジェクトを動かしたい開発者</li>
<li style="font-size:18px">プライベートGitHubリポジトリを依存に含むプロジェクトをビルドしたい人</li>
<li style="font-size:18px">CI/CDやクラウドIDEでシークレット管理をスマートにしたい エンジニア</li>
<li style="font-size:18px"><code>composer install</code>が<strong>404 / authentication required</strong>で止まって困っている人</li>
<li style="font-size:18px"><strong>PAT + <span data-color="#ff6900" style="background: linear-gradient(transparent 60%,rgba(255, 105, 0, 0.7) 0);" class="vk_highlighter">COMPOSER_AUTH</span></strong> のベストプラクティスを押さえたい人</li>
</ul>
</div></div>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<div class="wp-block-vk-blocks-table-of-contents-new vk_tableOfContents vk_tableOfContents-style-default tabs"><div class="tab"><div class="vk_tableOfContents_title">目次</div><input type="checkbox" id="chck1"/><label class="tab-label vk_tableOfContents_openCloseBtn button_status button_status-open" for="chck1" id="vk-tab-label">CLOSE</label><ul class="vk_tableOfContents_list tab_content-open">
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-2">
<a href="#vk-htags-f017e58a-ecc6-4358-b807-d3c8e45e4983" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">1. </span>
TL;DR;
</a>
</li>
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-2">
<a href="#vk-htags-89285c4e-8501-40d2-9e9f-435127c4c9fe" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">2. </span>
はじめに
</a>
</li>
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-2">
<a href="#vk-htags-dbfefd0b-e066-4d5c-8198-1b7668718e7f" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">3. </span>
COMPOSER_AUTHってそもそも何者?
</a>
</li>
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-2">
<a href="#vk-htags-d2a996e7-1bfc-421c-9b37-d6e65e5aa9c6" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">4. </span>
なぜCodexでCOMPOSER_AUTHが必要になるのか
</a>
</li>
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-2">
<a href="#vk-htags-3d923c28-1f39-43d1-83cd-fcc3f0f58bd5" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">5. </span>
Codexの環境にシークレットを登録する
</a>
</li>
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-2">
<a href="#vk-htags-35926af7-9d05-472a-ac9d-789cfaa1f8f4" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">6. </span>
トラブルシューティング & ベストプラクティス
</a>
</li>
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-4">
<a href="#vk-htags-a84309fa-8f4c-4281-b9d5-02e91c191b61" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">6.1.1. </span>
アクセストークンが無効で 404
</a>
</li>
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-4">
<a href="#vk-htags-139a447d-2891-41b1-b078-a302388c8e2a" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">6.1.2. </span>
JSON の改行混入でパースエラー
</a>
</li>
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-4">
<a href="#vk-htags-2603cee0-75fc-413f-92a2-3893c5bc3427" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">6.1.3. </span>
CI/CDで別レポジトリのPATが必要
</a>
</li>
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-4">
<a href="#vk-htags-626e2086-0272-4355-8600-6027b84becfa" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">6.1.4. </span>
Stack Overflow 事例集
</a>
</li>
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-2">
<a href="#vk-htags-2c2c0033-223e-4003-8438-078295fcf107" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">7. </span>
おわりに
</a>
</li>
<li class="vk_tableOfContents_list_item vk_tableOfContents_list_item-h-6">
<a href="#vk-htags-d83403ff-52f5-4764-9ebc-928fc3e39b8d" class="vk_tableOfContents_list_item_link">
<span class="vk_tableOfContents_list_item_link_preNumber">7.1.1.1.1. </span>
参考文献
</a>
</li>
</ul></div></div>
<h2 class="wp-block-heading" id="vk-htags-dbfefd0b-e066-4d5c-8198-1b7668718e7f">COMPOSER_AUTHってそもそも何者?</h2>
<ul class="wp-block-list">
<li style="font-size:18px">Composerは<code>auth.json</code>の代わりに<strong><span data-color="#ff6900" style="background: linear-gradient(transparent 60%,rgba(255, 105, 0, 0.7) 0);" class="vk_highlighter">COMPOSER_AUTH</span></strong>環境変数を読む機能を持つ。</li>
<li style="font-size:18px">値は <code>auth.json</code> と同じJSON を“1行で”格納するだけ <code>{"github-oauth":{"github.com":"ghp_xxxxx..."}}</code> (Codex では後述のシークレットに貼り付ければ OK)</li>
</ul>
<p class="wp-block-paragraph" style="font-size:18px">この方法ならリポジトリに認証情報を置かずに済むので、GitOps 的にも安心ですね。<sup data-fn="9c31462e-15b1-424f-bb7e-231d527049bd" class="fn"><a id="9c31462e-15b1-424f-bb7e-231d527049bd-link" href="#9c31462e-15b1-424f-bb7e-231d527049bd">1</a></sup></p>
<div class="wp-block-vk-blocks-alert vk_alert alert alert-warning has-alert-icon"><div class="vk_alert_icon"><div class="vk_alert_icon_icon"><i class="fa-solid fa-circle-info" aria-hidden="true"></i></div><div class="vk_alert_icon_text"><span></span></div></div><div class="vk_alert_content">
<h3 class="wp-block-heading"><code>GITHUB_TOKEN </code>じゃダメなの?</h3>
<p class="wp-block-paragraph" style="font-size:18px">GitHub Actionsでは自動生成される<code>GITHUB_TOKEN</code>でもプライベートリポジトリにアクセスは<strong> </strong>一応できます。<br>ただし....</p>
<ol class="wp-block-list">
<li style="font-size:18px"><strong>作用範囲が狭い</strong><br><code>GITHUB_TOKEN</code>は そのリポジトリ限定 で、組織横断の依存を解決したいケースでは足りません。</li>
<li style="font-size:18px"><strong>有効期限が短い</strong><br>ランナー実行ごとに発行され、外部サービス(Composer コンテナなど)からは再利用できない。</li>
<li style="font-size:18px"><strong>Composer の認証形式と相性がイマイチ</strong><br><code>GITHUB_TOKEN</code>を環境変数に渡すだけでは Composer は認識せず、追加スクリプトで <code>auth.json</code> を書き換える必要がある。</li>
</ol>
<p class="wp-block-paragraph" style="font-size:18px">これらを踏まえると、常時利用できて JSON 一発で済む <span data-color="#ff6900" style="background: linear-gradient(transparent 60%,rgba(255, 105, 0, 0.7) 0);" class="vk_highlighter">COMPOSER_AUTH</span> をシークレットに置くほうが楽だし安全です。</p>
<p class="wp-block-paragraph" style="font-size:18px">“限定トークン”より“専用 PAT”──が GitOps 的ベストプラクティス、というわけです。</p>
</div></div>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<h2 class="wp-block-heading" id="vk-htags-d2a996e7-1bfc-421c-9b37-d6e65e5aa9c6">なぜCodexでCOMPOSER_AUTHが必要になるのか</h2>
<ol class="wp-block-list">
<li style="font-size:18px">Codexはローカルまたはクラウドの隔離コンテナでコードを実行する設計</li>
<li style="font-size:18px">コンテナにはGitHub PATが入っていないため、アプリが必要とする依存ライブラリを取得できずに <code>composer install</code>が失敗</li>
<li style="font-size:18px">Codexの<em>Environment > Secrets</em> で渡せるのは 環境変数とシークレット</li>
<li style="font-size:18px">Composer の環境変数認証と相性が良い → <strong><span data-color="#ff6900" style="background: linear-gradient(transparent 60%,rgba(255, 105, 0, 0.7) 0);" class="vk_highlighter">COMPOSER_AUTH</span> 一択</strong> となる</li>
</ol>
<p class="wp-block-paragraph">dev.to の実践記事でも同じ手順が紹介されており、PHPの開発者の多くが通る道です。<sup data-fn="741a1138-3db3-4a17-be42-b24867f8b82a" class="fn"><a id="741a1138-3db3-4a17-be42-b24867f8b82a-link" href="#741a1138-3db3-4a17-be42-b24867f8b82a">2</a></sup></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-sm--margin-top"></div></div>
<h2 class="wp-block-heading" id="vk-htags-3d923c28-1f39-43d1-83cd-fcc3f0f58bd5">Codexの環境にシークレットを登録する</h2>
<p class="wp-block-paragraph">GitHubでアクセストークンを発行し、Codexのダッシュボードでシークレットを登録すれば、<code>composer install</code>が通るようになります。</p>
<div class="wp-block-vk-blocks-step vk_step">
<div class="wp-block-vk-blocks-step-item vk_step_item vk_step_item_lineStyle-default"><div class="vk_step_item_content">
<h4 class="wp-block-heading">GitHubでアクセストークンを発行</h4>
<figure data-wp-context="{"imageId":"6a25e01dc8c86"}" data-wp-interactive="core/image" data-wp-key="6a25e01dc8c86" class="wp-block-image size-full wp-lightbox-container"><img data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://wakatchi.dev/wp-content/uploads/2025/06/openai-codex-composer-auth-private-repo-1.webp" alt="GitHubのPersonal Access Token作成画面で、Composer用のトークンを発行している様子" class="wp-image-2288"/><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.thisImage.buttonRight"
data-wp-style--top="state.thisImage.buttonTop"
>
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
</svg>
</button></figure>
<p class="wp-block-paragraph">アカウントのsettings > Developer settings > Personal access tokensで、アクセストークン(PAT)を発行します。</p>
<p class="wp-block-paragraph">Fine-grained-tokensとクラシックトークンのどちらでもOKです。</p>
<p class="wp-block-paragraph"><code>repo</code> スコープがあれば OK。<sup data-fn="675f0b57-8c93-40e2-912b-aa6398941f09" class="fn"><a id="675f0b57-8c93-40e2-912b-aa6398941f09-link" href="#675f0b57-8c93-40e2-912b-aa6398941f09">3</a></sup></p>
</div><div class="vk_step_item_dot vk_step_item_style-outlined has-text-color has-luminous-vivid-orange-color"><div class="vk_step_item_dot_caption">ステップ</div><div class="vk_step_item_dot_num">1</div></div></div>
<div class="wp-block-vk-blocks-step-item vk_step_item vk_step_item_lineStyle-default"><div class="vk_step_item_content">
<h4 class="wp-block-heading">JSON を 1 行で作る</h4>
<p class="wp-block-paragraph">発行したアクセストークンを使って文字列を作成します。</p>
<p class="wp-block-paragraph"><code>{"github-oauth":{"github.com":"<PAT>"}}</code></p>
</div><div class="vk_step_item_dot vk_step_item_style-outlined has-text-color has-luminous-vivid-orange-color"><div class="vk_step_item_dot_caption">ステップ</div><div class="vk_step_item_dot_num">2</div></div></div>
<div class="wp-block-vk-blocks-step-item vk_step_item vk_step_item_lineStyle-default"><div class="vk_step_item_content">
<h4 class="wp-block-heading">Codex → <strong>Environment</strong> → <strong>Secrets</strong>でCOMPOSER_AUTH を追加</h4>
<figure data-wp-context="{"imageId":"6a25e01dc9abf"}" data-wp-interactive="core/image" data-wp-key="6a25e01dc9abf" class="wp-block-image size-large wp-lightbox-container"><img data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://wakatchi.dev/wp-content/uploads/2025/06/openai-codex-composer-auth-private-repo-2-1024x856.webp" alt="OpenAI CodexのSecrets欄にCOMPOSER_AUTHが登録された状態の環境設定画面" class="wp-image-2294"/><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.thisImage.buttonRight"
data-wp-style--top="state.thisImage.buttonTop"
>
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
</svg>
</button><figcaption class="wp-element-caption">CodexのSecretsにCOMPOSER_AUTHを追加すれば、Composerがプライベートリポジトリに認証付きでアクセス可能になる</figcaption></figure>
<p class="wp-block-paragraph">COMPSER_AUTHのvalueに、ステップ2で作ったJSONをコピペします。</p>
<p class="wp-block-paragraph">アクセストークンをそのままコピペするだけだと、認証に失敗します。</p>
<p class="wp-block-paragraph">私はJSON形式だということをすっかり忘れてて、トラブルシュートに時間を浪費しました。</p>
</div><div class="vk_step_item_dot vk_step_item_style-outlined has-text-color has-luminous-vivid-orange-color"><div class="vk_step_item_dot_caption">ステップ</div><div class="vk_step_item_dot_num">3</div></div></div>
<div class="wp-block-vk-blocks-step-item vk_step_item vk_step_item_lineStyle-none"><div class="vk_step_item_content">
<h4 class="wp-block-heading">Setup Script で念のためチェック</h4>
<figure data-wp-context="{"imageId":"6a25e01dca532"}" data-wp-interactive="core/image" data-wp-key="6a25e01dca532" class="wp-block-image size-large wp-lightbox-container"><img data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://wakatchi.dev/wp-content/uploads/2025/06/openai-codex-composer-auth-private-repo-3-1024x506.jpg" alt="OpenAI Codex のターミナルで COMPOSER_AUTH が正しく反映され、composer の認証が成功している様子" class="wp-image-2297"/><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.thisImage.buttonRight"
data-wp-style--top="state.thisImage.buttonTop"
>
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
</svg>
</button></figure>
<p class="wp-block-paragraph">Setup Scriptで<code>: "${COMPOSER_AUTH:?}"</code>と記述し、ターミナルで実行してみると、<span data-color="#ff6900" style="background: linear-gradient(transparent 60%,rgba(255, 105, 0, 0.7) 0);" class="vk_highlighter">COMPOSER_AUTH</span>が正しく設定いるかを確認します。</p>
<p class="wp-block-paragraph">ターミナルの実行結果から、ステップ2で設定したJSONが正しく設定されているかを確認しましょう。</p>
<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>: "${COMPOSER_AUTH:?}"</code></pre></div>
</div><div class="vk_step_item_dot vk_step_item_style-outlined has-text-color has-luminous-vivid-orange-color"><div class="vk_step_item_dot_caption">ステップ</div><div class="vk_step_item_dot_num">4</div></div></div>
</div>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<h2 class="wp-block-heading" id="vk-htags-35926af7-9d05-472a-ac9d-789cfaa1f8f4">トラブルシューティング & ベストプラクティス</h2>
<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-sm--margin-top"></div></div>
<h4 class="wp-block-heading" id="vk-htags-a84309fa-8f4c-4281-b9d5-02e91c191b61" style="font-size:18px"><strong>アクセストークンが無効で 404</strong></h4>
<p class="wp-block-paragraph">PATの有効期限切れ、もしくはスコープ不足を疑う。<sup data-fn="4e273f8b-b29c-4d0a-a6df-ec1a18fbf3e8" class="fn"><a id="4e273f8b-b29c-4d0a-a6df-ec1a18fbf3e8-link" href="#4e273f8b-b29c-4d0a-a6df-ec1a18fbf3e8">4</a></sup></p>
<p class="wp-block-paragraph">以下のコマンドでチェック。</p>
<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>curl -H "Authorization: token <PAT>" https://api.github.com/user</code></pre></div>
<div class="wp-block-vk-blocks-spacer vk_spacer vk_spacer-type-margin-top"><div class="vk_block-margin-sm--margin-top"></div></div>
<h4 class="wp-block-heading" id="vk-htags-139a447d-2891-41b1-b078-a302388c8e2a"><strong>JSON の改行混入でパースエラー</strong></h4>
<p class="wp-block-paragraph">エディタで改行を消す or VS Code の「1行にする」コマンドで整形。</p>
<h4 class="wp-block-heading" id="vk-htags-2603cee0-75fc-413f-92a2-3893c5bc3427"><strong>CI/CDで別レポジトリのPATが必要</strong></h4>
<p class="wp-block-paragraph"><code>GITHUB_TOKEN</code> は対象リポジトリ限定なので、<em>PAT を発行して秘密変数に</em> が基本。</p>
<h4 class="wp-block-heading" id="vk-htags-626e2086-0272-4355-8600-6027b84becfa"><strong>Stack Overflow 事例集</strong></h4>
<p class="wp-block-paragraph">GitLab CI でも同じく <code>COMPOSER_AUTH</code> 必須、未設定だとビルド失敗する。<sup data-fn="f22beb40-8cf4-4a63-a511-6ca4ca65d468" class="fn"><a id="f22beb40-8cf4-4a63-a511-6ca4ca65d468-link" href="#f22beb40-8cf4-4a63-a511-6ca4ca65d468">5</a></sup></p>
<p class="wp-block-paragraph">SSH Instead 派もいるが、Codex では環境変数だけで完結する方が楽。<sup data-fn="f7686990-96db-41c5-81ec-be20a5720c8e" class="fn"><a id="f7686990-96db-41c5-81ec-be20a5720c8e-link" href="#f7686990-96db-41c5-81ec-be20a5720c8e">6</a></sup></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<h2 class="wp-block-heading" id="vk-htags-2c2c0033-223e-4003-8438-078295fcf107">おわりに</h2>
<p class="wp-block-paragraph" style="font-size:18px">Codex は「<span data-color="#fcb900" style="background: linear-gradient(transparent 60%,rgba(252, 185, 0, 0.7) 0);" class="vk_highlighter">コンテナでコードを動かす AI エージェント</span>」なので、外部サービス認証の扱いがキモになります。</p>
<p class="wp-block-paragraph" style="font-size:18px"><strong><span data-color="#ff6900" style="background: linear-gradient(transparent 60%,rgba(255, 105, 0, 0.7) 0);" class="vk_highlighter">COMPOSER_AUTH</span></strong> をシークレットとして用意しておけば、Composer周りのプライベートリポジトリあるあるを一発で解決でき、セットアップスクリプトもスッキリ。</p>
<div class="wp-block-vk-blocks-balloon vk_balloon vk_balloon-position-left vk_balloon-type-speech vk_balloon-animation-none"><div class="vk_balloon_icon"><figure><img class="vk_balloon_icon_image vk_balloon_icon_image-type-normal " src="https://wakatchi.dev/wp-content/uploads/2022/07/wakatchi_icon_2.jpg" alt=""/><figcaption class="vk_balloon_icon_name">わかっち</figcaption></figure></div><div class="vk_balloon_content_outer"><div class="vk_balloon_content has-background-color has-luminous-vivid-amber-background-color "><span class="vk_balloon_content_before has-text-color has-luminous-vivid-amber-color"></span><span class="vk_balloon_content_after "></span>
<p class="wp-block-paragraph">これでもう <code>auth.json</code> を.gitIgnoreし忘れて焦る日々とはおさらば!</p>
</div></div></div>
<p class="wp-block-paragraph" style="font-size:18px">本記事の内容でハマりポイントを潰して、楽しいCodexライフをエンジョイしましょう。</p>
<p class="wp-block-paragraph" style="font-size:18px">本記事が少しでもお役に立てれば幸いです。</p>
<p class="wp-block-paragraph" style="font-size:18px">最後までお読みいただき、ありがとうございました!</p>
<h6 class="wp-block-heading" id="vk-htags-d83403ff-52f5-4764-9ebc-928fc3e39b8d">参考文献</h6>
<ol class="wp-block-footnotes"><li id="9c31462e-15b1-424f-bb7e-231d527049bd"><a href="https://github.com/shivammathur/setup-php/issues/107" target="_blank" data-type="link" data-id="https://github.com/shivammathur/setup-php/issues/107" rel="noreferrer noopener nofollow">Documentation on using composer with private repositories</a> <a href="#9c31462e-15b1-424f-bb7e-231d527049bd-link" aria-label="脚注参照1にジャンプ">↩︎</a></li><li id="741a1138-3db3-4a17-be42-b24867f8b82a"><a href="https://dev.to/javiereguiluz/how-to-make-chatgpt-codex-work-with-php-and-symfony-4lj8" target="_blank" rel="noreferrer noopener nofollow">How to Make ChatGPT Codex Work with PHP and Symfony</a> <a href="#741a1138-3db3-4a17-be42-b24867f8b82a-link" aria-label="脚注参照2にジャンプ">↩︎</a></li><li id="675f0b57-8c93-40e2-912b-aa6398941f09"><a href="https://gist.github.com/jeffersonmartin/d0d4a8dfec90d224d14f250b36c74d2f" data-type="link" data-id="https://gist.github.com/jeffersonmartin/d0d4a8dfec90d224d14f250b36c74d2f" target="_blank" rel="noreferrer noopener nofollow">enerate a GitHub Personal Access Token for Private Composer Packages</a> <a href="#675f0b57-8c93-40e2-912b-aa6398941f09-link" aria-label="脚注参照3にジャンプ">↩︎</a></li><li id="4e273f8b-b29c-4d0a-a6df-ec1a18fbf3e8"><a href="https://github.com/shivammathur/setup-php/issues/107" target="_blank" data-type="link" data-id="https://github.com/shivammathur/setup-php/issues/107" rel="noreferrer noopener nofollow">Documentation on using composer with private repositories</a> <a href="#4e273f8b-b29c-4d0a-a6df-ec1a18fbf3e8-link" aria-label="脚注参照4にジャンプ">↩︎</a></li><li id="f22beb40-8cf4-4a63-a511-6ca4ca65d468"><a href="https://github.com/shivammathur/setup-php/issues/107" data-type="link" data-id="https://github.com/shivammathur/setup-php/issues/107"></a><a href="https://stackoverflow.com/questions/66896749/gitlab-autodeploy-laravel-private-repo-composer-install-composer-auth-env-var-no">Gitlab A</a><a href="https://stackoverflow.com/questions/66896749/gitlab-autodeploy-laravel-private-repo-composer-install-composer-auth-env-var-no" data-type="link" data-id="https://stackoverflow.com/questions/66896749/gitlab-autodeploy-laravel-private-repo-composer-install-composer-auth-env-var-no" target="_blank" rel="noreferrer noopener nofollow">utodeploy Laravel private repo composer install COMPOSER_AUTH env var not read</a> <a href="#f22beb40-8cf4-4a63-a511-6ca4ca65d468-link" aria-label="脚注参照5にジャンプ">↩︎</a></li><li id="f7686990-96db-41c5-81ec-be20a5720c8e"><a href="https://stackoverflow.com/questions/40619393/how-to-add-private-github-repository-as-composer-dependency" target="_blank" data-type="link" data-id="https://stackoverflow.com/questions/40619393/how-to-add-private-github-repository-as-composer-dependency" rel="noreferrer noopener nofollow">How to add private github repository as Composer dependency Ask Question</a> <a href="#f7686990-96db-41c5-81ec-be20a5720c8e-link" aria-label="脚注参照6にジャンプ">↩︎</a></li></ol>
<p class="wp-block-paragraph"></p>
こんにちは、わかっち (@wakatchi_tech) です。
OpenAI CodexでGitHubのプライベートリポジトリに接続するときに必須の設定があるので、メモしておきます。
OpenAI Codexの環境でComposer依存を解決するときにGitHubのプライベートリポジトリへアクセスするなら、GitHub PAT(Personal Access Token)を JSON で包んだCOMPOSER_AUTHをシークレットとして渡すのが王道です。
Composerが持つ“環境変数ベース認証”の仕組みをそのまま利用でき、Codex側はシークレットをコンテナに自動注入してくれるので、余計な設定ファイルをコミットせずに済みます。
なお、Codexでシークレットに設定するときは、アクセストークンそのものではなく、github-oauthのJSONで包むことをお忘れなく。
最近Codexに触れたときに、composer installが404 / authentication requiredで止まりました。
調べてみると、Codexのセットアップスクリプトは Dockerコンテナ + ネットワーク制限下で動くため、ComposerがGitHubと握手できなかった模様。
解決策は COMPOSER_AUTHをCodexのシークレットに登録すること....という、まぁ当たり前の知見にたどり着いたので、メモ代わりに手順とハマりポイントをまとめます。
この記事は次のような方にお勧めです
- OpenAI CodexでPHP/Composerプロジェクトを動かしたい開発者
- プライベートGitHubリポジトリを依存に含むプロジェクトをビルドしたい人
- CI/CDやクラウドIDEでシークレット管理をスマートにしたい エンジニア
composer installが404 / authentication requiredで止まって困っている人
- PAT + 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でもプライベートリポジトリにアクセスは 一応できます。
ただし....
- 作用範囲が狭い
GITHUB_TOKENは そのリポジトリ限定 で、組織横断の依存を解決したいケースでは足りません。
- 有効期限が短い
ランナー実行ごとに発行され、外部サービス(Composer コンテナなど)からは再利用できない。
- Composer の認証形式と相性がイマイチ
GITHUB_TOKENを環境変数に渡すだけでは Composer は認識せず、追加スクリプトで auth.json を書き換える必要がある。
これらを踏まえると、常時利用できて JSON 一発で済む COMPOSER_AUTH をシークレットに置くほうが楽だし安全です。
“限定トークン”より“専用 PAT”──が GitOps 的ベストプラクティス、というわけです。
- Codexはローカルまたはクラウドの隔離コンテナでコードを実行する設計
- コンテナにはGitHub PATが入っていないため、アプリが必要とする依存ライブラリを取得できずに
composer installが失敗
- CodexのEnvironment > Secrets で渡せるのは 環境変数とシークレット
- Composer の環境変数認証と相性が良い → COMPOSER_AUTH 一択 となる
dev.to の実践記事でも同じ手順が紹介されており、PHPの開発者の多くが通る道です。2
GitHubでアクセストークンを発行し、Codexのダッシュボードでシークレットを登録すれば、composer installが通るようになります。
GitHubでアクセストークンを発行
アカウントのsettings > Developer settings > Personal access tokensで、アクセストークン(PAT)を発行します。
Fine-grained-tokensとクラシックトークンのどちらでもOKです。
repo スコープがあれば OK。3
JSON を 1 行で作る
発行したアクセストークンを使って文字列を作成します。
{"github-oauth":{"github.com":"<PAT>"}}
Codex → Environment → SecretsでCOMPOSER_AUTH を追加
CodexのSecretsにCOMPOSER_AUTHを追加すれば、Composerがプライベートリポジトリに認証付きでアクセス可能になる
COMPSER_AUTHのvalueに、ステップ2で作ったJSONをコピペします。
アクセストークンをそのままコピペするだけだと、認証に失敗します。
私はJSON形式だということをすっかり忘れてて、トラブルシュートに時間を浪費しました。
Setup Script で念のためチェック
Setup Scriptで: "${COMPOSER_AUTH:?}"と記述し、ターミナルで実行してみると、COMPOSER_AUTHが正しく設定いるかを確認します。
ターミナルの実行結果から、ステップ2で設定したJSONが正しく設定されているかを確認しましょう。
PATの有効期限切れ、もしくはスコープ不足を疑う。4
以下のコマンドでチェック。
curl -H "Authorization: token <PAT>" https://api.github.com/user
エディタで改行を消す or VS Code の「1行にする」コマンドで整形。
GITHUB_TOKEN は対象リポジトリ限定なので、PAT を発行して秘密変数に が基本。
GitLab CI でも同じく COMPOSER_AUTH 必須、未設定だとビルド失敗する。5
SSH Instead 派もいるが、Codex では環境変数だけで完結する方が楽。6
Codex は「コンテナでコードを動かす AI エージェント」なので、外部サービス認証の扱いがキモになります。
COMPOSER_AUTH をシークレットとして用意しておけば、Composer周りのプライベートリポジトリあるあるを一発で解決でき、セットアップスクリプトもスッキリ。
わかっち
これでもう auth.json を.gitIgnoreし忘れて焦る日々とはおさらば!
本記事の内容でハマりポイントを潰して、楽しいCodexライフをエンジョイしましょう。
本記事が少しでもお役に立てれば幸いです。
最後までお読みいただき、ありがとうございました!