AI TOOLS

EP08. “开发者工具与 CI/CD 整合”

首页 › AI 工具 › ChatGPT · Codex · EP08
约 11 分钟· #EP08#ChatGPT#Codex
🔒 登录后可标记已读
  • 前面几篇讲的都是「人在旁边跟 Codex 互动」,这篇讲怎么把 Codex 塞进自动化流程——脚本、CI pipeline、自己写的程序
  • 讲 Codex SDK:想在自己的程序里调用 Codex 要怎么写
  • 讲非交互模式(codex exec):不开互动界面、专门给脚本/CI 用的跑法
  • 讲 GitHub Action:PR 一开就自动叫 Codex 跑一次检查/审查
  • 前置知识:先看过 EP01(基本概念)、EP02(权限/sandbox,这篇会常常用到)

重点内容


Codex SDK:写进自己的程序里

想在 CI/CD pipeline 里控制 Codex、做自订 agent、或者把 Codex 功能嵌进自己的工具/应用,用 SDK:

语言安装需求
TypeScript / JavaScriptnpm install @openai/codex-sdkNode.js ≥ 18
Pythonpip install openai-codexPython ≥ 3.10,支持同步和异步两种写法

TypeScript 范例:

const codex = new Codex();
const thread = codex.startThread();
const result = await thread.run("任务提示词");

Python 范例:

with Codex() as codex:
    thread = codex.thread_start(model="gpt-5.6-terra")
    result = thread.run("任务提示词")
    print(result.final_response)

两种语言都支持指定沙箱预设(只读 / 工作区写入 / 完全访问),概念跟 EP02 讲的权限模式一致,只是改成用程序控制。


非交互模式:codex exec

CLI 平常是互动界面(一来一回对话),但脚本/CI 环境需要「丢一个提示词进去,等结果,拿输出」这种一次性跑法:

codex exec "任务提示词"

行为特点:进度会串流到 stderr,只有最后 Codex 给的完整讯息才印到 stdout——方便管道传输和重定向,不会被进度讯息污染最终结果。

默认以只读沙箱运行,需要改文件才升级权限:

codex exec "任务" --sandbox workspace-write        # 允许改文件
codex exec "任务" --sandbox danger-full-access     # 完全访问(只在隔离环境里用)

常用参数:

参数用途
--ephemeral不把这次会话记录写进磁盘
--jsonstdout 变成 JSON Lines 事件流,方便程序解析
--output-schema ./schema.json -o ./output.json用 JSON Schema 强制最终输出符合指定格式
--ignore-user-config跳过用户的 config.toml
--ignore-rules跳过执行策略规则

接续会话:

codex exec resume --last "后续任务"

实用范例:

# 把 API 抓回来的数据整理成表格
curl -s https://api.example.com/data | codex exec "格式化为 markdown 表格" > table.md

# 从文件读完整提示词
cat prompt.txt | codex exec -

# 用 JSON 输出接 jq 处理
codex exec --json "任务" | jq

认证:默认沿用已经登录过的 CLI 认证;CI 环境改用环境变量:

CODEX_API_KEY=<key> codex exec --json "任务"

📌 官方建议用「工作负载身份联合」(Workload Identity Federation,见 EP07 企业管理那篇)而不是把密钥直接存在 CI 变量里,安全性更好。


GitHub Action:PR 自动跑 Codex

openai/codex-action@v1 让你在 GitHub Actions 里自动跑 Codex,常见用法:PR 一开就自动审查、CI 流程里加一道品质检查、跑重复性任务(代码审查、发布准备、迁移)。

前置条件:

  • OpenAI key 存成 GitHub secret(例如 OPENAI_API_KEY)
  • 跑在 Linux 或 macOS runner(Windows 要另外设 safety-strategy: unsafe)
  • 呼叫 action 前先 checkout 代码
  • 决定给它的提示词(直接写在 yaml 里,或指向一个 Markdown 文件)

范例 workflow(PR 一开自动跑):

name: Codex pull request review
on:
  pull_request:
    types: [opened, synchronize, reopened]

jobs:
  codex:
    runs-on: ubuntu-latest
    permissions:
      contents: read
    outputs:
      final_message: ${{ steps.run_codex.outputs.final-message }}
    steps:
      - uses: actions/checkout@v5
        with:
          ref: refs/pull/${{ github.event.pull_request.number }}/merge
          fetch-depth: 0
      - name: Run Codex
        id: run_codex
        uses: openai/codex-action@v1
        with:
          openai-api-key: ${{ secrets.OPENAI_API_KEY }}
          prompt-file: .github/codex/prompts/review.md
          output-file: codex-output.md

关键参数:

参数说明
prompt / prompt-file二选一:直接写提示词,或指向一份 Markdown 文件
model / effort模型和推理强度
sandboxworkspace-write / read-only / danger-full-access
safety-strategydrop-sudo(默认,跑之前拿掉 sudo 权限防密钥泄漏)或 unprivileged-user
allow-users / allow-bots限制谁能触发这个 workflow

跑完可以从 final-message 这个 output 拿到 Codex 最后给的讯息,接下去用在别的 step(比如发一条 PR 评论)。

常见错误

  • ❌ CI 环境直接把 API key 写死在 workflow 文件里——用 GitHub secret(${{ secrets.OPENAI_API_KEY }}),不要明文写进版本控制
  • ❌ CI/CD 流程用 danger-full-access 图方便——只在真正隔离的环境(一次性容器、跑完就丢的 runner)才考虑用完全访问,一般 CI 用 workspace-write 就够
  • ❌ 忘记 codex exec 默认是只读,改完发现文件没变化就以为出 bug——要改文件记得加 --sandbox workspace-write
  • 💡 想把 Codex 的输出接进下一个程序处理,用 --json 拿结构化事件流,不要去解析给人看的文字输出
  • 💡 Windows runner 跑 GitHub Action 记得设 safety-strategy: unsafe,官方预设是给 Linux/macOS 用的

Sources

官方文档:

  1. Codex SDK — https://learn.chatgpt.com/codex/codex-sdk
  2. Non-interactive mode — https://learn.chatgpt.com/codex/non-interactive-mode
  3. GitHub Action — https://learn.chatgpt.com/codex/github-action