所有入門單元免費開放 · 課程內容持續更新中

CI 與 AI 自動審查

好幾個 Agent 同時交出成果,你不可能每一份都手動跑測試。這堂課用 GitHub Actions 讓每個 Pull Request 自動跑測試,再加上 Claude 自動審查留言;並說清楚兩者的分工:測試是守門員,AI 審查是幫手,最後按下合併的是你。

第 7.3 堂約 15 分鐘

前兩堂你學會了讓好幾個 Agent 在各自的工作區平行開發。現在換一個新的煩惱:它們一起交出成果時,誰來檢查?

一份一份切換資料夾、手動跑測試、逐行讀修改,很快就會讓你變成整個流程最慢的一環。這堂課要請兩位幫手來分擔:一位是自動跑測試的機器人,一位是會讀程式、留下建議的 AI 審查員。

三道關卡的分工

先看全貌,再一個一個設定:

每個 Pull Request 經過三道關卡:自動測試由 GitHub Actions 執行,沒過就不能合併;AI 審查留言提出建議,給你參考;最後由你讀完修改與建議,決定是否合併。下方示意一個 Pull Request 頁面,測試通過,Claude 留言指出匯出 CSV 時金額有逗號會讓欄位錯位

測試守門、AI 提醒、你做決定。三者的角色不能互換。

CI:每次推送都自動檢查

CI(Continuous Integration,持續整合)的意思是:每次有人推送程式碼,就自動在一台乾淨的電腦上把專案裝起來、跑一遍檢查。

為什麼要「乾淨的電腦」?因為「在我的電腦上可以跑」是最常見的陷阱。也許你裝過某個套件但忘了寫進 requirements.txt,也許 Agent 改了一個只有你電腦上才有的設定。CI 每次都從零開始,這些問題無所遁形。

GitHub 內建的 CI 服務叫 GitHub Actions。你只要在專案裡放一個設定檔,GitHub 就會照著做。

寫第一個 workflow

在專案裡建立 .github/workflows/tests.yml:

name: tests

on:
  push:
    branches: [main]
  pull_request:

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-python@v6
        with:
          python-version: "3.12"
      - run: pip install -r requirements.txt
      - run: pytest

左邊是 workflow 檔案,右邊逐段標註:name 是顯示名稱;on 說明推到 main 或開 Pull Request 時執行;runs-on 表示 GitHub 借你一台乾淨的 Linux 電腦;steps 依序下載程式碼、安裝 Python 與套件、跑測試,任何一步失敗就整個打叉

YAML 用縮排表示層級,縮排錯了檔案就讀不懂,這是最常見的錯誤。

幾個重點:

  • uses 是使用別人寫好的步驟,例如 actions/checkout 負責下載你的程式碼。@v6 是版本,各步驟的最新版本請以它們的官方頁面為準。
  • run 是執行一行指令,就和你在終端機打的一樣。
  • requirements.txt 要列出所有套件,包含 pytest。CI 的電腦上什麼都沒裝。

把這個檔案 commit 並推上 GitHub,到專案頁面的 Actions 分頁,就能看到它在跑。之後每個 Pull Request 下方都會出現一個綠色勾勾或紅色叉叉。

讓測試成為真正的守門員

光是跑測試還不夠,要讓「沒通過就不能合併」。在 GitHub 專案的設定裡,可以替 main 分支加上保護規則,把 tests 設成合併前必須通過的檢查(required status check)。設定的位置可能隨 GitHub 改版移動,可以搜尋 GitHub 官方文件中的 branch protection 或 rulesets。

這樣一來,不管是你還是 Agent,只要測試沒過,合併按鈕就是灰的。還記得「讓 Agent 寫測試、跑測試」那堂課嗎?你當時寫下的每一個測試,現在都變成了自動執行的守衛。

測試失敗時

紅色叉叉出現時,點進去就能看到失敗的步驟和紀錄。你也可以直接請 Agent 處理:

可以這樣請 Claude Code 處理 CI 失敗

這個分支的 Pull Request 在 GitHub Actions 上測試失敗了。請用 gh 指令讀取最近一次失敗的執行紀錄,告訴我是哪個測試失敗、原因是什麼。先說明原因和你打算怎麼修,等我同意再改。

