輕鬆連線 ChatGPT實現程式碼審查

PetterLiu發表於2024-10-13

image

人工智慧時代已經來臨。從事 IT 工作的每個人都已經熟悉了我們開發的 “新摯友”--人工智慧。

概念

您希望每個拉取/合併請求都先由 ChatGPT-4 檢查,然後再由您檢查嗎?
你想在同事看到程式碼修改之前就得到即時反饋嗎?
想不想檢測出誰洩露了機密資料或 API 金鑰,並能標記 “罪魁禍首 ”以便立即糾正?
我們非常清楚,GPT 可以很好地生成程式碼。......但事實證明,它也能同樣順利地審查程式碼!下面將向大家展示實際操作過程(為避免顯示過多,部分程式碼採用了模糊處理)。

準備工作
  1. Gitlab平臺:確保已經搭建好Gitlab平臺,並且擁有管理員許可權。
  2. ChatGPT賬號:註冊並獲取OpenAI API的訪問金鑰,這是與ChatGPT進行互動的必需憑證。
  3. 開發環境:搭建一個能夠處理Web請求的開發環境,用於接收Gitlab的Webhook通知,並呼叫ChatGPT API進行程式碼審查。

步驟一

建立了一個測試合併請求,並在其中新增了一個格式略有損壞的 JSON 檔案和明文密碼,從而再現了一個安全漏洞:

image

我們可以看到,人工智慧不僅檢測到了敏感資訊,還將其遮蔽在評論中,並標記我將其刪除。

這裡還有另一條評論:

image

與 GitLeaks 等使用 regex 和萬用字元靜態執行簡單搜尋的工具相比,它的分析功能要強大得多。

步驟二

來自前端合併請求的示例(同事的截圖),僅突出某些要點:

image

GPT-4o 模型顯示了對 React 的充分了解。每個人都知道這個設計的關鍵,但他們總是忘記。

或者說,在這裡,我就像讀了一本書:

image

我以舉出很多例子,但關鍵是它的建議是有意義的!當然,並不是所有的意見都值得關注,但很大一部分是非常寶貴的。

實施

將介紹如何在短短一小時內用 Python 程式設計實現自動稽核流程。這段程式碼應立即新增到 CI/CD 流程中,以實現最大效果和流程自動化。將其封裝到一個 CI/CD 作業中並在每個 MR/PR 上執行(只需將來自 renovate/dependabot 的更改作為例外情況)是再好不過的了。將與您分享帶有架構模組的想法,讓您像建構函式一樣將其拼湊起來。

在 GitLab 的 CI/CD pipeline 中,編寫一個指令碼,它能夠:

  • 獲取 Merge Request 中的程式碼差異(diff)或者變更檔案。
  • 將程式碼傳送到 ChatGPT 進行分析。
  • 獲取 ChatGPT 的反饋,並將其以審查評論的形式提交到合併請求中。

示例流程

# .gitlab-ci.yml
stages:
- code_review

code_review:
stage: code_review
script:
# 1. 獲取程式碼變更
- git diff HEAD~1 HEAD > changes.diff
# 2. 使用 Python 呼叫 OpenAI API 傳送程式碼進行審查
- python3 scripts/chatgpt_review.py changes.diff
# 3. 將 ChatGPT 的反饋新增為 MR 評論
only:
- merge_requests

讓我們開始工作,用 Python 編寫程式碼:

第一步:連線人工智慧模型

我們需要連線到人工智慧模型:

import openai

示例Python指令碼

import os
import openai

# 設定 API 金鑰
openai.api_key = os.getenv("OPENAI_API_KEY")

def get_code_diff(file_path):
with open(file_path, 'r') as file:
return file.read()

def get_chatgpt_review(code_diff):
response = openai.Completion.create(
engine="gpt-4", # 使用 GPT-4 模型
prompt=f"Review the following code changes:\n\n{code_diff}",
max_tokens=500,
temperature=0.5
)
return response.choices[0].text.strip()

def main():
# 獲取程式碼變更
code_diff = get_code_diff("changes.diff")

# 請求 ChatGPT 進行程式碼審查
review = get_chatgpt_review(code_diff)

# 輸出審查反饋,後續可以透過 GitLab API 新增到 MR 評論中
print(review)

if __name__ == "__main__":
main()

是 OpenAI 的 GPT-4o。但我推薦 Azure OpenAI

from openai import AzureOpenAI

如果是第一次,請向 GPT 詢問如何操作。

第二步:程式碼更改和註釋

獲取程式碼變更和對這些變更的註釋。我們使用的是 GitLab,因此將立即提供端點作為示例:

使用 MR 變更 API 獲取程式碼變更: /api/v4/projects/{gitlab_project_id}/merge_requests/{gitlab_request_id}/changes?access_raw_diffs=true
使用 MR Notes API 發表評論: /api/v4/projects/{gitlab_project_id}/merge_requests/{gitlab_request_id}/notes?order_by=created_at&sort=asc
其中:

gitlab_request_id = os.getenv("CI_MERGE_REQUEST_IID")

gitlab_project_id = os.getenv("CI_PROJECT_ID")

為美觀起見,需要對 GitLab 的 JSON 響應進行解析。

第三步:傳送程式碼供人工智慧審查


不要忘了在開頭新增一個提示,說明要做什麼,並將所有內容放入一個請求中:

