DEV Community

Cover image for CodiumAI PR-Agent,在 Gitea 上用 AI 來 Code Review
Let's Write
Let's Write

Posted on • Originally published at letswrite.tw

CodiumAI PR-Agent,在 Gitea 上用 AI 來 Code Review

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,實現以下自動化流程:

  1. 自動審查:當開發者建立或更新 PR 時,自動觸發 AI 進行分析。
  2. 自動描述:AI 自動生成 PR 的摘要修改點,減少工程師撰寫文件的時間。
  3. 品質建議:提供程式碼改進建議、偵測潛在 Bug。
  4. 繁體中文友善:設定 AI 以繁體中文回應,好吸收好閱讀。

Docker 安裝 Gitea

架設 Gitea 伺服器,可以參考前一篇 Gitea 的文章,就邊就不重覆寫:

Docker 安裝 Gitea

本文假設我們已經有一個運行中的 Gitea,並且擁有管理員權限。


取得需要的 Token 與 Webhook Secret

在部署 CodiumAI PR-Agent 前,我們需要先準備好 Gitea 的 Token 與 OpenAI API Key。

取得 Gitea Personal Access Token

Token 是為了讓 PR-Agent 可以讀取專案,並進行留言。

  1. 登入 Gitea 伺服器。
  2. 點擊右上角頭像,進入「設定」。
  3. 選擇左側選單的「應用程式」。
  4. 在「管理存取權杖」區塊中,點擊「生成新權杖」。
  5. 填寫權杖名稱(例如:pr-agent)。
  6. 權限設定(重要):請務必勾選以下權限:
  • issue:讀取和寫入
  • repository:讀取和寫入
  1. 點擊「產生 Token」並 立即複製(離開頁面後將無法再次查看)。

Gitea 使用者設定頁面中生成應用程式存取權杖 (Token) 的權限勾選畫面

生成 Webhook Secret

為了確保安全性,我們需要設定一個 Secret 來驗證 Webhook 請求。

產生 Secret 的方式有二種。

  1. 在終端機使用 openssl 產生一組高強度的隨機字串:
openssl rand -base64 24
Enter fullscreen mode Exit fullscreen mode
  1. 直接跟 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

Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

內容說明:

  • 模型選擇 (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
Enter fullscreen mode Exit fullscreen mode

Container 上看到有 pr-agent,代表啟動成功。


實際執行 Code Review

設定 Gitea Repository Webhook

最後一步,我們要告訴 Gitea 當有 PR 發生時,要把資料送給誰。

  1. 進入要進行 Code Review 的專案,點擊「設定」 > 「Webhook」 > 「新增 Webhook」 > 「Gitea」。
  2. Webhook 填寫以下資訊:
  • 目標 URLhttp://<我們的_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)
  1. 點擊「新增 Webhook」。

在 Gitea 儲存庫設定中新增 Webhook 的詳細參數填寫範例

驗證成果

我們可以建一個小專案,故意寫錯出幾個 bug,然後發一個 Pull Request。

等待約 10~30 秒,我們會看到:

  1. AI 自動留言 (Describe):AI 會摘要這個 PR 做了什麼改動。
  2. AI 自動審查 (Review):AI 會列出「主要變更」、「潛在問題」以及「改進建議」。

CodiumAI PR-Agent 在 Gitea Pull Request 頁面自動產生的繁體中文審查報告與摘要

進階:手動觸發指令

除了 PR 時自動觸發,我也可以在 PR 的留言區輸入指令與 AI 互動:

  • /describe:重新生成 PR 描述。
  • /review:重新執行程式碼審查。
  • /ask "這段改動有 SQL Injection 風險嗎?":針對特定問題詢問 AI。

總結

透過 PR-Agent 與 Gitea 的整合,我們可以用極低的成本搭建 Code Review 功能。

雖然 AI 無法 100% 取代人工,但它能幫忙過濾低級錯誤、自動撰寫文件,讓攻城獅能將精力集中在怎麼攻城(欸這什麼結論)。

Top comments (0)