(gh 是 GitHub 的命令列工具,需要先安裝並登入。)

AI 審查:多一雙眼睛

測試只能檢查你想到要測的事。程式碼裡還有很多測試抓不到的問題:命名讓人看不懂、某個邊界情況沒處理、不小心把金鑰印進記錄檔。這正是 AI 審查擅長的地方。

Claude Code 提供 GitHub Actions 的整合。最簡單的設定方式,是在專案資料夾裡開啟 Claude Code,執行:

/install-github-app

照著提示走,它會幫你安裝 Claude 的 GitHub App、把金鑰存成專案的 Secret,並準備好 workflow 檔案的 Pull Request。你需要是這個 GitHub 專案的管理員,電腦上也要先裝好並登入 gh。

設定完成後,你可以在任何 Pull Request 或 Issue 的留言裡呼叫它:

@claude 請審查這個 Pull Request,特別注意金額計算和錯誤處理,有問題請在對應的程式行留言。

設定時也可以選擇加入自動審查的 workflow,讓每個新的 Pull Request 都自動被審查一次。實際可選的項目和產生的檔案內容可能隨版本更新,請以 Claude Code 官方文件中關於 GitHub Actions 的說明為準。

其他選擇:GitHub Copilot 也有 Pull Request 審查功能,市面上還有許多 AI 審查服務。概念都一樣:讀修改內容,留下建議。

幫手,不是關卡

這是這堂課最重要的一段。

AI 審查很有用,但它有三個特性,讓它不適合當作必須通過的關卡:

  • 它會漏看:沒留言不代表沒問題。它可能專注在某個地方,就忽略了另一個地方。
  • 它會誤判:有時候它指出的「問題」其實不是問題,或者是你們團隊刻意的寫法。
  • 它不一定每次都一樣:同一份修改審查兩次,留言可能不同。

相比之下,測試每次的結果都一樣,過就是過、沒過就是沒過,這才是守門員該有的特性。

一個好習慣:當 AI 審查抓到一個真正的 bug,除了修好它,再補一個測試。這樣同樣的錯誤下次就會被守門員擋下,不必再靠運氣。

安全與費用

  • 金鑰只放在 GitHub Secrets:在 workflow 裡用 secrets.ANTHROPIC_API_KEY 這樣的方式引用,絕對不要把金鑰寫進檔案。/install-github-app 會幫你設定好。
  • 權限給最少:workflow 只開它需要的權限,AI 審查不需要能推送程式碼的話,就不要給。
  • 兩種費用:GitHub Actions 依執行時間計算時數,私人專案有免費額度上限;AI 審查每次都會用掉 token。可以限制 Agent 最多跑幾輪、只在需要時用 @claude 呼叫,而不是每次推送都審查。最後一堂課會更完整地談成本。
行動練習
  1. 在你的練習專案加上 .github/workflows/tests.yml,確認 requirements.txt 裡有 pytest,推上 GitHub,在 Actions 分頁看到綠色勾勾。
  2. 故意改壞一個函式,開一個 Pull Request,確認測試變成紅色叉叉;再請 Agent 讀失敗紀錄並修好。
  3. 替 main 分支設定「測試必須通過才能合併」,確認紅色叉叉時合併按鈕無法使用。
  4. 執行 /install-github-app,在一個 Pull Request 留言 @claude 請它審查。讀完它的建議,每一則分成「採納」「不採納」兩類,並寫下理由。
  5. 從採納的建議裡挑一個,請 Agent 修好並補一個測試。

讀完了嗎?

標記完成後,單元與專案的進度會自動更新(只存在這台裝置的瀏覽器)。

卡住了?讓 AI 當你的家教複製這段提問範本,貼到 Claude 或其他 AI 工具,再補上你卡住的地方。

留言與討論

卡關了、有心得,或發現內容需要更新?都歡迎留言。留言使用 GitHub 帳號登入。

留言區即將開放。現在可以先到 GitHub 討論區 發問,或看看 交流頁 的其他管道。