前言
在日常开发过程中, code review
是软件开发过程中的关键步骤。它可以帮助开发人员发现代码中的错误,提高代码质量,并促进团队间的知识共享。然而 ,代码审查过程往往需要大量的时间和精力 以及 code review 代码质量的问题。
自动化代码审查 可以帮助解决这些问题。通过使用机器学习模型,如 GPT (Generative Pretrained Transformer),我们可以自动审查代码,找出潜在的问题,提高代码审查的效率 和准确性。此外,自动化代码审查可以减轻开发人员的负担,有更多的时间专注于其他重要的任务。
本文是实现了github的cr流程,gitlabci同理
参考资料
- Github Access Token: **docs.github.com/zh/authenti...
- Deepseek: **platform.deepseek.com/usage**
- ockokit-NPM : **www.npmjs.com/package/oct...
- hua-bang.github.io/blog/tech/g...
流程图
markdown
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ │ │ │ │ │
│ 获取PR变更内容 │────▶│ 分析代码变更 │────▶│ 生成审查报告 │
│ │ │ │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ │ │ │ │ │
│ GitHub API 调用 │ │ 模拟分析 或 AI │ │ 提交评论到PR │
│ │ │ │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
思路
通过 OctoKit
来与github api交互, 这里是一个demo
除了 githubToken
其他都可以在pr过程的action获取,实际就是github的个人设置dev setting里的key
typescript
import { Octokit } from '@octokit/rest';
import { getConfig } from '../utils/config';
import { logger } from '../utils/logger';
import { PRDiff, ReviewComment } from './types';
/**
* GitHub客户端
* 负责与GitHub API进行交互,获取PR的差异信息和评论
*/
export class GitHubClient {
private octokit: Octokit;
private owner: string;
private repo: string;
private prNumber: number;
constructor() {
const config = getConfig();
this.octokit = new Octokit({
auth: config.githubToken
});
this.owner = config.githubOwner;
this.repo = config.githubRepo;
this.prNumber = config.prNumber;
logger.info(`初始化GitHub客户端: ${this.owner}/${this.repo} PR #${this.prNumber}`);
}
/**
* 获取PR的差异信息
*/
async getPRDiffs(): Promise<PRDiff[]> {
try {
logger.info(`获取PR #${this.prNumber}的差异信息`);
const response = await this.octokit.pulls.get({
owner: this.owner,
repo: this.repo,
pull_number: this.prNumber,
mediaType: {
format: 'diff'
}
});
// 获取PR中变更的文件列表
const files = await this.octokit.pulls.listFiles({
owner: this.owner,
repo: this.repo,
pull_number: this.prNumber
});
logger.info(`获取到${files.data.length}个变更文件`);
const diffs: PRDiff[] = files.data.map(file => ({
filename: file.filename,
patch: file.patch,
additions: file.additions,
deletions: file.deletions,
changes: file.changes,
status: file.status
}));
return diffs;
} catch (error) {
logger.error('获取PR差异失败:', error);
throw new Error(`获取PR差异失败: ${error instanceof Error ? error.message : String(error)}`);
}
}
/**
* 在PR上创建评论
*/
async createPRComment(body: string): Promise<void> {
try {
logger.info(`在PR #${this.prNumber}上创建评论`);
await this.octokit.issues.createComment({
owner: this.owner,
repo: this.repo,
issue_number: this.prNumber,
body
});
logger.info('评论创建成功');
} catch (error) {
logger.error('创建评论失败:', error);
throw new Error(`创建评论失败: ${error instanceof Error ? error.message : String(error)}`);
}
}
获取到对应信息后,配置后prompt,发送请求就可以了
action
bash
name: code review
on:
push:
branches:
- main
workflow_dispatch: # 手动触发
pull_request: # 自动触发
types: [opened, synchronize] # 触发条件
jobs:
code-review:
runs-on: ubuntu-latest
permissions: # 设置权限
contents: read
pull-requests: write
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup node
uses: actions/setup-node@v3
with:
node-version: 18
- name: Install dependencies
run: npm install
- name: Build project
run: npm run build
- name: Create env file
run: |
echo "PERSONAL_TOKEN=${{ secrets.PERSONAL_TOKEN }}" >> .env
echo "GITHUB_OWNER=${{ github.repository_owner }}" >> .env
echo "GITHUB_REPO=${{ github.event.repository.name }}" >> .env
echo "PR_NUMBER=${{ github.event.pull_request.number }}" >> .env
echo "LOG_LEVEL=info" >> .env
echo "DRY_RUN=false" >> .env
echo "AI_API_KEY=${{ secrets.AI_API_KEY }}" >> .env
echo "AI_API_ENDPOINT=https://api.deepseek.com/chat/completions" >> .env
echo "AI_MODEL=deepseek-chat" >> .env
- name: Run code review
run: npm start

usage
实际测试过程中,使用起来,每次ai review花费差不多0.01元,文件占的token相对比较小,如果是500行
总结
这是一个简单的code review的demo,现在通过ai可以帮助我们提高代码质量,和开发效率
- 安全性: 检查是否有错误或者泄漏风险
- 定制化: 根据个人需求是调整prompt
- 高效性: 提示CR效率,并且给出修改建议
如果ai自己能够提出PR,又再出发CR,不断循环