Tiếng Việt

Duy trì xác thực tài khoản Codex trong CI/CD (nâng cao)

Sử dụng quy trình làm mới tích hợp sẵn của Codex để duy trì hoạt động của auth.json trên các trình chạy CI/CD đáng tin cậy

Hướng dẫn này trình bày cách duy trì hoạt động của cơ chế xác thực Codex do ChatGPT quản lý trên một trình chạy CI/CD đáng tin cậy mà không cần tự gọi điểm cuối mã thông báo OAuth.

Cách phù hợp để xác thực hoạt động tự động hóa là sử dụng API key. Chỉ sử dụng hướng dẫn này nếu bạn đặc biệt cần chạy quy trình dưới danh nghĩa tài khoản Codex của mình.

Quy trình như sau:

  1. Tạo auth.json một lần trên máy đáng tin cậy bằng codex login.
  2. Đưa tệp đó lên trình chạy.
  3. Chạy Codex như bình thường.
  4. Để Codex làm mới phiên khi phiên trở nên cũ.
  5. Giữ lại auth.json đã làm mới cho lượt chạy tiếp theo.

Đây là quy trình nâng cao dành cho doanh nghiệp và các môi trường tự động hóa riêng tư đáng tin cậy khác. API key vẫn là lựa chọn được khuyến nghị cho hầu hết tác vụ CI/CD.

Tại sao cách này hoạt động

Codex đã biết cách làm mới phiên do ChatGPT quản lý.

Theo ứng dụng khách mã nguồn mở hiện tại:

  • Codex tải bộ nhớ đệm xác thực cục bộ từ auth.json
  • nếu last_refresh cũ hơn khoảng 8 ngày, Codex sẽ làm mới gói mã thông báo trước khi lượt chạy tiếp tục
  • sau khi làm mới thành công, Codex ghi các mã thông báo mới và một last_refresh mới trở lại auth.json
  • nếu một yêu cầu nhận được 401, Codex cũng có sẵn quy trình làm mới rồi thử lại

Điều đó có nghĩa là chiến lược CI/CD được hỗ trợ không phải là "tự gọi API làm mới". Mà là "chạy Codex và lưu lại auth.json đã cập nhật".

Khi nào nên sử dụng cách này

Chỉ sử dụng hướng dẫn này khi tất cả các điều kiện sau đều đúng:

  • bạn cần cơ chế xác thực Codex do ChatGPT quản lý thay vì API key
  • codex login không thể chạy trên trình chạy từ xa
  • trình chạy là hạ tầng riêng tư đáng tin cậy
  • bạn có thể duy trì auth.json đã làm mới giữa các lượt chạy
  • chỉ một máy hoặc một luồng tác vụ thực thi tuần tự sẽ sử dụng một bản sao auth.json nhất định

Hướng dẫn này áp dụng cho cơ chế xác thực ChatGPT do Codex quản lý (auth_mode: "chatgpt").

Hướng dẫn không áp dụng cho:

  • xác thực bằng API key
  • tích hợp máy chủ dùng mã thông báo bên ngoài (auth_mode: "chatgptAuthTokens")
  • ứng dụng khách OAuth thông thường bên ngoài Codex

Nếu thông tin xác thực của bạn được lưu trong kho khóa của hệ điều hành, trước tiên hãy chuyển sang lưu trữ dựa trên tệp. Xem Lưu trữ thông tin xác thực.

Khởi tạo auth.json một lần

Trên một máy đáng tin cậy có thể đăng nhập qua trình duyệt:

  1. Cấu hình Codex để lưu thông tin xác thực trong tệp:
cli_auth_credentials_store = "file"
  1. Chạy:
codex login
  1. Xác minh tệp có dạng xác thực ChatGPT được quản lý:
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"

Chỉ tiếp tục nếu:

  • auth_mode"chatgpt"
  • has_refresh_tokentrue

Sau đó, đưa nội dung của auth.json vào trình quản lý bí mật CI/CD hoặc sao chép nội dung đó sang một trình chạy lâu dài đáng tin cậy.

Mẫu được khuyến nghị: GitHub Actions trên trình chạy tự lưu trữ

Thiết lập tự động hoàn toàn đơn giản nhất là một trình chạy GitHub Actions tự lưu trữ có CODEX_HOME lâu dài.

Lý do mẫu này hoạt động hiệu quả:

  • trình chạy có thể giữ auth.json trên đĩa giữa các tác vụ
  • Codex có thể làm mới tệp tại chỗ
  • các tác vụ sau đó tự động sử dụng mã thông báo đã làm mới
  • bạn chỉ cần bí mật ban đầu để khởi tạo hoặc khởi tạo lại

Chi tiết quan trọng là chỉ khởi tạo auth.json nếu tệp chưa tồn tại. Nếu bạn ghi lại tệp từ bí mật ban đầu trong mỗi lượt chạy, bạn sẽ loại bỏ các mã thông báo đã làm mới mà Codex vừa ghi.

Ví dụ về quy trình theo lịch:

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

Quy trình này thực hiện những việc sau:

  • lượt chạy đầu tiên khởi tạo auth.json
  • các lượt chạy sau sử dụng lại cùng tệp
  • khi phiên được lưu trong bộ nhớ đệm đủ cũ, Codex sẽ làm mới phiên trong bước codex exec thông thường
  • tệp đã làm mới vẫn còn trên đĩa cho lượt chạy quy trình tiếp theo

Lịch chạy hằng tuần thường là đủ vì Codex coi phiên là cũ sau khoảng 8 ngày trong ứng dụng khách mã nguồn mở hiện tại.

Trình chạy tạm thời: khôi phục, chạy Codex và lưu lại tệp đã cập nhật

Nếu bạn sử dụng trình chạy do GitHub lưu trữ, trình chạy dùng chung của GitLab hoặc bất kỳ môi trường tạm thời nào khác, hệ thống tệp của trình chạy sẽ biến mất sau mỗi tác vụ. Trong thiết lập đó, bạn cần một quy trình khứ hồi:

  1. khôi phục auth.json hiện tại từ kho lưu trữ an toàn
  2. chạy Codex
  3. ghi auth.json đã cập nhật trở lại kho lưu trữ an toàn

Cấu trúc GitHub Actions tổng quát:

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"

Yêu cầu chính là bước ghi trở lại phải lưu tệp đã làm mới mà Codex tạo ra trong lượt chạy, không phải bản khởi tạo ban đầu.

Bạn không cần lệnh làm mới riêng

Bất kỳ lượt chạy Codex thông thường nào cũng có thể làm mới phiên.

Điều đó có nghĩa là bạn có hai lựa chọn phù hợp:

  • để tác vụ Codex CI/CD hiện có làm mới tệp một cách tự nhiên
  • thêm một tác vụ bảo trì nhẹ theo lịch, như ví dụ GitHub Actions ở trên, nếu các tác vụ thực tế của bạn không chạy đủ thường xuyên

Lượt chạy Codex đầu tiên sau khi phiên trở nên cũ sẽ làm mới auth.json.

Các quy tắc vận hành quan trọng

  • Sử dụng một auth.json cho mỗi trình chạy hoặc mỗi luồng quy trình thực thi tuần tự.
  • Không chia sẻ cùng một tệp giữa các tác vụ đồng thời hoặc nhiều máy.
  • Không ghi đè tệp đã làm mới của trình chạy lâu dài bằng bản khởi tạo ban đầu trong mỗi lượt chạy.
  • Không lưu auth.json trong kho lưu trữ, nhật ký hoặc kho hiện vật công khai.
  • Khởi tạo lại từ một máy đáng tin cậy nếu cơ chế làm mới tích hợp sẵn ngừng hoạt động.

Cách xử lý khi cơ chế làm mới ngừng hoạt động

Quy trình này giảm công việc thủ công, nhưng không đảm bảo cùng một phiên sẽ tồn tại mãi mãi.

Hãy khởi tạo lại trình chạy bằng auth.json mới nếu:

  • Codex bắt đầu trả về 401 và trình chạy không thể làm mới nữa
  • mã thông báo làm mới đã bị thu hồi hoặc hết hạn
  • một máy hoặc tác vụ đồng thời khác đã luân chuyển mã thông báo trước
  • quy trình khứ hồi qua kho lưu trữ an toàn không thành công và một tệp cũ đã được khôi phục

Để khởi tạo lại:

  1. Chạy codex login trên một máy đáng tin cậy.
  2. Thay thế bản sao auth.json được lưu trong CI/CD.
  3. Để tác vụ tiếp theo của trình chạy tiếp tục sử dụng quy trình làm mới tích hợp sẵn của Codex.

Xác minh trình chạy đang duy trì phiên

Kiểm tra xem trình chạy vẫn có các mã thông báo xác thực được quản lý và last_refresh có tồn tại hay không:

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"

Nếu trình chạy của bạn hoạt động lâu dài, bạn sẽ thấy cùng một tệp tiếp tục tồn tại giữa các lượt chạy. Nếu trình chạy là tạm thời, hãy xác nhận bước ghi trở lại đang lưu tệp đã cập nhật từ tác vụ gần nhất.

Tham chiếu nguồn

Nếu muốn xác minh hành vi này trong ứng dụng khách mã nguồn mở:

  • codex-rs/core/src/auth.rs trình bày việc phát hiện mã thông báo cũ, tự động làm mới, phục hồi bằng cách làm mới khi gặp lỗi 401 và lưu lâu dài các mã thông báo đã làm mới
  • codex-rs/core/src/auth/storage.rs trình bày cách lưu trữ auth.json dựa trên tệp