Act 是什麼?

Act 是一個開源命令列工具,讓你可以在本機運行 GitHub Actions Workflow,無需將程式碼推送到 GitHub 即可測試與除錯 CI/CD 流水線。

對於經常編寫 GitHub Actions 的開發者來說,這是一個效率神器

  • 快速迭代:修改 workflow 後立刻在本機運行,不用等待 GitHub 排隊與執行
  • 節省資源:不消耗 GitHub Actions 分鐘數(尤其是私有儲存庫)
  • 離線除錯:在沒有網路連線的環境下也能測試 workflow
  • 安全測試:在隔離環境中驗證 workflow 的安全性,避免意外執行危險操作

為什麼需要 Act?

GitHub Actions 是強大的 CI/CD 平台,但除錯 workflow 有一個痛點:

修改 .github/workflows/test.yml 
→ git commit 
→ git push 
→ 等待 GitHub 排隊(可能幾分鐘到幾小時)
→ 查看日誌發現錯誤
→ 重複上述步驟

這個迴圈非常耗時。有了 Act,你可以:

修改 .github/workflows/test.yml 
→ act -j test    # 本機立即運行
→ 查看輸出,修復問題
→ 再次運行,確認無誤後再推送

效率提升至少 10 倍。

Act 與其他方案比較

特性 Act GitHub Web UI Docker Compose 模擬
運行速度 ⚡ 本機即時 🐌 需排隊等待 ⚡ 本機但設定複雜
真實性 ✅ 使用真實 GitHub Actions runner 映像 ✅ 完全真實 ❌ 需要手動模擬
成本 💰 免費(本機運行) 💰 消耗 Actions 分鐘數 💰 免費
易用性 ✅ 一條命令 ✅ 圖形介面 ❌ 設定繁瑣
離線支援 ✅ 完全離線 ❌ 需要網路 ✅ 可離線

安裝 Act

macOS(Homebrew)

brew install act

Linux

Ubuntu/Debian:

curl https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo bash

Arch Linux:

yay -S act
# 或
paru -S act

Windows

Chocolatey:

choco install act-cli

Scoop:

scoop install act

驗證安裝

act --version
# 輸出類似:act version 0.2.x

快速上手:運行第一個 Workflow

前提條件

確保你的專案根目錄有 .github/workflows/ 目錄,裡面包含至少一個 workflow 檔案(.yml.yaml)。

列出可用的 Workflow

cd /path/to/your/project
act -l

輸出範例:

Stage  Job ID  Job name  Workflow name  Workflow file  Events
0      test    Test      CI             ci.yml         push,pull_request
0      build   Build     CI             ci.yml         push,pull_request

運行指定 Job

# 運行名為 test 的 job
act -j test

# 運行所有 job
act

# 運行特定事件觸發的 workflow(如 pull_request)
act pull_request

首次運行的注意事項

第一次運行時,Act 會下載必要的 Docker 映像(通常是 catthehacker/ubuntu:act-latest),這可能需要幾分鐘時間。後續運行會使用快取,速度更快。

INFO[0000] Using docker host 'unix:///var/run/docker.sock'
INFO[0000] Pulling image 'catthehacker/ubuntu:act-latest'
...

進階用法

1. 使用不同的 Runner 映像

Act 預設使用 Ubuntu 映像,但你可以透過 -P 參數指定不同的平台:

# 使用 Ubuntu 22.04
act -P ubuntu-latest=catthehacker/ubuntu:act-22.04

# 使用 Ubuntu 20.04
act -P ubuntu-latest=catthehacker/ubuntu:act-20.04

# 使用輕量級映像(更快,但功能有限)
act -P ubuntu-latest=node:16-buster-slim

2. 傳遞 Secret 和環境變數

很多 workflow 依賴 secret(如 API 金鑰、Token)。你可以透過 .env 檔案或命令列傳遞:

方法一:使用 .env 檔案

在專案根目錄建立 .env 檔案:

MY_API_KEY=your_secret_key
GITHUB_TOKEN=«redacted:ghp_…»

然後運行:

act --secret-file .env

