Manter a autenticação da conta Codex em CI/CD (avançado)
Utilize o fluxo de atualização integrado do Codex para manter o auth.json funcional em executores de CI/CD fidedignos
Este guia mostra como manter a autenticação do Codex gerida pelo ChatGPT funcional num executor de CI/CD fidedigno, sem invocar diretamente o ponto final de tokens OAuth.
A forma correta de autenticar a automatização é através de uma API key. Utilize este guia apenas se precisar especificamente de executar o fluxo de trabalho como a sua conta Codex.
O padrão é o seguinte:
- Crie
auth.jsonuma vez numa máquina fidedigna comcodex login. - Coloque esse ficheiro no executor.
- Execute o Codex normalmente.
- Permita que o Codex atualize a sessão quando esta ficar obsoleta.
- Guarde o
auth.jsonatualizado para a execução seguinte.
Este é um fluxo de trabalho avançado para empresas e outras automatizações privadas fidedignas. As API keys continuam a ser a opção recomendada para a maioria das tarefas de CI/CD.
Por que motivo isto funciona
O Codex já sabe como atualizar uma sessão gerida pelo ChatGPT.
Na versão atual do cliente de código aberto:
- o Codex carrega a cache de autenticação local a partir de
auth.json - se
last_refreshtiver mais de cerca de 8 dias, o Codex atualiza o conjunto de tokens antes de a execução continuar - após uma atualização bem-sucedida, o Codex escreve os novos tokens e um novo
last_refreshnovamente emauth.json - se um pedido receber um
401, o Codex também dispõe de um fluxo integrado de atualização e nova tentativa
Isto significa que a estratégia de CI/CD suportada não consiste em «invocar diretamente a API de atualização».
Consiste em «executar o Codex e conservar o auth.json atualizado».
Quando utilizar este método
Utilize este guia apenas quando todas as condições seguintes forem verdadeiras:
- precisa da autenticação do Codex gerida pelo ChatGPT em vez de uma API key
codex loginnão pode ser executado no executor remoto- o executor é uma infraestrutura privada fidedigna
- consegue conservar o
auth.jsonatualizado entre execuções - apenas uma máquina ou um fluxo de tarefas serializado utilizará uma determinada cópia de
auth.json
Este guia aplica-se à autenticação do ChatGPT gerida pelo Codex (auth_mode: "chatgpt").
Não se aplica a:
- autenticação por API key
- integrações de anfitrião com tokens externos (
auth_mode: "chatgptAuthTokens") - clientes OAuth genéricos externos ao Codex
Se as suas credenciais estiverem armazenadas no porta-chaves do sistema operativo, mude primeiro para o armazenamento baseado em ficheiros. Consulte Armazenamento de credenciais.
Criar uma vez o auth.json inicial
Numa máquina fidedigna onde seja possível iniciar sessão através do navegador:
- Configure o Codex para armazenar as credenciais num ficheiro:
cli_auth_credentials_store = "file"- Execute:
codex login- Verifique se o ficheiro se assemelha a uma autenticação do ChatGPT gerida:
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"Continue apenas se:
auth_modefor"chatgpt"has_refresh_tokenfortrue
Em seguida, coloque o conteúdo de auth.json no gestor de segredos de CI/CD ou copie-o
para um executor persistente fidedigno.
Padrão recomendado: GitHub Actions num executor autoalojado
A configuração totalmente automatizada mais simples consiste num executor autoalojado do GitHub Actions com um
CODEX_HOME persistente.
Por que motivo este padrão funciona bem:
- o executor pode manter
auth.jsonno disco entre tarefas - o Codex pode atualizar o ficheiro no próprio local
- as tarefas posteriores utilizam automaticamente os tokens atualizados
- só precisa do segredo original para a inicialização ou uma nova criação dos dados iniciais
O aspeto fundamental é criar o auth.json inicial apenas se estiver em falta. Se
reescrever o ficheiro a partir do segredo original em cada execução, perde os
tokens atualizados que o Codex acabou de escrever.
Exemplo de fluxo de trabalho agendado:
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/nullO que isto faz:
- a primeira execução cria o
auth.jsoninicial - as execuções posteriores reutilizam o mesmo ficheiro
- assim que a sessão em cache for suficientemente antiga, o Codex atualiza-a durante o passo
codex execnormal - o ficheiro atualizado permanece no disco para a execução seguinte do fluxo de trabalho
Normalmente, um agendamento semanal é suficiente, porque o Codex considera a sessão obsoleta após cerca de 8 dias na versão atual do cliente de código aberto.
Executores efémeros: restaurar, executar o Codex e conservar o ficheiro atualizado
Se utilizar executores alojados no GitHub, executores partilhados do GitLab ou qualquer outro ambiente efémero, o sistema de ficheiros do executor desaparece após cada tarefa. Nessa configuração, é necessário um processo de ida e volta:
- restaure o
auth.jsonatual a partir do armazenamento seguro - execute o Codex
- escreva o
auth.jsonatualizado novamente no armazenamento seguro
Estrutura genérica do 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"O requisito fundamental é que o passo de escrita guarde o ficheiro atualizado que o Codex produziu durante a execução, e não os dados iniciais originais.
Não precisa de um comando de atualização separado
Qualquer execução normal do Codex pode atualizar a sessão.
Isto significa que tem duas boas opções:
- permitir que a sua tarefa existente do Codex em CI/CD atualize o ficheiro naturalmente
- adicionar uma tarefa de manutenção agendada e simples, como no exemplo do GitHub Actions acima, se as tarefas reais não forem executadas com frequência suficiente
A primeira execução do Codex após a sessão ficar obsoleta é aquela que atualiza
auth.json.
Regras operacionais importantes
- Utilize um
auth.jsonpor executor ou por fluxo de trabalho serializado. - Não partilhe o mesmo ficheiro entre tarefas simultâneas ou várias máquinas.
- Não substitua o ficheiro atualizado de um executor persistente pelos dados iniciais originais em cada execução.
- Não armazene
auth.jsonno repositório, nos registos ou no armazenamento público de artefactos. - Volte a criar os dados iniciais a partir de uma máquina fidedigna se a atualização integrada deixar de funcionar.
O que fazer quando a atualização deixar de funcionar
Este fluxo reduz o trabalho manual, mas não garante que a mesma sessão dure para sempre.
Volte a criar o auth.json inicial no executor se:
- o Codex começar a devolver
401e o executor já não conseguir efetuar a atualização - o token de atualização tiver sido revogado ou expirado
- outra máquina ou tarefa simultânea tiver rodado o token primeiro
- o processo de ida e volta ao armazenamento seguro tiver falhado e tiver sido restaurado um ficheiro antigo
Para voltar a criar os dados iniciais:
- Execute
codex loginnuma máquina fidedigna. - Substitua a cópia de CI/CD armazenada de
auth.json. - Permita que a tarefa seguinte do executor continue a utilizar o fluxo de atualização integrado do Codex.
Verificar se o executor está a manter a sessão
Verifique se o executor ainda tem tokens de autenticação gerida e se 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"Se o executor for persistente, deverá observar que o mesmo ficheiro continua a existir entre execuções. Se o executor for efémero, confirme que o passo de escrita está a armazenar o ficheiro atualizado da última tarefa.
Referências do código-fonte
Se quiser verificar este comportamento no cliente de código aberto:
codex-rs/core/src/auth.rsabrange a deteção de tokens obsoletos, a atualização automática, a recuperação através de atualização após um erro 401 e a persistência dos tokens atualizadoscodex-rs/core/src/auth/storage.rsabrange o armazenamento deauth.jsonbaseado em ficheiros