背景
随着 AI 越来越火,在很多方面提高了开发效率,比如智能填充代码、AI 生成单测、AI 进行 Code review 等,本期讲解下在 Github/GitLab 提交 PR 时,使用 chatGPT 等大模型对提交的代码变动进行 Code Review,最终以将建议提交到 PR 中评论中。
实现效果如下:
前置要求
- 足够的 token:OpenAI 或者其他大模型都可以;
- n8n:实现一个工作流,可用云服务或者自建;
- GitHub/GitLab:一个可测试的项目;
- ngrok:自建 n8n 内网穿透用;
n8n 本地部署
Docker 安装
按照官网的流程执行,由于国内从 Docker Hub 镜像会失败,这里直接找一个 Docker 同步的网站下载 n8n 的镜像
$ docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/n8n-io/n8n:1.59.4
$ docker volume create n8n_data
$ docker run -it --name n8n -p 5678:5678 \
-e GENERIC_TIMEZONE=Asia/Shanghai \
-e TZ=Asia/Shanghai \
-v n8n_data:/home/node/.n8n \
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/n8n-io/n8n:1.59.4
启动成功后按指引打开 http://localhost:5678 然后注册登陆。
workflow 配置
成功登陆后,创建一个新的 workflow,导入以下配置
GitHub: gist.github.com/JeaNile/0ee…
GitLab: gist.github.com/JeaNile/978…
配置需要调整的点:
- GitHub/Gitlab 的 token
- LLM 的 key
后续从流程配置上详细讲解。
ngrok 内网穿透
由于后续的 webhook 需要能访问的公网,这里直接用 ngrok,按照官网操作,将应用下载后执行以下命令
# 解压下载的ngrok文件到本地bin目录,以便在系统任何位置都可以运行ngrok
sudo unzip ~/Downloads/ngrok-v3-stable-darwin-amd64.zip -d /usr/local/bin
# 查看版本
ngrok -v
# 为ngrok添加认证令牌,自行替换成自己的 token
ngrok config add-authtoken <YOU_TOKEN>
# 禁用HTTP代理
set http_proxy=false
# 将n8n的暴露到公网上
ngrok http http://localhost:5678
启动成功后,会显示如下信息,Forwarding 中的提供了一个公网,点击这个链接,能够能访问到 n8n 的页面就说明转发成功了
❤️ ngrok? We're hiring https://ngrok.com/careers
Session Status online
Account ** (Plan: Free)
Version 3.18.2
Region Japan (jp)
Web Interface http://127.0.0.1:4040
Forwarding https://505d-61-141-167-205.ngrok-free.app -> http://localhost:5678
Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00
n8n 流程配置
关于每一步的流程在最后详细讲解
git webhook
首先第一步就是将 n8n 提供的 webhook URL 配置到 GitHub/Gitlab 上,由于这里是自建所以复制 URL 后需要替换成 ngrok 提供的公网域名,也就是最终域名如下:
https://505d-61-141-167-205.ngrok-free.app/webhook-test/4b8de672-fbc8-41c9-a4b4-a218579206cc
GitHub
GitLab
git token
GitHub
到个人设置创建一个提供 n8n 调用评论的 token
Setting -> Developer Settings -> Personal access tokens -> Tokens (classic) -> Generate new token (classic)直达
同时配置权限,这里 discussion 一定要选上,不然可能没权限 GitHub 会报 404,并不会给到实际错误。
创建成功的后会出现对应 ghp_ 开头的 token,直接复制保存好。
ghp_xxxxxxx
将「Get Changes」和「Post Discussions」 里 token value 替换成对自己的 token ,注意保留前面的 token
Gitlab
和 GitHub 一样,不过不需要保留 token
LLM key
由于 OpenAI 充值比较麻烦,这里直接用国产大模型,目前国产还是挺多注册送大量 token,这里使用「智谱」。
这里替换 URL 使用智谱的 API,同时填入对应模型,居然看官方文档:智谱AI开放平台
填写 API KEY
n8n 执行效果
节点解释
当前存在的问题
费用问题
目前各平台的模型价格对比:国内外 AI 大语言模型 API 价格对比 | AI 排行榜官网 - AIGCRank.cn
OpenAI:
- 当前已使用:Site Unreachable
- Token 费用计算:Site Unreachable
需要根据项目每天的 PR 和代码量评估费用,有同事测试了提交 50 次,PR 改动大概百行,只使用了 1,看起来价格是可接受范围。
rate-limits
每个平台都存在请求速率限制的情况,并且按用户等级划分,比如 OpenAI 的免费用户只能每分钟请求 3 次,而 PR 是按改动文件划分,因此如果超过三个文件则会被限制。
解决方法:
- 提升用户等级;
- 限流后使用指数退避的形式。
代码安全问题
提交给 AI 平台的代一般是 PR 中的 Diff 代码,不涉及文件内的完整代码,理论上是可接受的,如果无法接受任何代码暴漏,那么可以自行部署大模型。