Featured image of post 透過 actions/cache 加速 GitHub Actions 工作流程Featured image of post 透過 actions/cache 加速 GitHub Actions 工作流程

透過 actions/cache 加速 GitHub Actions 工作流程

透過映射全域節點快取和目標編譯階段的運行器目錄來縮短 CI 等待視窗。

自動化 CI/CD 管道(如 GitHub Actions)是現代軟體品質控制的基石。但是,如果您的工作流程在每個拉取請求上獲取外部套件、啟動容器環境並從頭開始重建整個應用程序,則執行時間可能會迅速增加到幾分鐘。

較長的回饋循環會降低開發人員的工作效率並導致更高的計費成本。

在本文中,我們將示範如何利用 GitHub 的官方快取機制將您的工作流程從幾分鐘加快到幾秒鐘。


1. GitHub Actions 中的快取如何運作

GitHub Actions 快取將檔案(例如套件依賴項和建置輸出)儲存到 GitHub 管理的安全儲存層。在後續運行中,運行程式將恢復這些目錄,而不是重新下載或編譯它們。

快取對於以下方面非常有效:

  • 包管理器快取資料夾(例如 .npmyarn 快取)。
  • Web 框架建置目標(例如 Next.js 中的 .next/cache)。
  • 編譯器中間體(Rust 目標目錄、Go 建置快取)。

2. 使用 setup-* 操作進行本機包緩存

為 Node.js 等運行時環境啟用快取的最簡單方法是透過 GitHub 官方設定操作中的整合選項。

使用 npm (.github/workflows/ci.yml) 的 Node.js 專案的範例工作流程:

name: CI

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          # Enable automatic caching for npm dependencies
          cache: 'npm'

      # Automatically restores dependency cache mapping package-lock.json hashes
      - name: Install dependencies
        run: npm ci

      - name: Run test
        run: npm test

只需設定 cache: 'yarn'cache: 'pnpm' 即可分別處理 Yarn 和 pnpm 設置,無需任何其他配置。


3. actions/cache 的高階配置

如果您需要快取自訂目錄(例如編譯資料夾或框架建置輸出),請使用獨立的 actions/cache 操作。

以下是在 Next.js 專案中快取 .next/cache 目錄的範例設定:

      - name: Cache Next.js build
        uses: actions/cache@v4
        with:
          # Define directories to preserve
          path: |
            ${{ github.workspace }}/.next/cache
          # Create a cache key using dependency locks and code hashes
          key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**/*.js', '**/*.ts', '**/*.tsx') }}
          # Fallback prefixes if an exact key match is not found
          restore-keys: |
            ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-

了解配置參數:

  • path:要包含在快取上傳/下載中的檔案路徑。
  • key:標識快取的唯一字串。如果在伺服器上找到匹配項,執行程式將恢復檔案。我們計算鎖定檔案和程式碼目錄的加密雜湊值,以便對依賴項或程式碼的變更正確地使快取失效。
  • restore-keys:如果主 key 遺失,則使用後備前綴的有序清單。 Git 使用它來載入最接近的匹配緩存,從而啟用增量建置。

4. 快取範圍和限制

  • 儲存限制:GitHub 將每個儲存庫的快取儲存限制為 10GB。如果您的儲存庫超出此限制,舊的快取有效負載將被自動驅逐。
  • 存取範圍:快取依分支隔離。拉取請求分支可以存取父分支的緩存,但無法對其進行寫入或從隔離的同級分支中讀取緩存,從而確保建置安全。

結論

優化 CI 回饋循環是一項影響深遠的生活品質升級。經過:

  1. 在設定任務中啟動內建設定 (cache: 'npm'),
  2. 使用 actions/cache 作為框架建立目錄(如 Next.js),以及
  3. 設計適當的快取鍵和後備,

您可以顯著縮短建置時間並降低基礎設施成本。