CodiumAI PR-Agent,在 Gitea 上用 AI 來 Code Review
本篇要解決的問題
之前有寫過一篇:〈使用 Gitea Actions 與 OpenAI 實現自動化 PR Code Review〉。
底下有人留言說,Gitea 還有其他 Code Review 的方式,研究了以後發現,哎哎哎,這不就是 CodiumAI 的 PR-Agent 嗎?之前寫過在 GitHub、GitLab 上使用的,沒想到 Gitea 也有:
再加上本篇,本站對於 CodiumAI PR-Agent Code Review 這塊就湊滿 Git 三神獸了,看能不能解開什麼封印之門(咦?)
CodiumAI PR-Agent 是一個開源的 AI 工具,能夠自動分析 Pull Request 的變更內容。
本篇將用 Docker 來部署並整合到用 Docker 自架的 Gitea,實現以下自動化流程:
- 自動審查:當開發者建立或更新 PR 時,自動觸發 AI 進行分析。
- 自動描述:AI 自動生成 PR 的摘要修改點,減少工程師撰寫文件的時間。
- 品質建議:提供程式碼改進建議、偵測潛在 Bug。
- 繁體中文友善:設定 AI 以繁體中文回應,好吸收好閱讀。
Docker 安裝 Gitea
架設 Gitea 伺服器,可以參考前一篇 Gitea 的文章,就邊就不重覆寫:
本文假設我們已經有一個運行中的 Gitea,並且擁有管理員權限。
取得需要的 Token 與 Webhook Secret
在部署 CodiumAI PR-Agent 前,我們需要先準備好 Gitea 的 Token 與 OpenAI API Key。
取得 Gitea Personal Access Token
Token 是為了讓 PR-Agent 可以讀取專案,並進行留言。
- 登入 Gitea 伺服器。
- 點擊右上角頭像,進入「設定」。
- 選擇左側選單的「應用程式」。
- 在「管理存取權杖」區塊中,點擊「生成新權杖」。
- 填寫權杖名稱(例如:
pr-agent)。 - 權限設定(重要):請務必勾選以下權限:
-
issue:讀取和寫入 -
repository:讀取和寫入
- 點擊「產生 Token」並 立即複製(離開頁面後將無法再次查看)。
生成 Webhook Secret
為了確保安全性,我們需要設定一個 Secret 來驗證 Webhook 請求。
產生 Secret 的方式有二種。
- 在終端機使用
openssl產生一組高強度的隨機字串:
openssl rand -base64 24
- 直接跟 AI 要一組,比方在 ChatGPT 或 Gemini 上,輸入:提供我一組 16 碼金鑰。
產生的 Secret 要記下來,之後會填到設定檔中。
準備 OpenAI API Key
前往 OpenAI Platform 建立一組 API Key。
建立 Key,必須要先存一筆金額才能使用。
這功能是要 $$ 的,記得選用 CP 高的模型,才不會幾次 Code Review 下來,荷包大失血。
Docker Compose 與環境變數設定
.env
建立一個專案用資料夾,取名「pr-agent-gitea」。
資料夾裡新增 .env 的檔案,把敏感的資料,如我們前二步取得的 Token,都寫進去,方便管理與保密。
複製貼上以下到 .env:
# ==================== Gitea 連線設定 ====================
# 若 Gitea 在另一台主機,請填寫該主機的固定 IP 或網域
GITEA_URL=http://192.168.xx.xx:3000
GITEA_TOKEN=在此貼上在 Gitea 取得的Token
GITEA_WEBHOOK_SECRET=在此貼上 Secret
# ==================== LLM 模型設定 ====================
OPENAI_KEY=在此貼上 Openai 的 Key
docker-compose.yml
專案裡新增一個 docker-compose.yml 檔,複製貼上以下內容:
services:
pr-agent:
image: codiumai/pr-agent:0.31-gitea_app
container_name: pr-agent
restart: unless-stopped
env_file:
- .env
environment:
# ==================== Gitea 連線設定 ====================
CONFIG__GIT_PROVIDER: "gitea"
GITEA__URL: ${GITEA_URL}
GITEA__PERSONAL_ACCESS_TOKEN: ${GITEA_TOKEN}
GITEA__WEBHOOK_SECRET: ${GITEA_WEBHOOK_SECRET}
GITEA__SKIP_SSL_VERIFICATION: "false"
# ==================== OpenAI 模型設定 ====================
CONFIG__MODEL: "gpt-4.1-mini"
OPENAI__KEY: ${OPENAI_KEY}
# ==================== PR 觸發設定 ====================
# 設定自動執行的指令:描述 (/describe) 與 審查 (/review)
GITEA__PR_COMMANDS: '["/describe", "/review"]'
# 設定觸發動作:開啟 PR 或 同步更新代碼時
GITEA__HANDLE_PR_ACTIONS: '["opened", "synchronize"]'
# ==================== 語言與輸出設定 ====================
CONFIG__RESPONSE_LANGUAGE: "zh-TW"
CONFIG__PUBLISH_OUTPUT: "true"
CONFIG__PUBLISH_OUTPUT_PROGRESS: "false"
# ==================== 留言行為設定 ====================
# 強制使用新留言模式 (false),不覆蓋舊留言,保留審查歷史
PR_DESCRIPTION__PERSISTENT_COMMENT: "false"
PR_REVIEW__PERSISTENT_COMMENT: "false"
# 關閉行內程式碼註解 (依喜好開啟)
PR_REVIEW__INLINE_CODE_COMMENTS: "false"
# ==================== 功能開關設定 ====================
# 簡化輸出,關閉額外的分類標籤
PR_DESCRIPTION__ENABLE_SEMANTIC_FILES_TYPES: "false"
PR_REVIEW__ENABLE_REVIEW_LABELS_EFFORT: "false"
PR_REVIEW__ENABLE_REVIEW_LABELS_SECURITY: "false"
GITEA__PUBLISH_LABELS: "false"
# ==================== 檔案忽略清單 (Cost Saving) ====================
# 忽略鎖定檔、靜態資源等不需要分析的檔案,大幅節省 Token 費用
CONFIG__IGNORE__GLOB: "['dist/**', 'build/**', 'out/**', '.next/**', 'coverage/**', 'node_modules/**', 'package-lock.json', 'pnpm-lock.yaml', 'yarn.lock', '*.md', '*.txt', '*.log', '*.min.js', '*.min.css', '*.map', '*.svg', '*.png', '*.jpg', '*.jpeg', '*.gif', '*.ico', '*.woff', '*.woff2', '*.ttf', '*.eot', '.env*', '.gitignore', '.eslintrc*', '.prettierrc*', 'tsconfig.json', 'jest.config.*', 'vite.config.*', 'webpack.config.*', '*.spec.ts', '*.spec.js', '*.test.ts', '*.test.js']"
ports:
- "3001:3000"
內容說明:
-
模型選擇 (
CONFIG__MODEL):使用gpt-4.1-mini,這是 CP 值高的選擇。 -
語言設定 (
CONFIG__RESPONSE_LANGUAGE):指定zh-TW,讓 AI 輸出時用正體中文。 -
忽略清單 (
CONFIG__IGNORE__GLOB):如果想省 $$,這點很重要!要排除node_modules、圖片檔、lock 檔等,避免 AI 浪費 Token 去讀取這些非程式碼檔案。 - ports:這邊指定 3001,主要是 Gitea 預設是 3000,如果 PR-Agent 一樣用 3000 會啟動失敗,因此改用 3001。
docker-compose.yml 檔完成後,專案內開啟終端機,執行:
docker-compose up -d
Container 上看到有 pr-agent,代表啟動成功。
實際執行 Code Review
設定 Gitea Repository Webhook
最後一步,我們要告訴 Gitea 當有 PR 發生時,要把資料送給誰。
- 進入要進行 Code Review 的專案,點擊「設定」 > 「Webhook」 > 「新增 Webhook」 > 「Gitea」。
- Webhook 填寫以下資訊:
-
目標 URL:
http://<我們的_PR_AGENT_IP>:3001/api/v1/gitea_webhooks - HTTP 方法:POST
- POST Content Type:application/json
-
密鑰:填入
.env中的GITEA_WEBHOOK_SECRET。 - 觸發條件:選取「自訂事件」,建議勾選:
- 問題留言(Issue Comment)
- 合併請求(Pull Request)
- 合併請求留言(Pull Request Comment)
- 合併請求同步(Pull Request Synchronize)
- 點擊「新增 Webhook」。
驗證成果
我們可以建一個小專案,故意寫錯出幾個 bug,然後發一個 Pull Request。
等待約 10~30 秒,我們會看到:
- AI 自動留言 (Describe):AI 會摘要這個 PR 做了什麼改動。
- AI 自動審查 (Review):AI 會列出「主要變更」、「潛在問題」以及「改進建議」。
進階:手動觸發指令
除了 PR 時自動觸發,我也可以在 PR 的留言區輸入指令與 AI 互動:
-
/describe:重新生成 PR 描述。 -
/review:重新執行程式碼審查。 -
/ask "這段改動有 SQL Injection 風險嗎?":針對特定問題詢問 AI。
總結
透過 PR-Agent 與 Gitea 的整合,我們可以用極低的成本搭建 Code Review 功能。
雖然 AI 無法 100% 取代人工,但它能幫忙過濾低級錯誤、自動撰寫文件,讓攻城獅能將精力集中在怎麼攻城(欸這什麼結論)。



Top comments (0)