Codex CI 集成实战:把 Codex CLI 跑进 GitHub Actions
把 Codex CLI 接入 GitHub Actions 做自动 PR review / 自动补测试 / 自动文档。覆盖认证方式(API key vs OAuth)、缓存(npm store)、并发安全(每个 job 独立 worktree)、审计合规(log 留痕 + 人工 gate)。
操作步骤
准备 OpenAI 认证
在 OpenAI 控制台创建 OAuth credential(org-scoped),下 device flow client id + secret。把 client secret 存进 GitHub repo 的 secret `OPENAI_OAUTH_CLIENT_SECRET`。
写 workflow 文件
在 `.github/workflows/codex-review.yml` 写 workflow:on pull_request 触发 → checkout 代码 → 装 Codex CLI → 用 device flow 拿 token → 跑 `codex exec --json review diff` → 把结果发 PR 评论。
加缓存与并发隔离
在 workflow 里加 actions/cache(key: codex-npm-${{ hashFiles('package-lock.json') }}),并用 concurrency 字段限同 PR 同时只有一个 review job。
接审计与预算
workflow 里设 `MAX_TOKENS=50000` 环境变量,把 Codex JSON 输出存成 artifact(保留 7 天),并在 OpenAI 控制台设月度 budget。
试跑 + 调 prompt
开一个测试 PR 触发 workflow,看 Codex review 质量。常见的调整:(1) prompt 加 diff 上下文;(2) review scope 限 200 行;(3) 输出格式改 JSON 方便后续自动处理。
Codex CLI 跑在本地是「程序员的好帮手」,但跑在 CI 里才能成为「团队的基础设施」。本文教你把 Codex 接入 GitHub Actions,覆盖四种典型场景、两种认证方式、并发隔离、缓存、审计合规。文末附可复用 workflow。
为什么把 Codex 跑进 CI
本地跑 Codex 是 1 个人用,CI 跑 Codex 是整个团队用。三个关键差异:
- 一致性:所有 PR 都过同一道 AI review,避免「有的 PR 有人看、有的 PR 没人看」。
- 留痕:CI 输出自动存档到 artifact,方便事后审计、合规、复盘。
- 规模化:本地 Codex 受限于单机 CPU/GPU,CI 可以并发几十个 job 同时 review 几十个 PR。
代价是引入 CI 复杂度(认证、缓存、并发安全),下文逐项解决。
场景矩阵:先选你要解决的痛点
| 场景 | 输入 | 输出 | 推荐模型 | 平均 token |
|---|---|---|---|---|
| PR 自动 review | diff + PR description | review 评论(行内 + 总结) | gpt-5.6-terra | 20k-50k |
| 自动补测试 | 源码 + 接口契约 | 新 test 文件 + 单测 | gpt-5.6-sol | 30k-80k |
| 文档同步 | 改动文件 + README | 更新文档(README/API doc) | gpt-5.6-luna | 10k-30k |
| 周报生成 | git log + Slack 消息 | 周报 markdown | gpt-5.6-luna | 5k-15k |
新手建议从「PR 自动 review」入手——单文件、输入明确、效果好;周报生成最简单,但容易被忽略。
认证:API key vs OAuth
# ❌ 不推荐:API key
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
# ✅ 推荐:OAuth 设备流
env:
OPENAI_OAUTH_CLIENT_ID: ${{ secrets.OAUTH_CLIENT_ID }}
OPENAI_OAUTH_CLIENT_SECRET: ${{ secrets.OAUTH_CLIENT_SECRET }}
API key 的问题:一旦 secret 泄漏,整个 OpenAI 账户都要换 key(key 是全局的)。 OAuth 设备流的优势:refresh token 短期(默认 1 小时),可单 repo 撤销,泄漏只影响一个 repo。
OAuth 首次配置稍复杂:在 OpenAI 控制台 → API Keys → OAuth 创建一个 org-scoped credential,记下 client id + secret。
并发隔离
CI 跑 Codex 最容易翻车的是「并发 job 改同一个 worktree」。三件事解决:
jobs:
codex-review:
runs-on: ubuntu-latest
# 关键 1:同 PR 同时只跑一个 job
concurrency:
group: codex-review-${{ github.event.pull_request.number }}
cancel-in-progress: true
steps:
- uses: actions/checkout@v4
with:
# 关键 2:每个 job 独立 worktree
ref: ${{ github.event.pull_request.head.ref }}
fetch-depth: 0
- name: Install Codex CLI
run: npm install -g @openai/codex
env:
# 关键 3:每个 job 独立 config 目录
CODEX_HOME: /tmp/codex-${{ github.run_id }}
并发隔离的三道防线:concurrency 限同 PR 单 job + checkout 到独立 worktree + Codex config 走临时目录。
缓存:把 90s 降到 20s
- name: Cache Codex + npm
uses: actions/cache@v4
with:
path: |
~/.npm
~/.codex
key: codex-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
restore-keys: |
codex-${{ runner.os }}-
~/.npm:npm 全局包缓存(Codex CLI 装在全局)~/.codex:Codex 配置缓存(OAuth token、缓存的 prompt)
效果:第二次跑 workflow 平均从 90s → 20s。
审计合规
Codex 在 CI 跑会有「AI 改坏代码」的合规风险。三道闸:
- Log 留痕:所有 Codex
--json输出存成 artifact(保留 7 天),出问题时回溯。 - 人工 gate:自动 PR 必须有人 approve(branch protection 设
required_approving_review_count: 1)。 - Token 预算:workflow 里设
MAX_TOKENS上限,避免 prompt 异常导致烧 token。
- name: Run Codex review
run: codex exec --json "review diff" > codex-output.json
env:
MAX_TOKENS: 50000
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: codex-review-${{ github.event.pull_request.number }}
path: codex-output.json
retention-days: 7
实战:PR review workflow 模板
name: Codex PR Review
on:
pull_request:
types: [opened, synchronize, reopened]
permissions:
contents: read
pull-requests: write
jobs:
codex-review:
runs-on: ubuntu-latest
concurrency:
group: codex-review-${{ github.event.pull_request.number }}
cancel-in-progress: true
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.ref }}
fetch-depth: 0
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Codex CLI
run: npm install -g @openai/codex
- name: Cache
uses: actions/cache@v4
with:
path: |
~/.npm
~/.codex
key: codex-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
- name: Run Codex review
id: review
run: |
codex exec --json \
"Review the following PR diff. Focus on: bugs, edge cases, test coverage. Output as JSON with keys: summary, issues[]. Provide line-level comments." \
< <(git diff origin/${{ github.base_ref }}...HEAD) \
> codex-review.json
env:
MAX_TOKENS: 50000
OPENAI_OAUTH_CLIENT_ID: ${{ secrets.OAUTH_CLIENT_ID }}
OPENAI_OAUTH_CLIENT_SECRET: ${{ secrets.OAUTH_CLIENT_SECRET }}
- name: Post review comment
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const review = JSON.parse(fs.readFileSync('codex-review.json', 'utf8'));
const body = [
'## Codex Review',
'**Summary**: ' + review.summary,
'',
'**Issues**:',
...review.issues.map(i => `- ${i.file}:${i.line} - ${i.message}`)
].join('\n');
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body
});
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: codex-review-${{ github.event.pull_request.number }}
path: codex-review.json
retention-days: 7
把 OAUTH_CLIENT_ID / OAUTH_CLIENT_SECRET 换成你自己的就能直接用。
常见坑
- OAuth token 在 job 之间复用:每个 job 重新走 device flow,不要用
actions/cache缓存 refresh token。 - diff 太大撑爆 context:超过 500 行就拆成多轮 review,或用
git diff --unified=0砍上下文。 - Codex 改动了非 review 文件:强制 Codex 只读不改(
codex exec --readonly),避免 AI 越权。 - artifact 太大撑爆 storage:JSON 输出 gzip 压缩(
codex-review.json.gz)。 - prompt 没指定输出格式:Codex 输出飘忽不定,prompt 必须要求 JSON / 表格 / 行内评论之一。
下一步
- 想搞 Codex 本地入门?读 《OpenAI Codex CLI 入门:从零配置到日常编码流》。
- 团队多分支协作 + worktree 怎么用?读 《Codex 团队协作最佳实践:worktree、审查与 CI 集成》。
- 想了解 Codex 背后的模型家族?读 《GPT 模型完全指南(2026-07):GPT-5.6 Sol / Terra / Luna 选型》。
关键要点
- 认证优先选 OAuth(设备流 + 短期 refresh token),而不是把 API key 写进 secret——前者每次 job 自动续期、可单 repo 撤销,泄露面小一个数量级
- 并发安全靠 worktree:每个 job 用 `actions/checkout` 拉到独立 worktree(`ref: ${{ github.event.pull_request.head.ref }}`),Codex 改文件不会污染主分支
- 缓存两层:actions/cache 缓存 npm store + Codex config,让 workflow 第二次起跑从 90s 降到 20s
- 审计合规三件套:log 留痕(--verbose 输出到 artifact)+ 人工 gate(自动 PR 必须有人 approve)+ token 预算(设 MAX_TOKENS 防爆刷)
- 四种典型场景的 prompt 模板:PR review 要带 diff、tests 要带源码 + 接口契约、docs 要带 README、weekly digest 要带 git log
常见问题
官方参考
相关文章
Codex Cloud 设置指南:环境配置、云端任务与 codex cloud 命令
Codex Cloud(官方称 Codex Web)是跑在云端的 Codex 形态:任务在按 GitHub 仓库组织的云端环境里执行,本地 CLI 可以用 codex cloud 子命令提交、查看并把 diff 拉回本地。本文按 openai/codex 仓库 rust-v0.156.1 源码把设置路径与命令面讲清。
阅读全文Codex CLI config.toml 完全指南:模型、审批、MCP 与分层配置
Codex CLI 的行为中心是 ~/.codex/config.toml:model 选模型、approval_policy 管审批、sandbox_mode 管边界、mcp_servers 接工具、profiles 做场景切换。本文按 codex 源码的 ConfigToml 结构把核心键位与分层机制讲清楚。
阅读全文Codex CLI 沙箱模式详解:sandbox_mode 与 approval_policy 怎么配
Codex CLI 的沙箱不是开关而是四个档位:read-only、workspace-write、danger-full-access、external-sandbox,配上独立的 approval_policy 轴。本文按 Codex 源码里的枚举定义逐项讲清每个取值、子选项和组合建议。
阅读全文订阅 GPTMap Weekly
每周一封邮件,精选 OpenAI 重要更新、深度解读与最佳实践。无广告,可随时退订。
提交后将在新标签页打开 Buttondown 完成订阅确认。