Bahasa Indonesia

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:

  1. Buat auth.json satu kali pada mesin tepercaya dengan codex login.
  2. Tempatkan file tersebut pada runner.
  3. Jalankan Codex seperti biasa.
  4. Biarkan Codex menyegarkan sesi saat sesi menjadi usang.
  5. Simpan auth.json yang 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_refresh lebih lama dari sekitar 8 hari, Codex menyegarkan bundel token sebelum proses dilanjutkan
  • setelah penyegaran berhasil, Codex menulis token baru dan last_refresh baru kembali ke auth.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 login tidak dapat berjalan pada runner jarak jauh
  • runner merupakan infrastruktur privat tepercaya
  • Anda dapat mempertahankan auth.json yang 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:

  1. Konfigurasikan Codex agar menyimpan kredensial dalam file:
cli_auth_credentials_store = "file"
  1. Jalankan:
codex login
  1. 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_mode adalah "chatgpt"
  • has_refresh_token adalah true

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.json di 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/null

Yang 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 exec normal
  • 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:

  1. pulihkan auth.json saat ini dari penyimpanan aman
  2. jalankan Codex
  3. tulis kembali auth.json yang 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.json per 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.json di 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 401 dan 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:

  1. Jalankan codex login pada mesin tepercaya.
  2. Ganti salinan CI/CD auth.json yang tersimpan.
  3. 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: