使用AI(ChatGPT)對PR進行自動化 Code Reivew

圖片

趁著假日,今天來談談『使用AI(ChatGPT)對PR進行code reivew』這個話題。

這次我們談的code review,是指…
開發人員針對feature branch要merge回主線(master)前,所發出的PR(Pull-Request),在該PR中,常常會指定團隊中特定的資深開發人員(或Leader),針對修改的部分(就是PR所關聯的change內容,也就是feature branch中的commit)所進行的code review。

過去,這一段基本都採人工在送出PR之後進行的,請看底下這個GitHub Flow的圖:
圖片
一般來說,這個code review動作發生在上面框出的這一段。

後面那隻松鼠是什麼呢?
這邊是指PR-CI,也就是PR所觸發的CI Pipeline,一般而言,我們會在這個Pipeline當中,針對差異部分(這次PR修改的部分)做靜態程式碼掃描(code analysis)、單元測試(UT)…等動作,這個動作和上面框出的code review,往往會同步(甚至提前)進行。

如此一來,人工code reivew的時候,如果發現PR-CI的build沒過(或是UT沒過),那根本不用繼續 review 了,直接退回重改即可。

而現在我想談的『使用AI(ChatGPT)對PR進行code reivew』這個部分,就是採用ChatGPT(嚴格來說是Azure Open AI API)對於PR中差異部分的(這次PR修改的部分)進行自動化code review

如何觸發自動化code review

由於ChatGPT的出現,我們可以透過AI對程式碼進行code review,而在Azure DevOps當中,只需要加入一個套件即可,該套件位於:
https://marketplace.visualstudio.com/items?itemName=tw-developer.GPTPRReviewer
圖片

是一個免費套件。(但當然你OpenAI API呼叫多了是要錢的)

自動化code review,主要是針對PR中修改的部分,而非所有的程式碼,這很合理,否則每次CI Pipeline就會跑亂久了。針對差異掃描,並且頻繁簽入,才是正解。

也因此,你必須先具備底下條件:

  1. 設計一個在PR進行時,會被觸發的Pipeline,一般我們稱為PR CI或PR Pipeline。
  2. 在上述Pipeline中加入前述task,並進行設定。
  3. 針對主線(或特定分支)開一個分支,進行一些修改(change, commit, push),建立PR單,準備合併到主線(或特定分支)。

好,有了概念之後,我們在來看如何實現。

如何實現自動化code review

首先,我們必須設計一個PR CI Pipeline,我們後面的展示採用的是 asp.net 6 的範例程式碼,因此,這條Pipeline基本上就是一個很標準的 asp.net core 的建置範本。唯一的差別是,加上了一個 GPT PR Reviewer的task(這個task名稱為『Review PR by GPT』,在你安裝了套件之後就可以找到):
圖片

上圖中有幾個地方需要注意,套件可以採用原生的OpenAI API或是Azure上的OpenAI API,兩者的key有所不同,此外,你也必須在上圖B的部分,選擇是兩者中的哪一個。而如果你選擇的是Azure上的OpenAI API,則還必須填寫上圖C的部分,該endpoint會跟你建立出的Azure OpenAI API端點與模型名稱有所關連,你必須用你的端點和模型名稱替代。

請注意,目前該套件僅支援 GPT 3.5 turbo 這套模型,因此你必須在 Azure OpenAI API上佈署GPT 3.5 turbo 這套模型

最後,D的部分選擇中文即可。這會讓AI當你自動寫的comment出現中文。(否則是英文)

Pipeline 設計好之後,你必須把該 Pipeline 配置成PR觸發,也就是,有任何PR準備合併回主線(master)時,觸發該Pipeline,這一個部份我們先前的文章有介紹過,請參考:
Azure DevOps in Action - 實現PR觸發的CI自動化建置

好了,這樣已經滿足了前面說到的1-3的條件中的1,2,接著,只剩下實際開一個PR試試看了。

但別急,這個套件還有一些設定必須做。

主要是,為了讓套件能夠針對PR單寫入comment,你必須針對repo設定build service的contribute to pr權限。作法如下:

此外,你還必須針對Pipeline的agent job設定 “Allow scripts to access the OAuth token”:

上述兩個動作都是為了讓 pipeline(build service)有權限對PR寫入comment。

好囉,大功告成。

嘗試運行PR

接著,我們針對master建立分支,針對分支上的程式碼進行修改,改完之後建立PR單準備合併回主線(記得PR單上你要選擇reviewer,才能看到AI自動加入的comment),你會發現,AI(ChatGPT)真的在PR-CI Pipeline中,掃描了所有差異,並且自動把core review結果加入comment:

從上面的影片中你可以看到,GPT給的Comment不算太差,比起 code analysis 工具來說算是有過之而無不及,這一個自動化 code review,可以在人工進行前,針對通用的情境給一個baseline,大幅減少code review的時間成本,也能讓個開發流程的自動化比例更為提高,讓人工可以專注在更有價值的事情上。

後記:
把這篇文章丟給 ChatGPT 去檢查錯字,ChatGPT居然說 : 『「自動化code review」這個詞語有誤,正確應為「自動化程式碼檢查」或「自動化程式碼分析」,因為該文章中提到的 ChatGPT 只能針對程式碼做出建議和意見,並不能真正取代人工的 Code Review。另外,該文章中圖片中的「reivew」也有拼字錯誤,正確應為「review」。』很好,AI你說的對,我錯。但我不想改,怎樣?

留言

這個網誌中的熱門文章

使用 Airtable 在小型需求上取代傳統資料庫

在POC或迷你專案中使用 LiteDB

專業的價值...

精彩(且驚人)的Semantic Kernel入門範例

周末讀書會 - 一如既往