自動化 CI/CD 管道(如 GitHub Actions)是現代軟體品質控制的基石。但是,如果您的工作流程在每個拉取請求上獲取外部套件、啟動容器環境並從頭開始重建整個應用程序,則執行時間可能會迅速增加到幾分鐘。
較長的回饋循環會降低開發人員的工作效率並導致更高的計費成本。
在本文中,我們將示範如何利用 GitHub 的官方快取機制將您的工作流程從幾分鐘加快到幾秒鐘。
1. GitHub Actions 中的快取如何運作
GitHub Actions 快取將檔案(例如套件依賴項和建置輸出)儲存到 GitHub 管理的安全儲存層。在後續運行中,運行程式將恢復這些目錄,而不是重新下載或編譯它們。
快取對於以下方面非常有效:
- 包管理器快取資料夾(例如
.npm或yarn快取)。 - 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 回饋循環是一項影響深遠的生活品質升級。經過:
- 在設定任務中啟動內建設定 (
cache: 'npm'), - 使用
actions/cache作為框架建立目錄(如 Next.js),以及 - 設計適當的快取鍵和後備,
您可以顯著縮短建置時間並降低基礎設施成本。

