EP08. “开发者工具与 CI/CD 整合”
🔒 登录后可标记已读- 前面几篇讲的都是「人在旁边跟 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 / JavaScript | npm install @openai/codex-sdk | Node.js ≥ 18 |
| Python | pip install openai-codex | Python ≥ 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 | 不把这次会话记录写进磁盘 |
--json | stdout 变成 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 | 模型和推理强度 |
sandbox | workspace-write / read-only / danger-full-access |
safety-strategy | drop-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
官方文档:
- Codex SDK — https://learn.chatgpt.com/codex/codex-sdk
- Non-interactive mode — https://learn.chatgpt.com/codex/non-interactive-mode
- GitHub Action — https://learn.chatgpt.com/codex/github-action