OpenAI Codex 代码审查技能
使用:base.md + code-review.md
使用 OpenAI 的 Codex CLI 进行专业的代码审查,使用 GPT-5.2-Codex - 专门针对检测错误、安全漏洞和代码质量问题进行训练。
来源: Codex CLI | GitHub | 代码审查 Cookbook
为什么使用 Codex 进行代码审查?
| 特性 | 好处 |
|---|---|
| GPT-5.2-Codex | 专门针对代码审查的训练 |
| 88% 检测率 | 错误、安全漏洞、风格问题(LiveCodeBench) |
| 结构化输出 | JSON 模式,用于一致的发现 |
| GitHub 原生 | PR评论中的 @codex review |
| 无头模式 | CI/CD自动化,无需TUI |
安装
先决条件
# 检查 Node.js 版本(需要22+)
node --version
# 如果需要,安装 Node.js 22
# macOS
brew install node@22
# 或者通过 nvm
nvm install 22
nvm use 22
安装 Codex CLI
# 通过 npm(推荐)
npm install -g @openai/codex
# 通过 Homebrew(macOS)
brew install --cask codex
# 验证安装
codex --version
认证
选项 1:ChatGPT 订阅(Plus, Pro, Team, Edu, Enterprise)
codex
# 按照提示使用 ChatGPT 账户登录
选项 2:OpenAI API 密钥
# 设置环境变量
export OPENAI_API_KEY=sk-proj-...
# 或者添加到 shell 配置文件
echo 'export OPENAI_API_KEY=sk-proj-...' >> ~/.zshrc
# 运行 Codex
codex
Shell 补全(可选)
# Bash
codex completion bash >> ~/.bashrc
# Zsh
codex completion zsh >> ~/.zshrc
# Fish
codex completion fish > ~/.config/fish/completions/codex.fish
交互式代码审查
启动审查模式
# 启动 Codex
codex
# 在 TUI 中输入:
/review
审查预设
| 预设 | 使用场景 |
|---|---|
| 与基础分支对比审查 | 在打开 PR 前 - 与上游的差异 |
| 审查未提交的更改 | 在提交前 - 已暂存 + 未暂存 + 未跟踪 |
| 审查一次提交 | 分析历史中特定的 SHA |
| 自定义指令 | 例如,“关注安全漏洞” |
示例会话
$ codex
> /review
选择审查类型:
❯ 与基础分支对比审查
审查未提交的更改
审查一次提交
自定义审查指令
选择基础分支:main
审查更改中...
┌─────────────────────────────────────────────────────────────┐
│ 代码审查发现 │
├─────────────────────────────────────────────────────────────┤
│ 🔴 严重:SQL 注入漏洞 │
│ 文件:src/api/users.ts:45 │
│ 问题:用户输入直接插值在查询中 │
│ 修复:使用参数化查询 │
├─────────────────────────────────────────────────────────────┤
│ 🟠 高:缺少认证检查 │
│ 文件:src/api/admin.ts:23 │
│ 问题:无需认证即可访问管理端点 │
│ 修复:添加 requireAuth 中间件 │
├─────────────────────────────────────────────────────────────┤
│ 🟡 中:低效的数据库查询 │
│ 文件:src/services/orders.ts:89 │
│ 问题:循环中的 N+1 查询模式 │
│ 修复:使用批量查询或 JOIN │
└─────────────────────────────────────────────────────────────┘
无头模式(自动化)
基本用法
# 简单审查
codex exec "审查代码中的错误和安全问题"
# 带 JSON 输出的审查
codex exec --json "审查未提交的更改" > review.json
# 将最终消息保存到文件
codex exec --output-last-message review.txt "审查与 main 的差异"
完整自动化(CI/CD)
# 完整自动模式(仅在隔离的运行器中使用!)
codex exec \
--full-auto \
--json \
--output-last-message findings.txt \
--sandbox read-only \
-m gpt-5.2-codex \
"审查此代码中的错误、安全问题和性能问题"
结构化输出与模式
# 定义输出模式
cat > review-schema.json << 'EOF'
{
"type": "object",
"properties": {
"findings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"severity": { "enum": ["critical", "high", "medium", "low"] },
"title": { "type": "string" },
"file": { "type": "string" },
"line": { "type": "integer" },
"description": { "type": "string" },
"suggestion": { "type": "string" }
},
"required": ["severity", "title", "file", "description"]
}
},
"summary": { "type": "string" },
"approved": { "type": "boolean" }
},
"required": ["findings", "summary", "approved"]
}
EOF
# 使用模式验证运行
codex exec \
--output-schema review-schema.json \
--output-last-message review.json \
"审查已暂存的更改并输出发现"
GitHub 集成
选项 1:PR评论触发
在任何拉取请求中,添加评论:
@codex review
Codex 将以标准的 GitHub 代码审查回应。
选项 2:GitHub Action
# .github/workflows/codex-review.yml
name: Codex 代码审查
on:
pull_request:
types: [opened, synchronize]
jobs:
review:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Codex 审查
uses: openai/codex-action@main
with:
openai_api_key: ${{ secrets.OPENAI_API_KEY }}
model: gpt-5.2-codex
safety_strategy: drop-sudo
选项 3:CI中手动无头
# .github/workflows/codex-review.yml
name: Codex 代码审查
on:
pull_request:
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: '22'
- name: 安装 Codex CLI
run: npm install -g @openai/codex
- name: 运行审查
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
# 获取差异
git diff origin/${{ github.base_ref }}...HEAD > diff.txt
# 运行 Codex 审查
codex exec \
--full-auto \
--sandbox read-only \
--output-last-message review.md \
"审查这个 git diff 中的错误、安全问题和代码质量:$(cat diff.txt)"
- name: 发布审查评论
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const review = fs.readFileSync('review.md', 'utf8');
github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: `## 🤖 Codex 代码审查
${review}`
});
GitLab CI/CD
# .gitlab-ci.yml
codex-review:
image: node:22
stage: review
script:
- npm install -g @openai/codex
- |
codex exec \
--full-auto \
--sandbox read-only \
--output-last-message review.md \
"审查这个合并请求的更改,寻找错误和安全问题"
- cat review.md
artifacts:
paths:
- review.md
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
Jenkins Pipeline
pipeline {
agent any
environment {
OPENAI_API_KEY = credentials('openai-api-key')
}
stages {
stage('Install Codex') {
steps {
sh 'npm install -g @openai/codex'
}
}
stage('Code Review') {
steps {
sh '''
codex exec \
--full-auto \
--sandbox read-only \
--output-last-message review.md \
"审查代码更改中的错误和安全问题"
'''
}
}
stage('Publish Results') {
steps {
archiveArtifacts artifacts: 'review.md'
script {
def review = readFile('review.md')
echo "代码审查结果:
${review}"
}
}
}
}
}
配置
配置文件
# ~/.codex/config.toml
[model]
default = "gpt-5.2-codex" # 最适合代码审查
[sandbox]
default = "read-only" # 安全审查
[review]
# 应用于所有审查的自定义审查指令
instructions = """
关注:
1. 安全漏洞(OWASP Top 10)
2. 性能问题(N+1 查询,内存泄漏)
3. 错误处理漏洞
4. 类型安全问题
"""
每个项目的配置
# .codex/config.toml (在项目根目录)
[review]
instructions = """
这是一个 Python FastAPI 项目。关注:
- 异步/等待正确性
- Pydantic 模型验证
- 通过 SQLAlchemy 的 SQL 注入
- 认证/授权漏洞
"""
CLI 快速参考
# 交互式
codex # 启动 TUI
/review # 打开审查预设
# 无头
codex exec "prompt" # 非交互式执行
codex exec --json "prompt" # JSON 输出
codex exec --full-auto "prompt" # 无需批准提示
# 关键标志
--output-last-message FILE # 将响应保存到文件
--output-schema FILE # 根据 JSON 模式验证
--sandbox read-only # 限制文件访问
-m gpt-5.2-codex # 使用最佳审查模型
--json # 机器可读输出
# 恢复
codex exec resume SESSION_ID # 继续之前的会话
Claude 与 Codex 审查比较
| 方面 | Claude(内置) | Codex CLI |
|---|---|---|
| 设置 | 无(已经在 Claude Code 中) | 安装 CLI + 认证 |
| 模型 | Claude | GPT-5.2-Codex(专门) |
| 上下文 | 完整的对话上下文 | 每次审查新上下文 |
| 集成 | 原生 | GitHub, GitLab, Jenkins |
| 输出 | Markdown | JSON 模式支持 |
| 最适合 | 快速审查,流程中 | CI/CD, 关键 PRs |
安全考虑
CI/CD 安全
# 总是在 CI/CD 中使用这些标志:
--sandbox read-only # 防止文件修改
--safety-strategy drop-sudo # 撤销提升的权限
API 密钥保护
# GitHub Actions - 使用 secrets
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
# 永远不要硬编码密钥
# 永远不要在日志中显示密钥
公共仓库
对于公共仓库,使用 drop-sudo 安全策略,以防止 Codex 在执行期间读取自己的 API 密钥。
故障排除
| 问题 | 解决方案 |
|---|---|
codex: command not found |
运行 npm install -g @openai/codex |
Node.js 版本错误 |
升级到 Node.js 22+ |
认证失败 |
重新运行 codex 并再次登录 |
API 密钥无效 |
检查 OPENAI_API_KEY 环境变量 |
CI 中的 超时 |
添加 --timeout 300 标志 |
频率限制 |
减少频率或升级计划 |
反模式
- 随意使用
--dangerously-bypass-approvals-and-sandbox- 仅在隔离的 CI 运行器中 - 在日志中暴露 API 密钥 - 使用秘密管理
- 在 CI 中跳过沙箱 - 总是使用
--sandbox read-only - 忽略发现 - 审查并解决或记录例外
- 每次提交都运行 - 仅在 PR 上使用以节省成本