使用deepseek实现code review

前言

在日常开发过程中, code review 是软件开发过程中的关键步骤。它可以帮助开发人员发现代码中的错误,提高代码质量,并促进团队间的知识共享。然而 ,代码审查过程往往需要大量的时间和精力 以及 code review 代码质量的问题。

自动化代码审查 可以帮助解决这些问题。通过使用机器学习模型,如 GPT (Generative Pretrained Transformer),我们可以自动审查代码,找出潜在的问题,提高代码审查的效率准确性。此外,自动化代码审查可以减轻开发人员的负担,有更多的时间专注于其他重要的任务。

本文是实现了github的cr流程,gitlabci同理

参考资料

流程图

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,发送请求就可以了

platform.deepseek.com/

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,不断循环

相关推荐
开心小老虎2 小时前
threeJs实现裸眼3D小狗
前端·3d·threejs
龙井>_<3 小时前
vue3使用keep-alive缓存组件与踩坑日记
前端·vue.js·缓存
彭铖洋3 小时前
VSCode会击败Cursor和Windsurf吗?
javascript·reactjs
Captaincc3 小时前
OpenAI以API的形式发布了三 个新模型:GPT-4.1、GPT-4.1 mini 和 GPT-4.1 nano
前端·openai
HelloRevit4 小时前
Next.js 快速启动模板
开发语言·javascript·ecmascript
A-Kamen5 小时前
Webpack vs Vite:深度对比与实战示例,如何选择最佳构建工具?
前端·webpack·node.js
codingandsleeping5 小时前
OPTIONS 预检请求
前端·网络协议·浏览器
程序饲养员6 小时前
ReactRouter7.5: NavLink 和 Link 的区别是什么?
前端·javascript·react.js
小小小小宇7 小时前
CSS 层叠上下文总结
前端
拉不动的猪7 小时前
设计模式之------命令模式
前端·javascript·面试