review_request=f"{prompt}\n\n{notes}\n\n{changes}"

在提示中,您需要禮貌地要求人工智慧根據標準分析您的程式碼更改--類似這樣(與我們使用的相比,這是一個非常簡化的版本):

“As a Developer, I want to ask you to perform a GitLab Merge Request review.
Consider previous comments noted below and avoid repeating similar recommendations.
If you spot a recurring issue, skip it.

For security issues or sensitive information leaks, mention the assignee's username with @.

Make your feedback clear, concise, and actionable, with specific improvement recommendations.

Review the code snippet below based on these criteria:

  • Syntax and Style: Look for syntax errors and deviations from conventions.
  • Performance Optimization: Suggest changes to improve efficiency.
  • Security Practices: Check for vulnerabilities and hard-coded secrets (mask half the info).
  • Error Handling: Identify unhandled exceptions or errors.
  • Code Quality: Look for code smells, unnecessary complexity, or redundant code.
  • Bug Detection: Find potential bugs or logical errors.”

步驟 4:將回復作為評論釋出


只需將收到的回覆作為評論釋出即可。

為此建立一個名為 AI MR review 的 GitLab PAT 令牌,並直接 POST 到 MR notes API: /api/v4/projects/{gitlab_project_id}/merge_requests/{gitlab_request_id}/notes

在獲取 ChatGPT 的反饋後,使用 GitLab 的 API 將這些反饋作為合併請求的評論提交。

示例提交評論的請求:

curl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--data "body=ChatGPT review feedback: $review" \
--url
https://gitlab.example.com/api/v4/projects/:id/merge_requests/:mr_iid/notes


最佳化和擴充套件
  1. 自定義ChatGPT模型:如果可能的話,可以使用自定義的ChatGPT模型來進行程式碼審查。這可以透過微調預訓練的ChatGPT模型來實現,使其更加適合特定專案的程式碼審查需求。
  2. 增加審查規則:除了ChatGPT生成的評論和建議外,還可以增加一些自定義的審查規則。例如,可以檢查程式碼是否符合特定的編碼規範、是否存在常見的安全漏洞等。
  3. 最佳化效能:隨著專案的不斷髮展和程式碼量的增加,程式碼審查機器人的效能可能會成為瓶頸。因此,需要不斷最佳化程式碼審查機器人的效能,以提高其處理速度和準確性。


結論

優勢

實施此解決方案將為以下方面帶來改進

DevSecOps: 大幅提高安全性
高階+級別: 現在,查詢 MR/PR 中的錯誤和不足無需通讀程式碼即可完成,人工智慧將為您代勞。
開發/質量保證:您將立即獲得令人驚喜的有用評論和建議。
業務: 在輸出時獲得更好的程式碼。

缺點

成本: 難以預測;這完全取決於您計劃提交多少審查意見以及由哪個模型進行審查。

風險

持續改進: 改進這種工具的想法可能無窮無盡;更多的內容並不總是意味著更好的稽核。迭代測試更改需要一些時間。
“改進": 可能會變得更懶=),但懶惰是進步的動力,不是嗎?

前景

想象一下機會:這將是你的指令碼,因此你可以,例如:

從 Jira 新增任務上下文
為 PM 建立摘要
編寫釋出說明/釋出變更
搜尋漏洞

透過以上步驟,就可以將ChatGPT整合到Gitlab的Merge Request中,實現自動程式碼審查。這將大大提高程式碼審查的效率和準確性,同時減輕開發者的負擔。讓我們把程式碼寫得更好,讓生活變得更輕鬆。歡迎來到人工智慧時代,親愛的同事們!



今天先到這兒,希望對雲原生,技術領導力, 企業管理,系統架構設計與評估,團隊管理, 專案管理, 產品管理,資訊保安,團隊建設 有參考作用 , 您可能感興趣的文章:
構建創業公司突擊小團隊
國際化環境下系統架構演化
微服務架構設計
影片直播平臺的系統架構演化
微服務與Docker介紹
Docker與CI持續整合/CD
網際網路電商購物車架構演變案例
網際網路業務場景下訊息佇列架構
網際網路高效研發團隊管理演進之一
訊息系統架構設計演進
網際網路電商搜尋架構演化之一
企業資訊化與軟體工程的迷思
企業專案化管理介紹
軟體專案成功之要素
人際溝通風格介紹一
精益IT組織與分享式領導
學習型組織與企業
企業創新文化與等級觀念
組織目標與個人目標
初創公司人才招聘與管理
人才公司環境與企業文化
企業文化、團隊文化與知識共享
高效能的團隊建設
專案管理溝通計劃
構建高效的研發與自動化運維
某大型電商雲平臺實踐
網際網路資料庫架構設計思路
IT基礎架構規劃方案一(網路系統規劃)
餐飲行業解決方案之客戶分析流程
餐飲行業解決方案之採購戰略制定與實施流程
餐飲行業解決方案之業務設計流程
供應鏈需求調研CheckList
企業應用之效能實時度量系統演變

如有想了解更多軟體設計與架構, 系統IT,企業資訊化, 團隊管理 資訊,請關注我的微信訂閱號:

image_thumb2_thumb_thumb_thumb_thumb[1]

作者:Petter Liu
出處:http://www.cnblogs.com/wintersun/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。 該文章也同時釋出在我的獨立部落格中-Petter Liu Blog。

相關文章