方法二:命令列直接傳遞

act -s MY_API_KEY=your_secret_key -s GITHUB_TOKEN=«redacted:ghp_…»

3. 並行執行多個 Job

如果你的 workflow 有多個獨立的 job,可以使用 --parallel 加速:

act --parallel

4. 乾跑模式(Dry Run)

只列印將要執行的步驟,不實際運行:

act -n

5. 自訂工作目錄

如果 workflow 依賴特定的目錄結構,可以綁定掛載:

act --bind

這會將目前目錄掛載到容器內,使檔案修改即時生效。


實戰案例

案例 1:除錯 Node.js 專案的 CI

假設你有一個 Node.js 專案,workflow 如下:

# .github/workflows/nodejs.yml
name: Node.js CI

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install dependencies
        run: npm ci

      - name: Run tests
        run: npm test

在本機運行:

act -j test

如果測試失敗,Act 會顯示完整的日誌輸出,方便定位問題。

案例 2:測試多版本 Python 矩陣

# .github/workflows/python.yml
name: Python Tests

on: [push]

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ['3.9', '3.10', '3.11', '3.12']

    steps:
      - uses: actions/checkout@v4

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Run tests
        run: pytest

運行所有 Python 版本的測試:

act -j test

Act 會自動遍歷矩陣中的所有組合並依序執行。

案例 3:除錯 Docker 建置

# .github/workflows/docker.yml
name: Build Docker Image

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Build Docker image
        run: docker build -t myapp:${{ github.sha }} .

      - name: Run tests in container
        run: docker run myapp:${{ github.sha }} npm test

在本機運行前,確保 Docker daemon 正在運行:

# 檢查 Docker 是否可用
docker info

# 運行 workflow
act -j build

常見問題排查

問題 1:權限錯誤

現象: permission denied while trying to connect to the Docker daemon socket

解決:

# 將目前使用者加入到 docker 群組
sudo usermod -aG docker $USER
# 重新登入或運行 newgrp docker

或者使用 sudo 運行 Act(不推薦):

sudo act

問題 2:記憶體不足

現象: 大型 workflow 運行時 OOM(Out of Memory)

解決: 限制並行 job 數量

act --max-parallel 1

問題 3:Action 找不到

現象: unable to find action 'actions/checkout@v4'

解決: Act 需要從 GitHub 下載 action,確保網路連線正常。對於私有 action,需要設定 GITHUB_TOKEN

問題 4:環境變數未生效

現象: workflow 中引用的環境變數為空

解決: 確保透過 --secret-file-s 正確傳遞了變數,並在 workflow 中使用 ${{ env.VAR_NAME }}${{ secrets.VAR_NAME }} 引用。


最佳實踐

  1. 在推送前始終本機測試:養成修改 workflow 後先用 Act 驗證的習慣
  2. 使用 .env 檔案管理 secret:不要硬編碼敏感資訊,將 .env 加入 .gitignore
  3. 定期更新 Actbrew upgrade act 或重新下載安裝最新版本
  4. 結合 VS Code 使用:安裝 GitHub Actions 擴充套件,在編輯器中直接預覽 workflow
  5. CI 中保留 Act 作為可選步驟:可以在 PR 範本中提醒貢獻者本機測試

總結

Act 是 GitHub Actions 開發者的必備工具,它將原本需要幾分鐘甚至幾小時的除錯迴圈縮短到幾秒鐘。無論是簡單的單元測試 workflow,還是複雜的多階段部署流水線,Act 都能讓你在本機快速驗證。

核心優勢回顧: - ⚡ 快速迭代:本機即時運行,無需等待 GitHub 排隊 - 💰 節省成本:不消耗 GitHub Actions 分鐘數 - 🔒 安全隔離:在容器中運行,不影響主機環境 - 🛠️ 真實環境:使用與 GitHub 相同的 runner 映像,結果可靠

如果你經常編寫或維護 GitHub Actions workflow,強烈建議將 Act 加入你的工具箱

相關連結: - Act GitHub 儲存庫 - Act 官方文件 - GitHub Actions 文件