jiantw83 ec1f6c96e7 feat: 階段一 - 改用 Node.js 實作基本流程骨架
- Dockerfile: 改用 node:20-slim
- entrypoint.sh: 執行 app/main.js
- app/package.json: axios + js-yaml + openai
- app/config.js: 環境變數與 LLM 自動偵測(10 種服務)
- app/llm.js: OpenAI-compatible 統一介面
- app/gitea.js: PR diff 取得與 comment 發布
- app/roles.js: 從 prompts/roles/*.yaml 載入角色
- app/main.js: pipeline 骨架,log 每個主要階段
2026-05-11 07:24:47 +00:00
2026-05-07 13:58:22 +00:00

簡介

這是一個 AI Code Review Action。Gitea Workflow 可以使用此 Action 讓 AI 助理根據不同面向分析 Push Request 中變更的內容後,將問題分級 Commnet 到 Push Request 中。

流程(新 Push Request、新 Commit (排除 AI 助理的 Commit) 觸發)

  1. 服務名稱、模型名稱、角色資訊(個性、符合個性的英文名稱、工作內容),Comment 到 Push Request
  2. 每個角色個別分析 Git Diff 的內容產生新問題表格(問題等級、角色名稱、問題位置或行數、修改建議)
  3. 讀取所有未解決的舊問題(問題檔案存在於使用此 Action 的專案固定位置)加上新問題後,去除重複產生本次 Push Request 的問題表格(PR問題表格)覆蓋問題檔案
  4. 從PR問題表格中取出所有舊問題,依照等級排序後 Comment 到 Push Request
  5. 從PR問題表格中取出所有新問題,排除嚴重等級的問題後 Comment 到 Push Request
  6. 從PR問題表格中取出所有新問題,將每個嚴重等級的問題 Comment 到 Push Request
  7. Commit 問題檔案
  8. 如果PR問題表格中有嚴重問題,則不要讓 workflow 執行成功(exit 1)

設計

  1. Gitea 的相關參數如果 inputs 沒有定義,則從 ${{ gitea.* }} 取得
  2. BASE_URL 如果 inputs 沒有定義,則使用預設值
  3. Comment 加上些許 emoji 讓資訊有點活力
  4. 盡量將應用程式放在 ./app,修改 entrypoint.sh 與 Dockerfile 讓程式可以正常運行
  5. 將提示詞放到 ./app/prompts 內供程式讀取

使用說明

  1. 在 Gitea 專案中建立 .gitea/workflows 資料夾
  2. .gitea/workflows 資料夾中建立 `ai-review.yaml'
  3. ai-review.yaml 中填入以下內容(選擇一個使用)

1. OpenAIOpenRouter

name: AI
on:
  pull_request:
    types: [opened, synchronize]
jobs:
  code-review:
    name: 'Code Review'
    runs-on: ubuntu
    steps:
    - name: AI Code Review
      uses: https://gitea.jsc.idv.tw/jiantw83/code-review@${{ vars.ACTION_CODE_REVIEW_VERSION }}
      with:
        OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
        OPENAI_BASE_URL: https://api.openai.com/v1
    permissions:
      contents: write
      pull-requests: write
      issues: write

2. Anthropic Claude

name: AI
on:
  pull_request:
    types: [opened, synchronize]
jobs:
  code-review:
    name: 'Code Review'
    runs-on: ubuntu
    steps:
    - name: AI Code Review
      uses: https://gitea.jsc.idv.tw/jiantw83/code-review@${{ vars.ACTION_CODE_REVIEW_VERSION }}
      with:
        CLAUDE_API_KEY: ${{ secrets.CLAUDE_API_KEY }}
        CLAUDE_BASE_URL: https://api.anthropic.com/v1
    permissions:
      contents: write
      pull-requests: write
      issues: write

3. Google Gemini

name: AI
on:
  pull_request:
    types: [opened, synchronize]
jobs:
  code-review:
    name: 'Code Review'
    runs-on: ubuntu
    steps:
    - name: AI Code Review
      uses: https://gitea.jsc.idv.tw/jiantw83/code-review@${{ vars.ACTION_CODE_REVIEW_VERSION }}
      with:
        GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
        GEMINI_BASE_URL: https://generativelanguage.googleapis.com/v1beta
    permissions:
      contents: write
      pull-requests: write
      issues: write

4. Amazon Q

name: AI
on:
  pull_request:
    types: [opened, synchronize]
jobs:
  code-review:
    name: 'Code Review'
    runs-on: ubuntu
    steps:
    - name: AI Code Review
      uses: https://gitea.jsc.idv.tw/jiantw83/code-review@${{ vars.ACTION_CODE_REVIEW_VERSION }}
      with:
        AMAZONQ_API_KEY: ${{ secrets.AMAZONQ_API_KEY }}
        AMAZONQ_BASE_URL: https://q.api.aws
    permissions:
      contents: write
      pull-requests: write
      issues: write

5. SonarQube

name: AI
on:
  pull_request:
    types: [opened, synchronize]
jobs:
  code-review:
    name: 'Code Review'
    runs-on: ubuntu
    steps:
    - name: AI Code Review
      uses: https://gitea.jsc.idv.tw/jiantw83/code-review@${{ vars.ACTION_CODE_REVIEW_VERSION }}
      with:
        SONARQUBE_TOKEN: ${{ secrets.SONARQUBE_TOKEN }}
        SONARQUBE_URL: https://sonarqube.example.com
    permissions:
      contents: write
      pull-requests: write
      issues: write

6. Kilo Code

name: AI
on:
  pull_request:
    types: [opened, synchronize]
jobs:
  code-review:
    name: 'Code Review'
    runs-on: ubuntu
    steps:
    - name: AI Code Review
      uses: https://gitea.jsc.idv.tw/jiantw83/code-review@${{ vars.ACTION_CODE_REVIEW_VERSION }}
      with:
        KILO_API_KEY: ${{ secrets.KILO_API_KEY }}
        KILO_BASE_URL: https://api.kilocode.com/v1
    permissions:
      contents: write
      pull-requests: write
      issues: write

7. Roo Code

name: AI
on:
  pull_request:
    types: [opened, synchronize]
jobs:
  code-review:
    name: 'Code Review'
    runs-on: ubuntu
    steps:
    - name: AI Code Review
      uses: https://gitea.jsc.idv.tw/jiantw83/code-review@${{ vars.ACTION_CODE_REVIEW_VERSION }}
      with:
        ROO_API_KEY: ${{ secrets.ROO_API_KEY }}
        ROO_BASE_URL: https://api.roocode.com/v1
    permissions:
      contents: write
      pull-requests: write
      issues: write

8. Cline

name: AI
on:
  pull_request:
    types: [opened, synchronize]
jobs:
  code-review:
    name: 'Code Review'
    runs-on: ubuntu
    steps:
    - name: AI Code Review
      uses: https://gitea.jsc.idv.tw/jiantw83/code-review@${{ vars.ACTION_CODE_REVIEW_VERSION }}
      with:
        CLINE_API_KEY: ${{ secrets.CLINE_API_KEY }}
        CLINE_BASE_URL: https://api.cline.dev/v1
    permissions:
      contents: write
      pull-requests: write
      issues: write

9. Continue

name: AI
on:
  pull_request:
    types: [opened, synchronize]
jobs:
  code-review:
    name: 'Code Review'
    runs-on: ubuntu
    steps:
    - name: AI Code Review
      uses: https://gitea.jsc.idv.tw/jiantw83/code-review@${{ vars.ACTION_CODE_REVIEW_VERSION }}
      with:
        CONTINUE_API_KEY: ${{ secrets.CONTINUE_API_KEY }}
        CONTINUE_BASE_URL: https://api.continue.dev/v1
    permissions:
      contents: write
      pull-requests: write
      issues: write

10. Kade

name: AI
on:
  pull_request:
    types: [opened, synchronize]
jobs:
  code-review:
    name: 'Code Review'
    runs-on: ubuntu
    steps:
    - name: AI Code Review
      uses: https://gitea.jsc.idv.tw/jiantw83/code-review@${{ vars.ACTION_CODE_REVIEW_VERSION }}
      with:
        KADE_API_KEY: ${{ secrets.KADE_API_KEY }}
        KADE_BASE_URL: https://api.kade.dev/v1
    permissions:
      contents: write
      pull-requests: write
      issues: write

- Ollama

name: AI
on:
  pull_request:
    types: [opened, synchronize]
jobs:
  code-review:
    name: 'Code Review'
    runs-on: ubuntu
    steps:
    - name: AI Code Review
        uses: https://gitea.jsc.idv.tw/jiantw83/code-review@${{ vars.ACTION_CODE_REVIEW_VERSION }}
        with:
          OLLAMA_BASE_URL: ${{ secrets.OLLAMA_BASE_URL }}
          OLLAMA_MODEL: ${{ secrets.OLLAMA_MODEL }}
    permissions:
      contents: write
      pull-requests: write

      issues: write
S
Description
Languages
JavaScript 99.2%
Dockerfile 0.6%
Shell 0.2%