Codex CLI-10-GitHub-Action-打造AI驱动的CICD流水线

目录

  • [🚀 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

  1. 进入 GitHub 仓库设置
  2. 点击 "Secrets and variables" → "Actions"
  3. 点击 "New repository secret"
  4. 添加 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 - 推荐做法

  1. 使用 Secrets 管理 API Key

    yaml 复制代码
    env:
      OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
  2. 使用缓存优化速度

    yaml 复制代码
    - uses: actions/cache@v3
      with:
        path: ~/.npm
        key: npm-${{ hashFiles('package-lock.json') }}
  3. 并行执行独立任务

    yaml 复制代码
    jobs:
      review:
        ...
      test:
        ...
  4. 条件执行避免浪费

    yaml 复制代码
    - if: github.event_name == 'pull_request'
  5. 保存结果用于追踪

    yaml 复制代码
    - uses: actions/upload-artifact@v4
      with:
        name: review
        path: review.md
  6. 设置超时避免卡住

    yaml 复制代码
    - timeout-minutes: 10

❌ DON'T - 避免事项

  1. 不要硬编码 API Key

    yaml 复制代码
    # ❌ 错误
    env:
      OPENAI_API_KEY: sk-xxx
    
    # ✅ 正确
    env:
      OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
  2. 不要忽略错误

    yaml 复制代码
    # ❌ 错误
    - run: codex -q "任务"
    
    # ✅ 正确
    - run: codex -q "任务"
      continue-on-error: false
  3. 不要每次安装

    yaml 复制代码
    # ❌ 错误
    - run: npm install -g @openai/codex
    
    # ✅ 正确(使用缓存)
    - uses: actions/cache@v3
      with:
        path: ~/.npm
        key: npm-codex
  4. 不要处理敏感数据

    yaml 复制代码
    # ❌ 错误
    - run: codex -q "处理 ${{ secrets.SENSITIVE_DATA }}"
    
    # ✅ 正确
    # 先脱敏再处理

📋 检查清单

  • 使用 Secrets 管理 API Key
  • 使用缓存优化速度
  • 并行执行独立任务
  • 条件执行避免浪费
  • 保存结果用于追踪
  • 设置超时避免卡住
  • 不处理敏感数据
  • 测试 Workflow

8. 常见问题

❓ Q1:如何调试 Workflow?

A

  1. 启用调试日志

    yaml 复制代码
    - run: codex -q "任务"
      env:
        ACTIONS_STEP_DEBUG: true
  2. 使用 act 本地测试

    bash 复制代码
    act -s OPENAI_API_KEY=sk-xxx

❓ Q2:如何降低费用?

A

  1. 使用更便宜的模型

    yaml 复制代码
    - run: codex -m gpt-4o-mini -q "任务"
  2. 只在必要时运行

    yaml 复制代码
    - if: contains(github.event.pull_request.title, 'review')
  3. 缓存结果

    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. 总结

🎯 核心要点

  1. 什么是 GitHub Action:GitHub 的 CI/CD 平台
  2. 为什么用:自动化、可追踪、可复用
  3. Codex Action:集成 AI 能力到 CI/CD
  4. 基本配置:Workflow + Secrets + Steps
  5. 实战场景:代码审查、测试生成、文档、安全扫描、部署
  6. 高级用法:并行、缓存、条件、复合

📋 快速开始

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篇)

💡 遇到问题? 欢迎在评论区留言,我会及时回复!

👍 觉得有用? 点赞收藏,帮助更多开发者!