本文來自:
尹學(xué)峰 極狐(GitLab)高級解決方案架構(gòu)師
自從 ChatGPT 閃亮登場以來,各種基于它的軟件擴展紛至沓來。愛折騰的極狐GitLab 開發(fā)者們,也花式玩轉(zhuǎn)起了 ChatGPT + 極狐GitLab,讓研發(fā)工作更高效。
今天,我們來看看如何讓?ChatGPT 進行自動化的 MR 變更評審,Enjoy~
一、原理說明
如上圖所示:
1.?當(dāng)極狐GitLab 有代碼變更時(創(chuàng)建 MR),通過 webhook 發(fā)送事件消息到 ai-code-review App;
2.?當(dāng) ai-code-review App 收到消息后,發(fā)送 Review Reqeust 到 ChatGPT(調(diào)用 ChatGPT 的 API);
3.?ChatGPT 將 Code Review 結(jié)果以 Review Response 形式返回;
4.?ai-code-review 收到 Review Response 后,將內(nèi)容(Review Comment)發(fā)送到極狐GitLab 的 MR 中。
二、快速上手指南
1. ai-code-review環(huán)境
即上圖中紫色機器,需要滿足基本條件:
- 此機器能夠訪問?
api.openai.com
; - 此機器與極狐GitLab 機器之間網(wǎng)絡(luò)互相可以訪問,或者說彼此可以 ping 通。
1.1 Linux / MacOS / *Unix
1.1.1 Docker 安裝
如已經(jīng)安裝 Docker 可忽略此章節(jié)。
安裝腳本如下:
curl -fsSL https://get.docker.com | bash -s docker
1.1.2 運行程序
使用如下命令。注意,需要修改其中 3 個 Token/License 參數(shù)為實際參數(shù):
-
gitlab_private_token
: GitLab Token,應(yīng)具有 Merge Requst 寫權(quán)限。在生成此 Token 時,建議勾選所有權(quán)限; -
openai_api_key
: 需在?OpenAI API Keys?自行申請; -
acr_license
:?test
?即可。
docker run -itd -p 8888:8888 \
--restart=always \
--name ai-code-review \
-e gitlab_private_token="<你的GitLab Token>" \
-e language="Chinese" \
-e openai_api_key="<你的OpenAI Token>" \
-e acr_license="test" \
satomic/ai-code-review:20230321
2. 極狐GitLab Webhook 配置
在極狐GitLab 中,進行 AI code review 的 group 或 project 配置,以 project 為例,建議使用 group 級別的 webhook,這樣 group 內(nèi)的所有項目的 MR 都會被 AI 審查,無需為每個 project 重復(fù)配置,配置方式與 project 相同:
每次合并請求產(chǎn)生及變化時,都會看到發(fā)送記錄 :
3. ChatGPT 評審效果
Review 效果如下,更多可訪問 Public 演示倉庫?AI自動MR評審演示。
三、定義自己的評審機器人
前文中的自動化評審機器人??封裝在 docker 鏡像中 ,其角色聲明為:
{
"role": "system",
"content": "你是是一位資深編程專家,負責(zé)代碼變更的審查工作。需要給出審查建議。在建議的開始需明確對此代碼變更給出「拒絕」或「接受」的決定,并且以格式「變更評分:實際的分數(shù)」給變更打分,分數(shù)區(qū)間為0~100分。然后,以精煉的語言、嚴厲的語氣指出存在的問題。如果你覺得必要的情況下,可直接給出修改后的內(nèi)容。建議中的語句可以使用emoji結(jié)尾。你的反饋內(nèi)容必須使用嚴謹?shù)膍arkdown格式。"
}
所以機器人講話很沒有感情,如果想 “注入感情”?? ,則需要定義自己的評審機器人,比如希望是一個傲嬌少女??來評審,參考如下角色聲明:
{
"role": "system",
"content": "你是一個天才小女孩,精通編程工作,性格很傲嬌又高傲,負責(zé)對前輩的代碼變更進行審查,用后輩的態(tài)度、活潑輕快的方式的指出存在的問題。使用markdown格式??梢园琫moji。"
}
按照這樣的角色聲明,評審的效果是這樣:
????♀?下面,基于如下源碼創(chuàng)造自己的傲嬌評審少女吧~
創(chuàng)建?ai_code_review.py
?文件,內(nèi)容如下:
# coding=utf-8
import gitlab
import openai
class AICodeReview():
def __init__(self,
gitlab_private_token,
project_id,
merge_request_id,
openai_api_key,
gitlab_server_url='https://jihulab.com',
):
self.gl = gitlab.Gitlab(
gitlab_server_url,
private_token=gitlab_private_token,
timeout=300,
api_version='4'
)
print('初始化GitLab連接成功')
# project
self.project_id = project_id
self.project = self.gl.projects.get(project_id)
print('找到project')
# mr
self.merge_request_id = merge_request_id
self.merge_request = self.project.mergerequests.get(merge_request_id)
print('找到mr')
# changes
self.changes = self.merge_request.changes()
# openai
openai.api_key = openai_api_key
# comments
self.review_notes = []
# note
self.note = ''
def ai_code_review(self):
print('開始code review')
for change in self.changes['changes']:
# https://platform.openai.com/docs/guides/chat/introduction
messages = [
{"role": "system",
"content": "你是是一位資深編程專家,負責(zé)代碼變更的審查工作。需要給出審查建議。在建議的開始需明確對此代碼變更給出「拒絕」或「接受」的決定,并且以格式「變更評分:實際的分數(shù)」給變更打分,分數(shù)區(qū)間為0~100分。然后,以精煉的語言、嚴厲的語氣指出存在的問題。如果你覺得必要的情況下,可直接給出修改后的內(nèi)容。建議中的語句可以使用emoji結(jié)尾。你的反饋內(nèi)容必須使用嚴謹?shù)膍arkdown格式。"
},
{"role": "user",
"content": f"請review這部分代碼變更{change}",
},
]
print('思考中...')
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=messages,
)
new_path = change['new_path']
print(f'對 {new_path} review中...')
response_content = response['choices'][0]['message']['content'].replace('\n\n', '\n')
total_tokens = response['usage']['total_tokens']
review_note = f'# `{new_path}`' + '\n\n'
review_note += f'({total_tokens} tokens) {"AI review 意見如下:" }' + '\n\n'
review_note += response_content
self.review_notes.append(review_note)
def comment(self, notice=None):
if notice is None:
review_note = '\n\n---\n\n'.join(self.review_notes)
self.note = {'body': review_note}
self.merge_request.notes.create(self.note)
print('review內(nèi)容', self.note)
print('review完成')
else:
self.note = {'body': notice}
self.merge_request.notes.create(self.note)
print(notice)
核心函數(shù)說明:
-
ai_code_review
: 調(diào)用?openai.ChatCompletion.create()
?方法基于預(yù)設(shè) prompt 角色發(fā)起一次對話,得到評審結(jié)果。 -
comment
: 調(diào)用?.merge_request.notes.create()
?方法追加評審內(nèi)容到 MR 中。
單次評審的使用方式如下,只要傳遞對應(yīng)參數(shù)即可。實際使用中,可以在外層封裝 HTTP Server,接收 MR 創(chuàng)建/更新的 Webhook 推送的 Json 對象,解析內(nèi)容并自動進行?AICodeReview
?對象的實例化及動作。文章來源:http://www.zghlxwxcb.cn/news/detail-450396.html
acr = AICodeReview(
gitlab_server_url=<你的GitLab地址>,
gitlab_private_token=<你的GitLab private_token>,
project_id=<project_id>,
merge_request_id=<merge_request_id>,
openai_api_key=<openai_api_key>,
)
acr.ai_code_review()
acr.comment()
完成了上述內(nèi)容,你就可以讓 ChatGPT 自動來進行 MR 變更評審啦。文章來源地址http://www.zghlxwxcb.cn/news/detail-450396.html
到了這里,關(guān)于玩轉(zhuǎn) ChatGPT+極狐GitLab|自動化的MR 變更評審來了的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!