Mantener la autenticación de la cuenta de Codex en CI/CD (avanzado)
Usa el flujo de actualización integrado de Codex para mantener auth.json operativo en ejecutores de CI/CD de confianza
Esta guía muestra cómo mantener operativa la autenticación de Codex administrada por ChatGPT en un ejecutor de CI/CD de confianza sin llamar directamente al punto de conexión de tokens de OAuth.
La forma correcta de autenticar la automatización es mediante una API key. Usa esta guía solo si necesitas específicamente ejecutar el flujo de trabajo con tu cuenta de Codex.
El patrón es el siguiente:
- Crea
auth.jsonuna vez en una máquina de confianza concodex login. - Coloca ese archivo en el ejecutor.
- Ejecuta Codex con normalidad.
- Deja que Codex actualice la sesión cuando quede obsoleta.
- Conserva el archivo
auth.jsonactualizado para la siguiente ejecución.
Este es un flujo de trabajo avanzado para empresas y otros entornos privados de automatización de confianza. Las API keys siguen siendo la opción recomendada para la mayoría de los trabajos de CI/CD.
Por qué funciona
Codex ya sabe cómo actualizar una sesión administrada por ChatGPT.
En la versión actual del cliente de código abierto:
- Codex carga la caché de autenticación local desde
auth.json - si
last_refreshtiene más de unos 8 días, Codex actualiza el conjunto de tokens antes de que continúe la ejecución - después de una actualización correcta, Codex vuelve a escribir los tokens nuevos y un nuevo
last_refreshenauth.json - si una solicitud recibe un
401, Codex también dispone de una ruta integrada de actualización y reintento
Esto significa que la estrategia de CI/CD compatible no es «llamar directamente a la API de actualización».
Es «ejecutar Codex y conservar el archivo auth.json actualizado».
Cuándo usar esta guía
Usa esta guía solo cuando se cumplan todas las condiciones siguientes:
- necesitas la autenticación de Codex administrada por ChatGPT en lugar de una API key
codex loginno puede ejecutarse en el ejecutor remoto- el ejecutor es una infraestructura privada de confianza
- puedes conservar el archivo
auth.jsonactualizado entre ejecuciones - solo una máquina o un flujo de trabajos serializado utilizará una copia determinada de
auth.json
Esta guía se aplica a la autenticación de ChatGPT administrada por Codex (auth_mode: "chatgpt").
No se aplica a:
- la autenticación mediante API key
- las integraciones de host con tokens externos (
auth_mode: "chatgptAuthTokens") - los clientes OAuth genéricos externos a Codex
Si tus credenciales están almacenadas en el llavero del sistema operativo, cambia primero al almacenamiento basado en archivos. Consulta Almacenamiento de credenciales.
Inicializar auth.json una vez
En una máquina de confianza donde sea posible iniciar sesión mediante el navegador:
- Configura Codex para almacenar las credenciales en un archivo:
cli_auth_credentials_store = "file"- Ejecuta:
codex login- Comprueba que el archivo tenga el aspecto de una autenticación de ChatGPT administrada:
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"Continúa solo si:
auth_modees"chatgpt"has_refresh_tokenestrue
A continuación, coloca el contenido de auth.json en el gestor de secretos de CI/CD o cópialo
en un ejecutor persistente de confianza.
Patrón recomendado: GitHub Actions en un ejecutor autohospedado
La configuración totalmente automatizada más sencilla es un ejecutor autohospedado de GitHub Actions con un
CODEX_HOME persistente.
Por qué funciona bien este patrón:
- el ejecutor puede conservar
auth.jsonen el disco entre trabajos - Codex puede actualizar el archivo donde se encuentra
- los trabajos posteriores usan automáticamente los tokens actualizados
- solo necesitas el secreto original para la inicialización o una nueva inicialización
El detalle fundamental es inicializar auth.json solo si no existe. Si
reescribes el archivo desde el secreto original en cada ejecución, descartas los
tokens actualizados que Codex acaba de escribir.
Ejemplo de flujo de trabajo programado:
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/nullQué hace:
- la primera ejecución inicializa
auth.json - las ejecuciones posteriores reutilizan el mismo archivo
- cuando la sesión almacenada en caché alcanza la antigüedad suficiente, Codex la actualiza durante el paso normal
codex exec - el archivo actualizado permanece en el disco para la siguiente ejecución del flujo de trabajo
Una programación semanal suele ser suficiente porque Codex considera que la sesión está obsoleta después de aproximadamente 8 días en el cliente de código abierto actual.
Ejecutores efímeros: restaurar, ejecutar Codex y conservar el archivo actualizado
Si utilizas ejecutores alojados en GitHub, ejecutores compartidos de GitLab o cualquier otro entorno efímero, el sistema de archivos del ejecutor desaparece después de cada trabajo. En esa configuración, necesitas un proceso de ida y vuelta:
- restaura el archivo
auth.jsonactual desde un almacenamiento seguro - ejecuta Codex
- vuelve a guardar el archivo
auth.jsonactualizado en el almacenamiento seguro
Estructura genérica de 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"El requisito clave es que el paso de escritura posterior almacene el archivo actualizado que Codex generó durante la ejecución, no la inicialización original.
No necesitas un comando de actualización independiente
Cualquier ejecución normal de Codex puede actualizar la sesión.
Esto significa que tienes dos buenas opciones:
- dejar que tu trabajo existente de Codex en CI/CD actualice el archivo de forma natural
- añadir un trabajo ligero de mantenimiento programado, como el ejemplo de GitHub Actions anterior, si tus trabajos reales no se ejecutan con suficiente frecuencia
La primera ejecución de Codex después de que la sesión quede obsoleta es la que actualiza
auth.json.
Reglas operativas importantes
- Usa un
auth.jsonpor ejecutor o por flujo de trabajo serializado. - No compartas el mismo archivo entre trabajos simultáneos o varias máquinas.
- No sobrescribas en cada ejecución el archivo actualizado de un ejecutor persistente con la inicialización original.
- No almacenes
auth.jsonen el repositorio, los registros ni el almacenamiento público de artefactos. - Vuelve a inicializar desde una máquina de confianza si la actualización integrada deja de funcionar.
Qué hacer cuando la actualización deja de funcionar
Este flujo reduce el trabajo manual, pero no garantiza que la misma sesión dure para siempre.
Vuelve a inicializar el ejecutor con un auth.json nuevo si:
- Codex empieza a devolver
401y el ejecutor ya no puede realizar la actualización - el token de actualización se revocó o caducó
- otra máquina o un trabajo simultáneo rotó primero el token
- el proceso de ida y vuelta al almacenamiento seguro falló y se restauró un archivo antiguo
Para volver a inicializar:
- Ejecuta
codex loginen una máquina de confianza. - Sustituye la copia de CI/CD almacenada de
auth.json. - Deja que el siguiente trabajo del ejecutor continúe usando el flujo de actualización integrado de Codex.
Comprobar que el ejecutor mantiene la sesión
Comprueba que el ejecutor aún tenga tokens de autenticación administrados y que exista last_refresh:
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 tu ejecutor es persistente, deberías ver que el mismo archivo sigue existiendo entre ejecuciones. Si tu ejecutor es efímero, confirma que el paso de escritura posterior almacena el archivo actualizado del último trabajo.
Referencias de origen
Si quieres verificar este comportamiento en el cliente de código abierto:
codex-rs/core/src/auth.rsabarca la detección de tokens obsoletos, la actualización automática, la recuperación mediante actualización tras un error 401 y la conservación de los tokens actualizadoscodex-rs/core/src/auth/storage.rsabarca el almacenamiento deauth.jsonbasado en archivos