Memelihara autentikasi akun Codex di CI/CD (lanjutan)
Gunakan alur penyegaran bawaan Codex agar auth.json tetap berfungsi pada runner CI/CD tepercaya
Panduan ini menunjukkan cara mempertahankan autentikasi Codex yang dikelola ChatGPT agar tetap berfungsi pada runner CI/CD tepercaya tanpa memanggil sendiri endpoint token OAuth.
Cara yang tepat untuk mengautentikasi otomatisasi adalah dengan API key. Gunakan panduan ini hanya jika Anda secara khusus perlu menjalankan alur kerja sebagai akun Codex Anda.
Polanya adalah:
- Buat
auth.jsonsatu kali pada mesin tepercaya dengancodex login. - Tempatkan file tersebut pada runner.
- Jalankan Codex seperti biasa.
- Biarkan Codex menyegarkan sesi saat sesi menjadi usang.
- Simpan
auth.jsonyang telah disegarkan untuk proses berikutnya.
Ini adalah alur kerja lanjutan untuk perusahaan dan otomatisasi privat tepercaya lainnya. API key tetap menjadi opsi yang direkomendasikan untuk sebagian besar tugas CI/CD.
Mengapa cara ini berfungsi
Codex sudah mengetahui cara menyegarkan sesi yang dikelola ChatGPT.
Pada versi klien sumber terbuka saat ini:
- Codex memuat cache autentikasi lokal dari
auth.json - jika
last_refreshlebih lama dari sekitar 8 hari, Codex menyegarkan bundel token sebelum proses dilanjutkan - setelah penyegaran berhasil, Codex menulis token baru dan
last_refreshbaru kembali keauth.json - jika suatu permintaan menerima
401, Codex juga memiliki jalur penyegaran dan percobaan ulang bawaan
Artinya, strategi CI/CD yang didukung bukanlah "panggil sendiri API penyegaran."
Strateginya adalah "jalankan Codex dan pertahankan auth.json yang telah diperbarui."
Kapan panduan ini digunakan
Gunakan panduan ini hanya jika semua kondisi berikut terpenuhi:
- Anda memerlukan autentikasi Codex yang dikelola ChatGPT, bukan API key
codex logintidak dapat berjalan pada runner jarak jauh- runner merupakan infrastruktur privat tepercaya
- Anda dapat mempertahankan
auth.jsonyang telah disegarkan di antara proses - hanya satu mesin atau aliran tugas berurutan yang akan menggunakan satu salinan
auth.json
Panduan ini berlaku untuk autentikasi ChatGPT yang dikelola Codex (auth_mode: "chatgpt").
Panduan ini tidak berlaku untuk:
- autentikasi API key
- integrasi host token eksternal (
auth_mode: "chatgptAuthTokens") - klien OAuth umum di luar Codex
Jika kredensial Anda disimpan dalam keyring OS, beralihlah terlebih dahulu ke penyimpanan berbasis file. Lihat Penyimpanan kredensial.
Menyiapkan auth.json satu kali
Pada mesin tepercaya yang memungkinkan proses masuk melalui browser:
- Konfigurasikan Codex agar menyimpan kredensial dalam file:
cli_auth_credentials_store = "file"- Jalankan:
codex login- Pastikan tampilan file sesuai dengan autentikasi ChatGPT terkelola:
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"Lanjutkan hanya jika:
auth_modeadalah"chatgpt"has_refresh_tokenadalahtrue
Kemudian tempatkan isi auth.json ke pengelola rahasia CI/CD Anda atau salin
ke runner persisten tepercaya.
Pola yang direkomendasikan: GitHub Actions pada runner yang dihosting sendiri
Penyiapan terotomatisasi sepenuhnya yang paling sederhana adalah runner GitHub Actions yang
dihosting sendiri dengan CODEX_HOME persisten.
Alasan pola ini berfungsi dengan baik:
- runner dapat menyimpan
auth.jsondi disk di antara tugas - Codex dapat menyegarkan file secara langsung
- tugas berikutnya secara otomatis menggunakan token yang telah disegarkan
- Anda hanya memerlukan rahasia awal untuk bootstrap atau penyiapan ulang
Hal pentingnya adalah hanya menyiapkan auth.json jika file tersebut belum ada. Jika Anda
menulis ulang file dari rahasia awal pada setiap proses, Anda akan membuang
token yang baru saja disegarkan dan ditulis oleh Codex.
Contoh alur kerja terjadwal:
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/nullYang dilakukan alur ini:
- proses pertama menyiapkan
auth.json - proses berikutnya menggunakan kembali file yang sama
- setelah sesi yang tersimpan dalam cache cukup lama, Codex menyegarkannya selama langkah
codex execnormal - file yang telah disegarkan tetap berada di disk untuk proses alur kerja berikutnya
Jadwal mingguan biasanya cukup karena Codex menganggap sesi sudah usang setelah sekitar 8 hari pada klien sumber terbuka saat ini.
Runner sementara: pulihkan, jalankan Codex, pertahankan file yang diperbarui
Jika Anda menggunakan runner yang dihosting GitHub, runner bersama GitLab, atau lingkungan sementara lainnya, sistem file runner akan hilang setelah setiap tugas. Dalam penyiapan tersebut, Anda memerlukan proses bolak-balik:
- pulihkan
auth.jsonsaat ini dari penyimpanan aman - jalankan Codex
- tulis kembali
auth.jsonyang telah diperbarui ke penyimpanan aman
Bentuk umum 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"Persyaratan utamanya adalah langkah penulisan kembali menyimpan file yang telah disegarkan dan dihasilkan Codex selama proses, bukan file awal yang asli.
Anda tidak memerlukan perintah penyegaran terpisah
Setiap proses Codex normal dapat menyegarkan sesi.
Artinya, Anda memiliki dua opsi yang baik:
- biarkan tugas Codex CI/CD yang sudah ada menyegarkan file secara alami
- tambahkan tugas pemeliharaan terjadwal yang ringan, seperti contoh GitHub Actions di atas, jika tugas nyata Anda tidak cukup sering berjalan
Proses Codex pertama setelah sesi menjadi usang adalah proses yang menyegarkan
auth.json.
Aturan operasional yang penting
- Gunakan satu
auth.jsonper runner atau per aliran alur kerja berurutan. - Jangan bagikan file yang sama ke tugas bersamaan atau beberapa mesin.
- Jangan timpa file runner persisten yang telah disegarkan dengan file awal asli pada setiap proses.
- Jangan simpan
auth.jsondi repositori, log, atau penyimpanan artefak publik. - Lakukan penyiapan ulang dari mesin tepercaya jika penyegaran bawaan berhenti berfungsi.
Tindakan saat penyegaran berhenti berfungsi
Alur ini mengurangi pekerjaan manual, tetapi tidak menjamin sesi yang sama akan bertahan selamanya.
Siapkan ulang runner dengan auth.json baru jika:
- Codex mulai menampilkan
401dan runner tidak lagi dapat menyegarkan - refresh token telah dicabut atau kedaluwarsa
- mesin lain atau tugas bersamaan lebih dahulu merotasi token
- proses bolak-balik penyimpanan aman gagal dan file lama dipulihkan
Untuk menyiapkan ulang:
- Jalankan
codex loginpada mesin tepercaya. - Ganti salinan CI/CD
auth.jsonyang tersimpan. - Biarkan tugas runner berikutnya tetap menggunakan alur penyegaran bawaan Codex.
Memastikan runner memelihara sesi
Pastikan runner masih memiliki token autentikasi terkelola dan last_refresh
tersedia:
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"Jika runner Anda persisten, file yang sama seharusnya tetap tersedia di antara proses. Jika runner Anda sementara, pastikan langkah penulisan kembali menyimpan file yang diperbarui dari tugas terakhir.
Referensi sumber
Jika Anda ingin memverifikasi perilaku ini dalam klien sumber terbuka:
codex-rs/core/src/auth.rsmencakup deteksi token usang, penyegaran otomatis, pemulihan melalui penyegaran saat menerima 401, dan penyimpanan token yang telah disegarkancodex-rs/core/src/auth/storage.rsmencakup penyimpananauth.jsonberbasis file