# 簡介 這是一個 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 問題檔案 # 設計 1. Gitea 的相關參數如果 inputs 沒有定義,則從 ${{ gitea.* }} 取得 2. BASE_URL 如果 inputs 沒有定義,則使用預設值 3. Comment 加上些許 emoji 讓資訊有點活力 4. 盡量將應用程式放在 ./app,修改 entrypoint.sh 與 Dockerfile 讓程式可以正常運行 # 使用說明 1. 在 Gitea 專案中建立 `.gitea/workflows` 資料夾 2. 在 `.gitea/workflows` 資料夾中建立 `ai-review.yaml' 3. 在 `ai-review.yaml` 中填入以下內容(選擇一個使用): ### 1. OpenAI(OpenRouter) ```yaml 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 ```yaml 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 ```yaml 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 ```yaml 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 ```yaml 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 ```yaml 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 ```yaml 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 ```yaml 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 ```yaml 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 ```yaml 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 ```yaml 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 ```