OpenCode + GitHub Actions:完全自主的 AI 代码审查流水线搭建指南
PR 提交两分钟后,AI 即可返回一份全面的代码审查报告。这并非遥远的未来,而是今天就能落地的实践。
还在为每个 PR 手动审查代码而烦恼?还在犹豫是否要把仓库权限交给第三方 AI 审查工具?本文将带领你用 OpenCode 与 GitHub Actions 构建一条完全自主可控的 AI 代码审查流水线——无需交出仓库权限,不绑定任何平台,边际成本几乎为零。
为何要在 CI 中引入 AI 代码审查
传统持续集成与交付的局限性
传统的 CI/CD 管道已经解决了自动编译、自动测试和自动部署等问题,但在代码审查环节,大多数团队依然依赖人工。
典型的人工审查流程:
开发者提交 PR → 等待同事空闲 → 同事粗略浏览 → LGTM → 合并
↑ ↑
时间成本高 质量无法保证
传统 CI 在代码审查方面存在明显的短板:
| 局限 | 说明 |
|---|---|
| 静态分析缺乏智能 | SonarQube、ESLint 等工具仅能识别模式化问题,无法理解业务逻辑。 |
| 人工审查成为瓶颈 | 团队规模较小时,审查拖慢进度;规模扩大后,审查质量良莠不齐。 |
| 审查标准不统一 | 不同审查者的关注点各异,缺少一致的质量基线。 |
| 响应延迟 | 跨时区协作时,PR 可能等待数小时甚至数天才能得到反馈。 |
AI 辅助审查带来的价值
AI 代码审查并非要取代人工,而是充当一道 7×24 小时在线、标准统一的第一道质量关卡:
引入 AI 审查之后:
开发者提交 PR → AI 立即审查(< 2 分钟)→ 自动评论反馈 → 人工最终决策 → 合并
↑ ↑
即时响应,全天候 开发者提前修复问题
AI 审查能够做到:
- • 秒级响应:PR 提交后即刻开始审查,无需等待任何人。
- • 标准一致:每次审查都遵循相同的规则和质量基线。
- • 全面覆盖:不会因为文件过多而“跳过”某些内容。
- • 理解业务逻辑:大语言模型能够领会代码意图,而不仅限于语法层面。
OpenCode 在 CI/CD 管道中的定位
作为一款开源的 AI 编程代理,OpenCode 天然适合在 CI 环境中运行:
┌─────────────────────────────────┐
│ GitHub Actions Runner │
│ │
PR 提交 ──────► │ 1. 拉取代码 │
│ 2. 获取差异 │
│ 3. OpenCode 分析代码 ──────┐ │
│ │ │
│ 4. 生成审查报告 ◄───────────┘ │
│ 5. 评论到 PR │
│ │
└─────────────────────────────────┘
为何选择 OpenCode 而非第三方 SaaS 审查工具?
| 对比项 | 第三方 SaaS 工具 | OpenCode + GitHub Actions |
|---|---|---|
| 代码安全 | 需授予仓库 OAuth 权限 | 代码仅在自己的 Runner 上处理 |
| 模型选择 | 绑定特定模型 | 75+ 种模型灵活切换 |
| 成本 | 按席位/PR/月收费 | 仅产生模型 API 调用费用,已有订阅则零额外成本 |
| 平台支持 | 通常仅限 GitHub/GitLab | 可适配任意 CI/CD 平台 |
| 可定制性 | 有限 | 完全自定义 prompt 与流程 |
💡 核心优势:OpenCode 在你自己的 CI Runner 内运行,代码不流经任何第三方。若搭配 ChatGPT Plus/Team 订阅使用,AI 代码审查的边际成本几乎为零。
快速回顾:GitHub Actions 核心概念
在正式开始集成前,先简要回顾 GitHub Actions 的关键要素。
Workflow 基本结构
GitHub Actions 的 Workflow 是一个 YAML 文件,存放在仓库的 .github/workflows/ 目录下:
name: Workflow 名称
on:
# 触发条件
jobs:
# 工作任务
job-name:
runs-on: ubuntu-latest
steps:
- name: Step 名称
run: echo "Hello"
触发条件
GitHub Actions 支持多种触发方式,在 AI 代码审查场景中常用的有:
| 触发事件 | 说明 | AI 审查适用场景 |
|---|---|---|
pull_request | PR 创建或更新时触发 | 核心场景:PR 自动审查 |
issue_comment | PR 或 Issue 添加评论时触发 | 通过 /opencode 命令触发 |
pull_request_review_comment | 对特定代码行发起评论时触发 | 针对特定代码的审查 |
schedule | 定时触发(cron) | 定期全量代码审查 |
workflow_dispatch | 手动触发 | 按需审查 |
环境变量与 Secrets
在 CI 中使用 API 密钥等敏感信息时,务必通过 GitHub Secrets 管理:
仓库 Settings → Secrets and variables → Actions → New repository secret
在 Workflow 中通过 ${{ secrets.SECRET_NAME }} 引用:
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
⚠️ 安全提醒:绝不要把 API Key 硬编码在 Workflow 文件中。GitHub 会自动屏蔽日志里的 Secret 值,但仍需养成良好的习惯。
在 CI 中运行 OpenCode CLI
OpenCode 提供了两种 CI 集成方式:
- 官方 GitHub Action:
anomalyco/opencode/github@latest,专为 GitHub 集成设计。 - CLI 非交互模式:
opencode run命令,适用于任意 CI/CD 平台。
方式一:官方 GitHub Action(推荐)
使用官方 Action 最为简便:
- name: Run OpenCode
uses: anomalyco/opencode/github@latest
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
with:
model: anthropic/claude-sonnet-4-20250514
快速安装:在你的项目仓库中执行以下命令,OpenCode 会引导你完成整个设置:
opencode github install
该命令会自动帮你:
- • 安装 OpenCode GitHub App
- • 创建 Workflow 文件
- • 配置所需的 Secrets
方式二:CLI 非交互模式(通用方案)
opencode run 是非交互模式的核心命令,直接传入 prompt 即可执行:
opencode run "审查这个 PR 的代码质量"
常用标志:
| 标志 | 简写 | 说明 |
|---|---|---|
--model | -m | 指定模型,格式为 provider/model |
--agent | 指定代理 | |
--file | -f | 附加文件到消息 |
--format | 输出格式:default 或 json | |
--share | 分享会话 |
在 CI 中结合 Git diff 使用的典型模式:
# 获取 PR 的差异
git diff origin/main...HEAD > diff.txt
# 让 OpenCode 基于 diff 进行审查
opencode run -m anthropic/claude-sonnet-4-20250514 \
-f diff.txt \
"审查以下代码变更,关注潜在的 bug、安全问题和代码质量。将结果写入 review.md"
API Key 管理
OpenCode 支持多种 API Key 配置方式,在 CI 中推荐使用环境变量:
env:
# Anthropic
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
# OpenAI
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
# OpenRouter
OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
OpenCode 启动时会自动读取这些环境变量,无需额外的配置文件。
💡 技巧:如果拥有 ChatGPT Plus/Team 订阅,可通过 OAuth Token 使用,避免额外的 API 费用。不过 Token 有效期约 14 天,需要在 CI Secrets 中定期更新。
超时与资源控制
CI 环境中必须注意超时设置,防止 AI 审查耗时过长:
jobs:
ai-review:
runs-on: ubuntu-latest
timeout-minutes: 10 # 整个 Job 的超时时间
steps:
- name: Run OpenCode
uses: anomalyco/opencode/github@latest
timeout-minutes: 8 # 单步的超时限制
with:
model: anthropic/claude-sonnet-4-20250514
OpenCode 还支持通过环境变量调整行为:
env:
# 禁用自动更新(CI 中不需要)
OPENCODE_DISABLE_AUTOUPDATE: "true"
# 禁用自动上下文压缩
OPENCODE_DISABLE_AUTOCOMPACT: "true"
# 设置 bash 命令超时
OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: "30000"
创建你的第一个 AI 代码审查工作流
掌握了基础之后,我们现在动手创建第一条 AI 代码审查 Workflow。
PR 触发自动审查
这是最核心的场景:每当有 PR 提交时,OpenCode 自动执行代码审查并输出结果。
完整的 Workflow 示例
在项目中创建 .github/workflows/ai-review.yml:
name: AI Code Review
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
jobs:
ai-review:
# 只在 PR 不是草稿状态时运行
if: ${{ !github.event.pull_request.draft }}
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
id-token: write
contents: read
pull-requests: write
issues: read
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 0
persist-credentials: false
- name: AI Code Review
uses: anomalyco/opencode/github@latest
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
model: anthropic/claude-sonnet-4-20250514
use_github_token: true
prompt: |
审查这个 Pull Request:
## 审查重点
- 检查代码质量问题(潜在的 bug、逻辑错误)
- 检查安全问题(SQL 注入、XSS、敏感信息泄露)
- 检查性能问题(N+1 查询、内存泄漏风险)
- 建议改进方案
## 审查原则
- 保守审查:只标记你 90%+ 确定的问题,误报会浪费开发者时间
- 跳过:代码风格、命名规范、文档格式
- 对每个问题提供文件名和行号引用
- 如果代码质量良好,直接回复 LGTM
审查结果输出
OpenCode 完成审查后,会自动将结果以 PR Comment 的形式发布:
┌─────────────────────────────────────────────────────┐
│ OpenCode AI Review │
├─────────────────────────────────────────────────────┤
│ │
│ 审查摘要 │
│ │
│ ⚠️ 潜在问题 (2) │
│ │
│ 1. src/handlers/user.go:42 │
│ 可能存在 SQL 注入风险,建议使用参数化查询: │
│ db.Query("SELECT * FROM users WHERE id = $1", id)│
│ │
│ 2. src/middleware/auth.go:18 │
│ JWT 密钥从环境变量读取但缺少空值检查。 │
│ 如果 JWT_SECRET 未设置,服务会以空密钥启动。 │
│ │
│ 💡 改进建议 (1) │
│ │
│ 1. src/service/order.go:89 │
│ 循环内的数据库查询可能导致 N+1 问题。 │
│ 建议批量查询后再在内存中匹配。 │
│ │
└─────────────────────────────────────────────────────┘
使用 /opencode 命令触发
除了自动审查,你也可以在 PR 评论中通过 /opencode 或 /oc 手动触发:
name: OpenCode on Comment
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
jobs:
opencode:
if: |
contains(github.event.comment.body, '/oc') ||
contains(github.event.comment.body, '/opencode')
runs-on: ubuntu-latest
permissions:
id-token: write
contents: write
pull-requests: write
issues: write
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Run OpenCode
uses: anomalyco/opencode/github@latest
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
with:
model: anthropic/claude-sonnet-4-20250514
用法:在 PR 的任意评论中输入 /opencode 审查一下这段代码的安全性,OpenCode 即会执行并将结果回复到该 PR。
进阶工作流模式
掌握基础之后,再来看看几种更高级的用法。
按文件类型选择性审查
大型项目中,不同模块可能需要不同的审查策略。利用条件判断可以按文件类型触发不同风格的审查:
name: Smart AI Review
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
# 检测变更的文件类型
detect-changes:
runs-on: ubuntu-latest
outputs:
has_go: ${{ steps.filter.outputs.go }}
has_java: ${{ steps.filter.outputs.java }}
has_frontend: ${{ steps.filter.outputs.frontend }}
steps:
- uses: actions/checkout@v6
- uses: dorny/paths-filter@v3
id: filter
with:
filters: |
go:
- '**/*.go'
java:
- '**/*.java'
- '**/pom.xml'
- '**/build.gradle'
frontend:
- '**/*.tsx'
- '**/*.ts'
- '**/*.css'
# Go 代码审查
go-review:
needs: detect-changes
if: needs.detect-changes.outputs.has_go == 'true'
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
persist-credentials: false
- uses: anomalyco/opencode/github@latest
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
with:
model: anthropic/claude-sonnet-4-20250514
prompt: |
审查 Go 代码变更,重点关注:
- goroutine 泄漏与并发安全问题
- error handling 是否规范
- context 传递是否正确
- 资源释放(defer Close)
- Go 性能最佳实践
# Java 代码审查
java-review:
needs: detect-changes
if: needs.detect-changes.outputs.has_java == 'true'
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
persist-credentials: false
- uses: anomalyco/opencode/github@latest
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
with:
model: anthropic/claude-sonnet-4-20250514
prompt: |
审查 Java/Spring Boot 代码变更,重点关注:
- N+1 查询与 JPA 性能陷阱
- 事务边界是否正确
- 线程安全问题
- Spring Bean 生命周期
- 异常处理是否完善
# 前端代码审查
frontend-review:
needs: detect-changes
if: needs.detect-changes.outputs.has_frontend == 'true'
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
persist-credentials: false
- uses: anomalyco/opencode/github@latest
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
with:
model: anthropic/claude-sonnet-4-20250514
prompt: |
审查 React/TypeScript 前端代码变更,重点关注:
- React hooks 依赖数组是否正确
- 内存泄漏(useEffect 清理)
- XSS 防护
- 不必要的重渲染
- 类型安全
多模型对比审查
不同模型各有千秋,可以让多个模型同步审查同一份代码,取长补短:
name: Multi-Model Review
on:
pull_request:
types: [opened, synchronize]
jobs:
# Claude 审查
claude-review:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
persist-credentials: false
- uses: anomalyco/opencode/github@latest
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
with:
model: anthropic/claude-sonnet-4-20250514
prompt: |
以安全专家的角度审查此 PR。
重点关注安全漏洞、权限问题和数据泄露风险。
在评论开头标注 [Claude 安全审查]。
# GPT 审查
gpt-review:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
persist-credentials: false
- uses: anomalyco/opencode/github@latest
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
with:
model: openai/gpt-4.1
prompt: |
以性能专家的角度审查此 PR。
重点关注性能瓶颈、资源使用效率和优化空间。
在评论开头标注 [GPT 性能审查]。
💡 实用建议:多模型审查会增加 API 成本和 CI 时间。建议仅在关键分支(如
main、release-*)上启用,日常开发分支使用单模型即可。
定时全量代码审查
除了 PR 审查,还可以设置定时任务,让 OpenCode 定期对全库进行审计:
name: Weekly Code Audit
on:
schedule:
# 每周一上午 9 点(UTC)执行
- cron: "0 9 * * 1"
# 也支持手动触发
workflow_dispatch:
jobs:
weekly-audit:
runs-on: ubuntu-latest
timeout-minutes: 30
permissions:
id-token: write
contents: write
pull-requests: write
issues: write
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Run Weekly Audit
uses: anomalyco/opencode/github@latest
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
with:
model: anthropic/claude-sonnet-4-20250514
prompt: |
执行每周代码审计:
1. 扫描整个代码库中的 TODO 和 FIXME 注释,汇总成列表
2. 检查是否包含明显的死代码
3. 检查依赖是否存在已知安全漏洞
4. 评估代码的整体健康度
5. 如果发现值得关注的问题,创建 GitHub Issue 进行跟踪
⚠️ 注意:定时任务中没有用户上下文进行权限检查。如果需要 OpenCode 创建分支或 PR,Workflow 必须授予
contents: write和pull-requests: write权限。
安全管理最佳实践
将 AI 接入 CI/CD 管道,安全是首要考虑。
API Key 安全管理
# 正确做法:通过 Secrets 引用
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
# 错误做法:绝对不要这样写
# ANTHROPIC_API_KEY: "sk-ant-xxxxx" # 危险!
管理 API Key 的最佳实践:
- 使用组织级 Secrets:在 GitHub Organization 层面配置,多个仓库共享。
- 定期轮换:建议每 90 天更换一次 API Key。
- 最小权限:不同项目使用不同的 API Key。
- 审计日志:定期检查 API Key 的使用情况。
权限最小化原则
GitHub Actions 的 permissions 字段控制 Workflow 的访问权限。应始终坚持最小权限原则:
# 审查场景:只需读取代码和写评论
permissions:
id-token: write # OpenCode Action 必需
contents: read # 只读代码
pull-requests: write # 写评论
issues: read # 读取 Issue 上下文
# 自动修复场景:需要写代码和创建 PR
permissions:
id-token: write
contents: write # 写代码(提交修改)
pull-requests: write # 创建/更新 PR
issues: write # 创建 Issue
成本控制
AI 代码审查会产生模型 API 调用费用,需要合理控制:
jobs:
ai-review:
runs-on: ubuntu-latest
# 限制仅对特定分支触发
if: |
github.event.pull_request.base.ref == 'main' ||
github.event.pull_request.base.ref == 'develop'
steps:
# 跳过大型 PR(超过 500 行变更)
- name: Check PR size
id: pr-size
run: |
LINES=$(git diff --numstat origin/${{ github.base_ref }}...HEAD | awk '{sum+=$1+$2} END {print sum}')
echo "lines=$LINES" >> $GITHUB_OUTPUT
if [ "$LINES" -gt 500 ]; then
echo "skip=true" >> $GITHUB_OUTPUT
fi
- name: AI Review
if: steps.pr-size.outputs.skip != 'true'
uses: anomalyco/opencode/github@latest
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
with:
model: anthropic/claude-sonnet-4-20250514
成本控制策略:
| 策略 | 说明 | 效果 |
|---|---|---|
| 限制分支 | 仅在 main/develop 的 PR 上运行 | 减少 60-80% 的调用量 |
| 跳过大 PR | 超过一定行数时不进行审查 | 避免单次高额消耗 |
| 使用便宜模型 | 日常审查用 Haiku,关键审查用 Sonnet | 降低约 70% 的单次成本 |
| 限制频率 | 同一 PR 每天最多审查一次 | 避免频繁 push 反复触发 |
审查结果过滤
确保审查结果不会暴露敏感信息:
- name: AI Review
uses: anomalyco/opencode/github@latest
with:
model: anthropic/claude-sonnet-4-20250514
prompt: |
审查此 PR,注意以下规则:
- 不要在评论中输出完整的配置文件内容
- 不要输出数据库连接字符串、密钥等敏感信息
- 引用敏感位置时,只标注文件名和行号
- 不要输出测试数据中的个人信息
实战场景配置示例
Go 项目:Gin Web 服务
一个典型的 Go Web 服务项目的 AI 审查配置:
# .github/workflows/ai-review.yml
name: AI Review (Go)
on:
pull_request:
types: [opened, synchronize, reopened]
paths:
- '**/*.go'
- 'go.mod'
- 'go.sum'
jobs:
review:
if: ${{ !github.event.pull_request.draft }}
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
id-token: write
contents: read
pull-requests: write
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
persist-credentials: false
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.23'
- name: AI Code Review
uses: anomalyco/opencode/github@latest
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
model: anthropic/claude-sonnet-4-20250514
use_github_token: true
prompt: |
审查这个 Go 项目的 PR,重点关注:
## Go 特有检查
- goroutine 泄漏:检查 goroutine 是否能正确退出
- channel 使用:是否正确关闭,是否有死锁风险
- error 处理:是否遵循 if err != nil 模式
- context 传递:HTTP handler 到数据库调用链是否传递 context
- 资源管理:defer Close() 是否遗漏
- 接口设计:接口是否最小化,是否满足隐式实现
## Web 服务检查
- 路由注册:是否有重复路由
- 中间件:认证/鉴权中间件是否正确配置
- 输入验证:请求参数是否充分验证
- SQL 注入:是否使用参数化查询
## 保守原则
- 只标记 90%+ 确定的问题
- 跳过命名风格、注释风格等主观问题
- 如果代码质量好,直接回复 LGTM
Java/Spring Boot 项目
# .github/workflows/ai-review.yml
name: AI Review (Spring Boot)
on:
pull_request:
types: [opened, synchronize, reopened]
paths:
- '**/*.java'
- '**/pom.xml'
- '**/build.gradle'
- '**/*.yml'
- '**/*.properties'
jobs:
review:
if: ${{ !github.event.pull_request.draft }}
runs-on: ubuntu-latest
timeout-minutes: 12
permissions:
id-token: write
contents: read
pull-requests: write
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
persist-credentials: false
- name: AI Code Review
uses: anomalyco/opencode/github@latest
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
model: anthropic/claude-sonnet-4-20250514
use_github_token: true
prompt: |
审查这个 Spring Boot 项目的 PR,重点关注:
## Spring Boot 检查
- Bean 注入:是否有循环依赖
- 事务管理:@Transactional 边界是否正确
- 异常处理:全局异常处理是否覆盖所有场景
- 配置管理:敏感配置是否使用环境变量
- API 设计:RESTful 规范是否一致
## JPA/数据库检查
- N+1 查询:关联查询是否使用 JOIN FETCH
- 事务传播:嵌套事务是否正确配置
- 索引使用:查询条件是否有对应索引
- 批量操作:批量插入/更新是否使用 batch
## 安全检查
- SQL 注入:是否使用 MyBatis 的 #{} 而不是 ${}
- 权限控制:接口是否有鉴权注解
- 敏感数据:日志中是否输出敏感信息
## 输出格式
- 每个问题附带文件路径和行号
- 给出具体的修复建议和代码示例
- 如果 LGTM,简要说明代码质量良好
前端 React 项目
# .github/workflows/ai-review.yml
name: AI Review (React)
on:
pull_request:
types: [opened, synchronize, reopened]
paths:
- '**/*.tsx'
- '**/*.ts'
- '**/*.css'
- '**/*.scss'
- 'package.json'
jobs:
review:
if: ${{ !github.event.pull_request.draft }}
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
id-token: write
contents: read
pull-requests: write
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
persist-credentials: false
- name: AI Code Review
uses: anomalyco/opencode/github@latest
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
model: anthropic/claude-sonnet-4-20250514
use_github_token: true
prompt: |
审查这个 React/TypeScript 项目的 PR,重点关注:
## React 检查
- hooks 依赖:useEffect/useMemo/useCallback 的依赖数组是否完整
- 内存泄漏:useEffect 是否正确清理订阅和定时器
- 重渲染:是否存在不必要的组件重渲染
- key 属性:列表渲染是否使用稳定的 key
- 状态管理:state 是否提升到正确的层级
## TypeScript 检查
- 类型安全:是否有 any 类型需要收窄
- 泛型使用:泛型约束是否合理
- 类型断言:是否可以避免 as 断言
## 安全检查
- XSS 防护:是否使用了不安全的 HTML 渲染方式
- 敏感数据:前端代码是否包含 API Key 等敏感信息
- 依赖安全:新增依赖是否可信
## 性能检查
- Bundle 大小:是否引入了过大的依赖
- 懒加载:大组件是否使用了 React.lazy
- 图片优化:图片是否使用了合适的格式和加载策略
常见问题排查与优化
API 限流处理
模型提供商通常设有 API 调用频率限制,CI 中可能因为多个 Workflow 并行运行而触发限流。
解决办法:
# 使用 concurrency 确保同一时间只有一个审查任务执行
concurrency:
group: ai-review-${{ github.event.pull_request.number }}
cancel-in-progress: true # 取消旧的运行,仅保留最新
jobs:
ai-review:
runs-on: ubuntu-latest
steps:
# 添加重试机制
- name: AI Review with Retry
uses: anomalyco/opencode/github@latest
timeout-minutes: 10
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
with:
model: anthropic/claude-sonnet-4-20250514
💡 技巧:若频繁遇到限流,可考虑使用 OpenRouter 作为统一的模型网关,它能够在多个提供商之间自动切换。
超时问题
大型 PR 或复杂代码可能导致审查超时。
应对策略:
# 限制审查范围
- name: AI Review
uses: anomalyco/opencode/github@latest
with:
model: anthropic/claude-sonnet-4-20250514
prompt: |
只审查最近一次 commit 中修改的文件。
如果修改的文件超过 20 个,只审查核心业务逻辑文件。
跳过自动生成的文件(如 lock 文件、dist 目录)。
大型 PR 的处理策略
| 策略 | 实现方式 | 说明 |
|---|---|---|
| 跳过超大 PR | 行数检查 | 超过阈值时提示人工审查 |
| 分批审查 | 按目录分组 | 分别审查不同模块 |
| 只审查核心文件 | 过滤文件类型 | 跳过测试文件、配置文件 |
| 使用更快模型 | Haiku 代替 Sonnet | 牺牲少量质量换取速度 |
# 大型 PR 使用轻量模型
- name: Determine Model
id: model-select
run: |
LINES=$(git diff --numstat origin/${{ github.base_ref }}...HEAD | awk '{sum+=$1+$2} END {print sum+0}')
if [ "$LINES" -gt 300 ]; then
echo "model=anthropic/claude-haiku-4-20250414" >> $GITHUB_OUTPUT
echo "reason=大型 PR ($LINES 行变更),使用 Haiku 模型加速审查" >> $GITHUB_OUTPUT
else
echo "model=anthropic/claude-sonnet-4-20250514" >> $GITHUB_OUTPUT
echo "reason=标准 PR ($LINES 行变更)" >> $GITHUB_OUTPUT
fi
- name: AI Review
uses: anomalyco/opencode/github@latest
with:
model: ${{ steps.model-select.outputs.model }}
prompt: |
${{ steps.model-select.outputs.reason }}
审查此 PR,关注关键问题。
审查质量优化
若 AI 审查的质量不够理想,可以从以下几个方面着手优化:
1. 优化 Prompt
Prompt 是控制审查质量的核心。一份优秀的审查 Prompt 应包含:
优质审查 Prompt 的结构:
1. 角色定义(你是哪方面的专家)
2. 审查范围(关注什么,跳过什么)
3. 评判标准(什么程度的问题才值得标记)
4. 输出格式(统一的评论格式)
5. 特殊规则(项目特有的编码规范)
2. 利用 AGENTS.md
在项目根目录创建 AGENTS.md,OpenCode 在审查时会自动参考:
# AGENTS.md
## 项目简介
这是一个基于 Spring Boot 3.x 的电商后端服务。
## 编码规范
- Controller 层仅做参数校验和路由,业务逻辑放在 Service 层
- 所有数据库操作必须通过 Repository 层
- 禁止在 Controller 中直接注入 EntityManager
## 已知问题
- OrderService 中存在历史遗留的 N+1 查询,正逐步修复
- 用户模块采用旧版鉴权方式,新模块请使用 JWT
3. 在 CI 中注入项目上下文
prompt: |
先阅读 AGENTS.md 了解项目背景。
审查此 PR,重点关注 AGENTS.md 中提到的编码规范。
总结
OpenCode + GitHub Actions = 自主可控的 AI 代码审查流水线
核心要点回顾
- • 为什么需要:AI 审查提供了即时、一致、全天候的第一道代码质量检查。
- • 为什么选 OpenCode:开源免费,模型自由,代码不经过第三方,支持任意 CI/CD 平台。
- • 两种集成方式:官方 GitHub Action(简便)和 CLI 非交互模式(灵活)。
- • 安全第一:API Key 通过 Secrets 管理,权限最小化,过滤审查结果。
- • 成本可控:限制触发分支,跳过超大 PR,按需选择模型。
最佳实践清单
✅ 使用官方 GitHub Action 作为起点
✅ API Key 全部通过 GitHub Secrets 管理
✅ permissions 遵循最小权限原则
✅ 设置 timeout-minutes 防止无限运行
✅ 使用 concurrency 避免重复审查
✅ 草稿 PR 不触发审查(if: !draft)
✅ 编写清晰、具有项目针对性的审查 Prompt
✅ 利用 AGENTS.md 为 AI 提供项目上下文
✅ 大型 PR 使用轻量模型或跳过
✅ 定期回顾并优化 Prompt 质量
从零开始的步骤
1. 在项目中运行 opencode github install
2. 配置 API Key 到 GitHub Secrets
3. 提交一个测试 PR 验证 Workflow
4. 根据团队需求调整 Prompt
5. 逐步扩展到更多场景(定时审查、Issue 分类等)
🔗 延伸阅读
- ▪️ OpenCode 官方文档 - GitHub 集成[1]
- ▪️ OpenCode 官方文档 - CLI 命令[2]
- ▪️ OpenCode GitHub 仓库[3]
引用链接
[1] OpenCode 官方文档 - GitHub 集成: https://opencode.ai/docs/github/[2] OpenCode 官方文档 - CLI 命令: https://opencode.ai/docs/cli/[3] OpenCode GitHub 仓库: https://github.com/anomalyco/opencode