Maintenir l’authentification du compte Codex dans les pipelines CI/CD (avancé)
Utilisez le mécanisme d’actualisation intégré de Codex pour maintenir le fonctionnement d’auth.json sur des exécuteurs CI/CD de confiance
Ce guide explique comment maintenir le fonctionnement de l’authentification Codex gérée par ChatGPT sur un exécuteur CI/CD de confiance sans appeler vous-même le point de terminaison du jeton OAuth.
La méthode appropriée pour authentifier une automatisation consiste à utiliser une API key. N’utilisez ce guide que si vous devez expressément exécuter le workflow avec votre compte Codex.
Le principe est le suivant :
- Créez
auth.jsonune seule fois sur une machine de confiance aveccodex login. - Placez ce fichier sur l’exécuteur.
- Exécutez Codex normalement.
- Laissez Codex actualiser la session lorsqu’elle devient obsolète.
- Conservez le fichier
auth.jsonactualisé pour l’exécution suivante.
Il s’agit d’un workflow avancé destiné aux entreprises et aux autres automatisations privées de confiance. Les API keys restent l’option recommandée pour la plupart des tâches CI/CD.
Pourquoi cela fonctionne
Codex sait déjà comment actualiser une session gérée par ChatGPT.
Dans la version actuelle du client open source :
- Codex charge le cache d’authentification local depuis
auth.json - si
last_refreshdate de plus de 8 jours environ, Codex actualise le jeu de jetons avant la poursuite de l’exécution - après une actualisation réussie, Codex réécrit les nouveaux jetons et un nouveau
last_refreshdansauth.json - si une requête reçoit un
401, Codex dispose également d’un mécanisme intégré d’actualisation et de nouvelle tentative
Cela signifie que la stratégie CI/CD prise en charge n’est pas « appeler vous-même l’API d’actualisation ».
Elle consiste à « exécuter Codex et conserver le fichier auth.json mis à jour ».
Quand utiliser cette méthode
N’utilisez ce guide que lorsque toutes les conditions suivantes sont remplies :
- vous avez besoin de l’authentification Codex gérée par ChatGPT plutôt que d’une API key
codex loginne peut pas s’exécuter sur l’exécuteur distant- l’exécuteur appartient à une infrastructure privée de confiance
- vous pouvez conserver le fichier
auth.jsonactualisé entre les exécutions - une seule machine ou un seul flux de tâches sérialisé utilisera une copie donnée de
auth.json
Ce guide s’applique à l’authentification ChatGPT gérée par Codex (auth_mode: "chatgpt").
Il ne s’applique pas aux éléments suivants :
- authentification par API key
- intégrations hôtes utilisant des jetons externes (
auth_mode: "chatgptAuthTokens") - clients OAuth génériques externes à Codex
Si vos identifiants sont stockés dans le trousseau du système d’exploitation, passez d’abord à un stockage sur fichier. Consultez Stockage des identifiants.
Initialiser auth.json une seule fois
Sur une machine de confiance où la connexion par navigateur est possible :
- Configurez Codex pour stocker les identifiants dans un fichier :
cli_auth_credentials_store = "file"- Exécutez :
codex login- Vérifiez que le fichier correspond à une authentification ChatGPT gérée :
AUTH_FILE="${CODEX_HOME:-$HOME/.codex}/auth.json"
jq '{
auth_mode,
has_tokens: (.tokens != null),
has_refresh_token: ((.tokens.refresh_token // "") != ""),
last_refresh
}' "$AUTH_FILE"Ne poursuivez que si :
auth_modevaut"chatgpt"has_refresh_tokenvauttrue
Placez ensuite le contenu de auth.json dans votre gestionnaire de secrets CI/CD ou copiez-le
sur un exécuteur persistant de confiance.
Modèle recommandé : GitHub Actions sur un exécuteur auto-hébergé
La configuration entièrement automatisée la plus simple repose sur un exécuteur GitHub Actions auto-hébergé doté d’un
CODEX_HOME persistant.
Pourquoi ce modèle fonctionne bien :
- l’exécuteur peut conserver
auth.jsonsur le disque entre les tâches - Codex peut actualiser le fichier sur place
- les tâches ultérieures utilisent automatiquement les jetons actualisés
- vous n’avez besoin du secret d’origine que pour l’amorçage ou la réinitialisation
Le point essentiel consiste à initialiser auth.json uniquement s’il est absent. Si vous
réécrivez le fichier à partir du secret d’origine à chaque exécution, vous perdez les
jetons actualisés que Codex vient d’enregistrer.
Exemple de workflow planifié :
name: Keep Codex auth fresh
on:
schedule:
- cron: "0 9 * * 1"
workflow_dispatch:
jobs:
keep-codex-auth-fresh:
runs-on: self-hosted
steps:
- name: Bootstrap auth.json if needed
shell: bash
env:
CODEX_AUTH_JSON: ${{ secrets.CODEX_AUTH_JSON }}
run: |
export CODEX_HOME="${CODEX_HOME:-$HOME/.codex}"
mkdir -p "$CODEX_HOME"
chmod 700 "$CODEX_HOME"
if [ ! -f "$CODEX_HOME/auth.json" ]; then
printf '%s' "$CODEX_AUTH_JSON" > "$CODEX_HOME/auth.json"
chmod 600 "$CODEX_HOME/auth.json"
fi
- name: Run Codex
shell: bash
run: |
codex exec --json "Reply with the single word OK." >/dev/nullFonctionnement :
- la première exécution initialise
auth.json - les exécutions suivantes réutilisent le même fichier
- lorsque la session en cache devient suffisamment ancienne, Codex l’actualise pendant l’étape normale
codex exec - le fichier actualisé reste sur le disque pour l’exécution suivante du workflow
Une planification hebdomadaire suffit généralement, car le client open source actuel de Codex considère la session comme obsolète après environ 8 jours.
Exécuteurs éphémères : restaurer, exécuter Codex et conserver le fichier mis à jour
Si vous utilisez des exécuteurs hébergés par GitHub, des exécuteurs partagés GitLab ou tout autre environnement éphémère, le système de fichiers de l’exécuteur disparaît après chaque tâche. Dans cette configuration, vous avez besoin d’un aller-retour :
- restaurez le fichier
auth.jsonactuel depuis un stockage sécurisé - exécutez Codex
- réenregistrez le fichier
auth.jsonmis à jour dans le stockage sécurisé
Structure générique pour GitHub Actions :
name: Run Codex with managed auth
on:
workflow_dispatch:
jobs:
codex-job:
runs-on: ubuntu-latest
steps:
- name: Restore auth.json
shell: bash
run: |
export CODEX_HOME="${CODEX_HOME:-$HOME/.codex}"
mkdir -p "$CODEX_HOME"
chmod 700 "$CODEX_HOME"
# Replace this with your secret manager or secure storage command.
my-secret-cli read codex-auth-json > "$CODEX_HOME/auth.json"
chmod 600 "$CODEX_HOME/auth.json"
- name: Run Codex
shell: bash
run: |
codex exec --json "summarize the failing tests"
- name: Persist refreshed auth.json
if: always()
shell: bash
run: |
# Replace this with your secret manager or secure storage command.
my-secret-cli write codex-auth-json < "$CODEX_HOME/auth.json"L’exigence essentielle est que l’étape de réenregistrement stocke le fichier actualisé que Codex a produit pendant l’exécution, et non le fichier d’initialisation d’origine.
Vous n’avez pas besoin d’une commande d’actualisation distincte
Toute exécution normale de Codex peut actualiser la session.
Vous disposez donc de deux bonnes options :
- laisser votre tâche Codex CI/CD existante actualiser naturellement le fichier
- ajouter une tâche de maintenance planifiée légère, comme dans l’exemple GitHub Actions ci-dessus, si vos tâches réelles ne s’exécutent pas assez souvent
La première exécution de Codex après l’obsolescence de la session est celle qui actualise
auth.json.
Règles opérationnelles importantes
- Utilisez un fichier
auth.jsonpar exécuteur ou par flux de workflow sérialisé. - Ne partagez pas le même fichier entre des tâches simultanées ou plusieurs machines.
- N’écrasez pas à chaque exécution le fichier actualisé d’un exécuteur persistant avec le fichier d’initialisation d’origine.
- Ne stockez pas
auth.jsondans le dépôt, les journaux ou un stockage public d’artefacts. - Réinitialisez le fichier depuis une machine de confiance si l’actualisation intégrée cesse de fonctionner.
Que faire lorsque l’actualisation ne fonctionne plus
Ce mécanisme réduit les interventions manuelles, mais ne garantit pas que la même session durera indéfiniment.
Réinitialisez l’exécuteur avec un nouveau fichier auth.json si :
- Codex commence à renvoyer
401et l’exécuteur ne parvient plus à actualiser la session - le jeton d’actualisation a été révoqué ou a expiré
- une autre machine ou une tâche simultanée a renouvelé le jeton en premier
- l’aller-retour vers votre stockage sécurisé a échoué et un ancien fichier a été restauré
Pour réinitialiser le fichier :
- Exécutez
codex loginsur une machine de confiance. - Remplacez la copie CI/CD stockée de
auth.json. - Laissez la tâche suivante de l’exécuteur continuer à utiliser le mécanisme d’actualisation intégré de Codex.
Vérifier que l’exécuteur maintient la session
Vérifiez que l’exécuteur possède toujours des jetons d’authentification gérée et que last_refresh
existe :
AUTH_FILE="${CODEX_HOME:-$HOME/.codex}/auth.json"
jq '{
auth_mode,
last_refresh,
has_access_token: ((.tokens.access_token // "") != ""),
has_id_token: ((.tokens.id_token // "") != ""),
has_refresh_token: ((.tokens.refresh_token // "") != "")
}' "$AUTH_FILE"Si votre exécuteur est persistant, le même fichier doit continuer d’exister entre les exécutions. Si votre exécuteur est éphémère, vérifiez que l’étape de réenregistrement stocke le fichier mis à jour lors de la dernière tâche.
Références des sources
Si vous souhaitez vérifier ce comportement dans le client open source :
codex-rs/core/src/auth.rscouvre la détection des jetons obsolètes, l’actualisation automatique, la récupération par actualisation après une erreur 401 et la conservation des jetons actualiséscodex-rs/core/src/auth/storage.rscouvre le stockage deauth.jsonsur fichier