目录
- [🚀 Codex CLI GitHub Action:打造 AI 驱动的 CI/CD 流水线](#🚀 Codex CLI GitHub Action:打造 AI 驱动的 CI/CD 流水线)
-
- [1. 什么是 GitHub Action](#1. 什么是 GitHub Action)
-
- [📖 定义](#📖 定义)
- [🔧 核心概念](#🔧 核心概念)
- [💡 工作原理](#💡 工作原理)
- [🎯 使用场景](#🎯 使用场景)
- [2. 为什么使用 GitHub Action](#2. 为什么使用 GitHub Action)
-
- [🎯 核心价值](#🎯 核心价值)
- [📊 效率对比](#📊 效率对比)
- [✅ 什么时候用](#✅ 什么时候用)
- [❌ 什么时候不用](#❌ 什么时候不用)
- [3. Codex GitHub Action](#3. Codex GitHub Action)
-
- [📦 官方 Action](#📦 官方 Action)
- [🔧 自定义 Action](#🔧 自定义 Action)
- [📋 配置选项](#📋 配置选项)
- [4. 基本配置](#4. 基本配置)
-
- [📝 基础 Workflow](#📝 基础 Workflow)
- [🔐 配置 Secrets](#🔐 配置 Secrets)
- [📋 完整示例](#📋 完整示例)
- [5. 实战场景](#5. 实战场景)
-
- [💼 场景1:自动代码审查](#💼 场景1:自动代码审查)
- [💼 场景2:自动测试生成](#💼 场景2:自动测试生成)
- [💼 场景3:自动文档生成](#💼 场景3:自动文档生成)
- [💼 场景4:安全扫描](#💼 场景4:安全扫描)
- [💼 场景5:自动部署](#💼 场景5:自动部署)
- [6. 高级用法](#6. 高级用法)
-
- [🔄 并行执行](#🔄 并行执行)
- [📊 缓存优化](#📊 缓存优化)
- [🎯 条件执行](#🎯 条件执行)
- [📝 复合 Workflow](#📝 复合 Workflow)
- [7. 最佳实践](#7. 最佳实践)
-
- [✅ DO - 推荐做法](#✅ DO - 推荐做法)
- [❌ DON'T - 避免事项](#❌ DON'T - 避免事项)
- [📋 检查清单](#📋 检查清单)
- [8. 常见问题](#8. 常见问题)
-
- [❓ Q1:如何调试 Workflow?](#❓ Q1:如何调试 Workflow?)
- [❓ Q2:如何降低费用?](#❓ Q2:如何降低费用?)
- [❓ Q3:如何处理超时?](#❓ Q3:如何处理超时?)
- [❓ Q4:如何并行运行?](#❓ Q4:如何并行运行?)
- [❓ Q5:如何访问仓库内容?](#❓ Q5:如何访问仓库内容?)
- [❓ Q6:如何评论 PR?](#❓ Q6:如何评论 PR?)
- [9. 总结](#9. 总结)
-
- [🎯 核心要点](#🎯 核心要点)
- [📋 快速开始](#📋 快速开始)
- [📚 下一步](#📚 下一步)
- [📝 系列文章导航](#📝 系列文章导航)
🚀 Codex CLI GitHub Action:打造 AI 驱动的 CI/CD 流水线
📅 更新于 2026年6月 | ✍️ 原创文章,转载请注明出处
本系列共12篇,本文是第10篇
1. 什么是 GitHub Action
📖 定义
GitHub Actions 是 GitHub 提供的 CI/CD 平台,让你可以自动化构建、测试和部署流程。
🔧 核心概念
| 概念 | 说明 | 示例 |
|---|---|---|
| Workflow | 自动化流程定义 | .github/workflows/ci.yml |
| Job | 一组步骤的集合 | build, test, deploy |
| Step | 单个操作步骤 | run: npm test |
| Action | 可复用的操作 | actions/checkout@v4 |
| Trigger | 触发条件 | push, pull_request |
💡 工作原理
代码推送/PR
↓
触发 Workflow
↓
运行 Jobs
↓
执行 Steps
↓
完成构建/测试/部署
🎯 使用场景
- 代码审查
- 自动测试
- 文档生成
- 代码质量检查
- 自动部署
- 安全扫描
2. 为什么使用 GitHub Action
🎯 核心价值
| 手动操作 | GitHub Actions |
|---|---|
| 每次手动运行 | 自动触发 |
| 容易忘记 | 稳定执行 |
| 无法并行 | 并行执行 |
| 无法复用 | 可复用 Action |
| 无法追踪 | 完整日志 |
📊 效率对比
| 任务 | 手动 | GitHub Actions | 提升 |
|---|---|---|---|
| 代码审查 | 10 分钟 | 2 分钟 | 5x |
| 测试运行 | 5 分钟 | 1 分钟 | 5x |
| 文档生成 | 30 分钟 | 3 分钟 | 10x |
| 部署 | 15 分钟 | 2 分钟 | 7.5x |
✅ 什么时候用
- PR 提交时自动审查
- 代码合并时自动测试
- 定时生成报告
- 自动部署
- 安全扫描
❌ 什么时候不用
- 一次性任务
- 本地调试
- 不需要自动化的任务
3. Codex GitHub Action
📦 官方 Action
yaml
# 使用官方 Codex Action
uses: openai/codex-action@v1
🔧 自定义 Action
yaml
# 使用 Codex CLI
- name: Run Codex
run: |
npm install -g @openai/codex
codex -q "任务"
📋 配置选项
| 选项 | 说明 | 默认值 |
|---|---|---|
task |
任务描述 | - |
model |
使用的模型 | gpt-5-codex |
approval-mode |
审批模式 | suggest |
working-directory |
工作目录 | . |
output-file |
输出文件 | - |
comment-pr |
是否评论 PR | false |
4. 基本配置
📝 基础 Workflow
yaml
# .github/workflows/codex-basic.yml
name: Codex Basic
on:
push:
branches: [main]
pull_request:
types: [opened, synchronize]
jobs:
codex:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Codex CLI
run: npm install -g @openai/codex
- name: Run Codex
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: codex -q "审查代码质量"
🔐 配置 Secrets
- 进入 GitHub 仓库设置
- 点击 "Secrets and variables" → "Actions"
- 点击 "New repository secret"
- 添加
OPENAI_API_KEY
📋 完整示例
yaml
# .github/workflows/codex-complete.yml
name: Codex Complete
on:
push:
branches: [main, develop]
pull_request:
types: [opened, synchronize, reopened]
jobs:
code-review:
name: Code Review
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Codex CLI
run: npm install -g @openai/codex
- name: Get Changed Files
id: changed-files
uses: tj-actions/changed-files@v44
- name: Run Code Review
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
codex -q "审查以下文件的代码质量:
${{ steps.changed-files.outputs.all_changed_files }}
重点关注:
1. 安全漏洞
2. 性能问题
3. 代码规范
4. 潜在 bug
输出 Markdown 格式的审查报告。" > review.md
- name: Comment PR
if: github.event_name == 'pull_request'
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const review = fs.readFileSync('review.md', 'utf8');
await github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `## 🤖 AI 代码审查报告\n\n${review}`
});
- name: Upload Review
uses: actions/upload-artifact@v4
with:
name: code-review
path: review.md
5. 实战场景
💼 场景1:自动代码审查
yaml
# .github/workflows/code-review.yml
name: AI Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
review:
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Codex CLI
run: npm install -g @openai/codex
- name: Get PR Diff
id: diff
run: |
git fetch origin main
DIFF=$(git diff origin/main...HEAD)
echo "diff<<EOF" >> $GITHUB_OUTPUT
echo "$DIFF" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Run Code Review
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
codex -q "审查以下 PR 代码差异:
${{ steps.diff.outputs.diff }}
请检查:
1. 🔴 严重问题(安全漏洞、数据丢失、崩溃风险)
2. 🟡 警告(性能问题、代码规范、可维护性)
3. 🟢 建议(最佳实践、代码优化)
输出格式:
## 审查结果
### 🔴 严重问题
- [问题描述]
### 🟡 警告
- [警告描述]
### 🟢 建议
- [建议描述]
### ✅ 优点
- [优点描述]
" > review.md
- name: Comment PR
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const review = fs.readFileSync('review.md', 'utf8');
await github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: review
});
💼 场景2:自动测试生成
yaml
# .github/workflows/test-generation.yml
name: Auto Test Generation
on:
push:
branches: [main]
paths:
- 'src/**/*.py'
jobs:
generate-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Codex CLI
run: npm install -g @openai/codex
- name: Find Changed Files
id: changed
run: |
FILES=$(git diff --name-only HEAD~1 HEAD -- 'src/**/*.py')
echo "files<<EOF" >> $GITHUB_OUTPUT
echo "$FILES" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Generate Tests
if: steps.changed.outputs.files != ''
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
for file in ${{ steps.changed.outputs.files }}; do
echo "生成测试: $file"
TEST_FILE="tests/test_$(basename $file)"
if [ ! -f "$TEST_FILE" ]; then
codex -q "为 $file 生成 pytest 单元测试,覆盖所有公开方法" > "$TEST_FILE"
echo "✅ 生成: $TEST_FILE"
fi
done
- name: Run Tests
run: |
pip install pytest
pytest tests/ -v
- name: Create PR
if: success()
uses: peter-evans/create-pull-request@v5
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: 'test: auto-generate unit tests'
title: 'test: Auto-generated unit tests'
body: 'Auto-generated unit tests by Codex CLI'
branch: auto-generated-tests
💼 场景3:自动文档生成
yaml
# .github/workflows/doc-generation.yml
name: Auto Documentation
on:
push:
branches: [main]
paths:
- 'src/**'
jobs:
generate-docs:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Codex CLI
run: npm install -g @openai/codex
- name: Generate API Docs
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
mkdir -p docs/api
for file in src/api/*.py; do
basename=$(basename "$file" .py)
echo "生成文档: $file -> docs/api/$basename.md"
codex -q "为 $file 生成 API 文档" > "docs/api/$basename.md"
done
- name: Generate README
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
codex -q "根据项目结构生成 README.md" > README_NEW.md
# 如果 README 有变化,更新
if ! diff -q README.md README_NEW.md > /dev/null 2>&1; then
mv README_NEW.md README.md
echo "✅ README.md 已更新"
else
rm README_NEW.md
echo "README.md 无需更新"
fi
- name: Commit Changes
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: 'docs: auto-update documentation'
file_pattern: 'docs/*.md README.md'
💼 场景4:安全扫描
yaml
# .github/workflows/security-scan.yml
name: Security Scan
on:
pull_request:
types: [opened, synchronize]
schedule:
- cron: '0 0 * * 1' # 每周一运行
jobs:
security-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Codex CLI
run: npm install -g @openai/codex
- name: Run Security Scan
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
codex -q "对项目进行安全扫描,检查:
1. 代码安全漏洞
- SQL 注入
- XSS 攻击
- 命令注入
- 路径遍历
2. 依赖安全
- 已知漏洞
- 过时依赖
3. 配置安全
- 硬编码密钥
- 不安全配置
- 权限问题
4. 敏感信息泄露
- API Key
- 密码
- 内部 URL
输出格式:
## 🔒 安全扫描报告
### 发现的问题
- [严重程度] [问题描述] [文件位置]
### 建议修复
- [修复建议]
### 总体评分
- 评分:[A/B/C/D/F]
- 总结:[一句话总结]
" > security-report.md
- name: Check Critical Issues
run: |
if grep -q "严重" security-report.md; then
echo "发现严重安全问题!"
exit 1
fi
- name: Upload Report
uses: actions/upload-artifact@v4
with:
name: security-report
path: security-report.md
- name: Comment PR
if: github.event_name == 'pull_request'
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const report = fs.readFileSync('security-report.md', 'utf8');
await github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: report
});
💼 场景5:自动部署
yaml
# .github/workflows/deploy.yml
name: Auto Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
environment: production
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Codex CLI
run: npm install -g @openai/codex
- name: Pre-deploy Check
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
codex -q "检查代码是否可以安全部署:
1. 所有测试是否通过
2. 是否有未解决的严重问题
3. 代码质量是否达标
4. 是否有配置问题
输出:PASS 或 FAIL + 原因" > deploy-check.txt
if grep -q "FAIL" deploy-check.txt; then
echo "部署前检查失败:"
cat deploy-check.txt
exit 1
fi
- name: Deploy
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
codex -q --approval-mode full-auto "执行部署:
1. 构建项目
2. 运行测试
3. 部署到生产环境
4. 验证部署结果
步骤:
1. npm run build
2. npm test
3. deploy to production
4. health check"
- name: Post-deploy Verification
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
codex -q "验证部署结果:
1. 服务是否正常运行
2. 健康检查是否通过
3. 关键功能是否正常
输出验证报告。" > deploy-verification.md
- name: Notify
if: always()
run: |
echo "部署完成" | mail -s "部署通知" team@example.com
6. 高级用法
🔄 并行执行
yaml
jobs:
review:
runs-on: ubuntu-latest
strategy:
matrix:
check: [security, performance, style]
steps:
- uses: actions/checkout@v4
- name: Run ${{ matrix.check }} Check
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
codex -q "运行 ${{ matrix.check }} 检查" > ${{ matrix.check }}.md
- name: Upload Results
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.check }}
path: ${{ matrix.check }}.md
combine:
needs: [review]
runs-on: ubuntu-latest
steps:
- name: Download All Results
uses: actions/download-artifact@v4
- name: Combine Reports
run: |
cat security/security.md > report.md
echo "---" >> report.md
cat performance/performance.md >> report.md
echo "---" >> report.md
cat style/style.md >> report.md
📊 缓存优化
yaml
- name: Cache Node Modules
uses: actions/cache@v3
with:
path: ~/.npm
key: npm-${{ hashFiles('package-lock.json') }}
restore-keys: |
npm-
- name: Cache Codex Results
uses: actions/cache@v3
with:
path: .codex-cache
key: codex-${{ hashFiles('src/**') }}
🎯 条件执行
yaml
- name: Run Codex
if: |
github.event_name == 'pull_request' &&
!contains(github.event.pull_request.title, 'WIP')
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: codex -q "审查代码"
📝 复合 Workflow
yaml
name: Full CI/CD
on:
push:
branches: [main]
pull_request:
types: [opened, synchronize]
jobs:
# 并行运行多个检查
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm run lint
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm test
# AI 检查
ai-review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Codex
run: npm install -g @openai/codex
- name: AI Review
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: codex -q "审查代码"
# 部署(只在 main 分支)
deploy:
needs: [lint, test, ai-review]
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: echo "Deploying..."
7. 最佳实践
✅ DO - 推荐做法
-
使用 Secrets 管理 API Key
yamlenv: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} -
使用缓存优化速度
yaml- uses: actions/cache@v3 with: path: ~/.npm key: npm-${{ hashFiles('package-lock.json') }} -
并行执行独立任务
yamljobs: review: ... test: ... -
条件执行避免浪费
yaml- if: github.event_name == 'pull_request' -
保存结果用于追踪
yaml- uses: actions/upload-artifact@v4 with: name: review path: review.md -
设置超时避免卡住
yaml- timeout-minutes: 10
❌ DON'T - 避免事项
-
不要硬编码 API Key
yaml# ❌ 错误 env: OPENAI_API_KEY: sk-xxx # ✅ 正确 env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} -
不要忽略错误
yaml# ❌ 错误 - run: codex -q "任务" # ✅ 正确 - run: codex -q "任务" continue-on-error: false -
不要每次安装
yaml# ❌ 错误 - run: npm install -g @openai/codex # ✅ 正确(使用缓存) - uses: actions/cache@v3 with: path: ~/.npm key: npm-codex -
不要处理敏感数据
yaml# ❌ 错误 - run: codex -q "处理 ${{ secrets.SENSITIVE_DATA }}" # ✅ 正确 # 先脱敏再处理
📋 检查清单
- 使用 Secrets 管理 API Key
- 使用缓存优化速度
- 并行执行独立任务
- 条件执行避免浪费
- 保存结果用于追踪
- 设置超时避免卡住
- 不处理敏感数据
- 测试 Workflow
8. 常见问题
❓ Q1:如何调试 Workflow?
A:
-
启用调试日志
yaml- run: codex -q "任务" env: ACTIONS_STEP_DEBUG: true -
使用
act本地测试bashact -s OPENAI_API_KEY=sk-xxx
❓ Q2:如何降低费用?
A:
-
使用更便宜的模型
yaml- run: codex -m gpt-4o-mini -q "任务" -
只在必要时运行
yaml- if: contains(github.event.pull_request.title, 'review') -
缓存结果
yaml- uses: actions/cache@v3
❓ Q3:如何处理超时?
A:
yaml
- run: codex -q "任务"
timeout-minutes: 10
❓ Q4:如何并行运行?
A:
yaml
jobs:
job1:
...
job2:
...
❓ Q5:如何访问仓库内容?
A:
yaml
- uses: actions/checkout@v4
with:
fetch-depth: 0 # 获取完整历史
❓ Q6:如何评论 PR?
A:
yaml
- uses: actions/github-script@v7
with:
script: |
await github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '评论内容'
});
9. 总结
🎯 核心要点
- 什么是 GitHub Action:GitHub 的 CI/CD 平台
- 为什么用:自动化、可追踪、可复用
- Codex Action:集成 AI 能力到 CI/CD
- 基本配置:Workflow + Secrets + Steps
- 实战场景:代码审查、测试生成、文档、安全扫描、部署
- 高级用法:并行、缓存、条件、复合
📋 快速开始
yaml
# .github/workflows/codex.yml
name: Codex Review
on: [pull_request]
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm install -g @openai/codex
- run: codex -q "审查代码"
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
📚 下一步
- 📖 第11篇:IDE 扩展与 Web 版:多端协作全解析
- 🔧 实践:为你的项目配置 Codex GitHub Action
- 💬 社区:分享你的 Workflow 配置
📝 系列文章导航
- 上一篇:第9篇 - SDK 开发指南:用代码调用 AI 编程能力
- 下一篇:第11篇 - IDE 扩展与 Web 版:多端协作全解析
- 系列目录:Codex CLI 中文官方手册与使用指南(12篇)
💡 遇到问题? 欢迎在评论区留言,我会及时回复!
👍 觉得有用? 点赞收藏,帮助更多开发者!