act: 70K+ Star — 本地运行 GitHub Actions 的完整指南

act(nektos/act)是 CLI 工具,用 Docker 容器在本地运行 GitHub Actions。涵盖安装、设置、密钥管理、runner 镜像和生产加固。70,410 GitHub stars。

  • ⭐ 70410
  • 更新于 2026-08-27
act: 70K+ Star — 本地运行 GitHub Actions 的完整指南 #

act 是 CLI 工具,读取 .github/workflows/ 中的 GitHub Actions 工作流文件,用 Docker 容器在本地执行,忠实复现 GitHub Actions 运行时环境。本教程详解 act 完整设置——从安装到生产加固——让你能在推送到 GitHub 前验证每个工作流变更。

🔗 GitHub: https://github.com/nektos/act


为什么需要 act? #

每个写过 GitHub Actions 工作流的开发者都经历过这种痛苦:你修改 .github/workflows/ci.yml,提交、推送、等待 3-5 分钟让 runner 拾取,然后看着它在第 4 步失败——因为缺少环境变量或 shell 命令中的拼写错误。反馈循环缓慢,消耗 GitHub Actions 分钟数,并用"修复 CI"消息污染提交历史。

act 解决这个问题——在 Docker 容器内本地运行 GitHub Actions 工作流,匹配 GitHub 的环境变量、文件系统布局和 runner 行为。


act 工作原理 #

act 作为本地 GitHub Actions runner 模拟器。在仓库中运行 act 时,它执行以下步骤:

  1. 工作流发现:扫描 .github/workflows/ 中的 YAML 工作流文件
  2. 事件解析:根据事件类型(push、pull_request 等)确定触发哪些工作流
  3. 依赖解析:构建作业依赖的有向无环图(DAG)
  4. 镜像准备:为指定 runner 拉取或构建 Docker 镜像
  5. 容器执行:在每个步骤内用 GitHub 兼容的环境变量和文件系统挂载运行 Docker 容器
  6. 产物收集:获取输出、产物和日志

Runner 镜像大小 #

act 提供三个镜像层级平衡保真度与磁盘空间:

镜像大小下载磁盘空间用例
Micro~50 MB<200 MB仅 Node.js,快速冒烟测试
Medium~200 MB~500 MB核心工具,适合大多数工作流
Large~5 GB~18-75 GB完整 GitHub runner 对等,完整工具链

默认 Medium 镜像(catthehacker/ubuntu:act-latest)包含 Python、Node.js、Go、Ruby、Java、.NET 和常见构建工具。Large 镜像(catthehacker/ubuntu:full-*)是实际 GitHub 托管 runner 的文件系统转储,提供最接近的对等。


安装与设置 #

macOS(Homebrew) #

# 通过 Homebrew 安装 act
brew install act

# 验证安装
act --version
# act version 0.2.88

Linux(Bash 脚本) #

# 一键安装器(需要 bash 和 curl)
curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo bash

# 备选:下载预构建二进制
wget https://github.com/nektos/act/releases/download/v0.2.88/act_Linux_x86_64.tar.gz
tar xzf act_Linux_x86_64.tar.gz
sudo mv act /usr/local/bin/

Windows(Chocolatey / Scoop / WinGet) #

# Chocolatey
choco install act-cli

# Scoop
scoop install act

# WinGet
winget install nektos.act

Docker 先决条件 #

act 需要 Docker Engine API。运行前:

# 验证 Docker 正在运行
docker info

# 验证 Docker API 可访问
docker version

注意:Podman 未官方支持。对于无 root 设置或备选,使用 Docker Desktop、Rancher Desktop 或 macOS 上的 Colima。


Docker、VS Code、GitHub Enterprise 和 Make 集成 #

Docker 集成 #

act 使用 Docker 作为执行引擎。每个工作流作业在隔离容器中运行:

# 用自定义 runner 镜像运行
act -P ubuntu-latest=node:20-slim

# 指定自定义 Docker 主机(远程引擎)
export DOCKER_HOST=tcp://remote-docker:2376
act

# 用容器架构标志用于 Apple Silicon
act --container-architecture linux/amd64

VS Code 扩展(GitHub Local Actions) #

GitHub Local Actions VS Code 扩展为 act 提供 GUI:

# 从 VS Code 市场安装扩展
# 按 Cmd+Shift+P → "扩展:安装扩展" → 搜索 "GitHub Local Actions"

安装扩展后:

  • 从侧边栏打开 Act 面板
  • 查看 .github/workflows/ 中所有工作流
  • 点击任何工作流在本地运行
  • 在集成终端中查看实时日志

GitHub Enterprise 支持 #

act 支持私有 GitHub Enterprise Server 实例:

# 针对 GitHub Enterprise Server 运行
act --github-instance github.company.com

# 带认证
act --github-instance github.company.com -s GITHUB_TOKEN=your_token

用 act 替换 Make #

许多团队用 act 作为本地任务运行器,用 GitHub Actions 工作流替换 Makefiles:

# .github/workflows/tasks.yml
name: Local Tasks
on: workflow_dispatch
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run linter
        run: npm run lint
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run tests
        run: npm test
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Build
        run: npm run build
# 本地运行任务而不是 make
act -j lint
act -j test
act -j build

基准测试 / 真实用例 #

反馈循环对比 #

场景推送到 GitHub本地用 act节省时间
修复工作流中的拼写错误3-5 分钟15-30 秒90%
调试失败测试5-10 分钟(多次推送)每次迭代 30-60 秒85%
测试矩阵(3 OS × 2 Node 版本)8-15 分钟2-3 分钟80%
密钥/配置验证3-5 分钟20-40 秒90%
工作流语法检查2-3 分钟10-15 秒(dry-run)92%

案例研究:减少 CI 分钟数 #

中型工程团队(25 开发者)每天运行 200 个工作流推送:

  • 使用前 act:每天 ~600 次失败 CI 运行,消耗 ~3,000 GitHub Actions 分钟
  • 使用后 act:开发者先在本地验证;失败 CI 运行降至每天 ~80 次
  • 月节省:~66,000 GitHub Actions 分钟 = 约 $400-1,300/月(取决于 runner 类型)

高级用法 / 生产加固 #

密钥管理 #

切勿提交密钥进行测试。act 提供多种安全模式:

# 选项 1:交互式提示(推荐手动运行)
act -s MY_SECRET

# 选项 2:环境变量查找
export MY_SECRET=supersecurevalue
act -s MY_SECRET

# 选项 3:密钥文件(.secrets,与 .env 相同格式)
cat > .secrets << 'EOF'
MY_SECRET=supersecurevalue
AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=...
EOF
act --secret-file .secrets

# 选项 4:用于 GITHUB_TOKEN(推荐只读 PAT)
act -s GITHUB_TOKEN=your_pat

立即将 .secrets 加入 .gitignore

echo ".secrets" >> .gitignore
echo "*.secrets" >> .gitignore

模拟事件与负载文件 #

通过提供 JSON 负载文件测试依赖事件数据的工作流:

# 模拟 pull_request 事件
cat > pull-request.json << 'EOF'
{
  "pull_request": {
    "head": { "ref": "feature/new-login" },
    "base": { "ref": "main" },
    "number": 42
  }
}
EOF
act pull_request -e pull-request.json
# 模拟带标签的推送
cat > tag-push.json << 'EOF'
{ "ref": "refs/tags/v1.2.3" }
EOF
act push -e tag-push.json

干跑模式 #

验证工作流语法并查看执行计划而不运行:

# 列出所有将运行的作业
act -l

# 干跑(无实际执行)
act -n

# 详细干跑
act -n -v

配置文件(.actrc) #

通过 .actrc 的项目特定配置:

# 项目根目录的 .actrc
cat > .actrc << 'EOF'
--container-architecture linux/amd64
--action-offline-mode
-P ubuntu-latest=catthehacker/ubuntu:act-latest
--env-file .env
--secret-file .secrets
EOF

配置优先级(从高到低):

  1. CLI 参数
  2. ./.actrc(项目根目录)
  3. ~/.actrc(主目录)
  4. $XDG_CONFIG_HOME/act/actrc

本地运行时跳过作业/步骤 #

标记不应在本地运行的步骤:

# 在工作流文件中
jobs:
  deploy:
    if: ${{ !github.event.act }}  # 本地跳过部署作业
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

  notify:
    runs-on: ubuntu-latest
    steps:
      - name: 本地跳过 Slack 通知
        if: ${{ !env.ACT }}
        run: |
          curl -X POST -H 'Content-type: application/json' \
            --data '{"text":"Deployment complete"}' ${{ secrets.SLACK_WEBHOOK }}

通过事件传递 act 标志:

cat > event.json << 'EOF'
{ "act": true }
EOF
act -e event.json

产物收集 #

本地收集工作流产物:

# 指定产物服务器路径
act --artifact-server-path /tmp/artifacts

# 产物将保存到 /tmp/artifacts/<workflow>/<artifact-name>/
ls -la /tmp/artifacts/

离线模式 #

用于气隙或低带宽环境:

# 预拉取镜像
act --action-offline-mode

# 这重用本地缓存的动作仓库和 Docker 镜像
# 不从现在 GitHub 或 Docker Hub 获取

与替代品对比 #

特性actGitHub Actions RunnerDrone CIJenkins
本地运行
Docker 原生
零配置
GitHub 对等✅ 高✅ 完全
学习曲线
开源
自托管

常见问题 #

Q: act 需要网络连接吗? A: 首次运行需要——act 需要拉取 Docker 镜像并从 GitHub 克隆动作仓库。之后,你可以用 --action-offline-mode 用缓存镜像和动作工作。离线前预拉取镜像:docker pull

Q: 如何只运行工作流中的特定作业? A: 用 -j 标志后跟工作流 YAML 中定义的作业 ID:

# 只运行 "test" 作业
act -j test

# 从特定工作流文件运行作业
act -j lint -W .github/workflows/checks.yml

Q: 我可以用 act 处理私有 GitHub 仓库或 GitHub Enterprise 吗? A: 可以。对于私有仓库,通过 -s GITHUB_TOKEN 提供个人访问令牌。对于 GitHub Enterprise Server,用 --github-instance

act --github-instance github.mycompany.com -s GITHUB_TOKEN=ghp_xxx

Q: 为什么工作流失败报 “MODULE_NOT_FOUND”? A: 此错误发生在用本地动作(如 uses: ./)而无适当 checkout 时。确保你的仓库名匹配 checkout 路径。如果仓库名为 my-project,你的 checkout 步骤应包含 path: "my-project"

Q: 如何调试失败步骤? A: 用详细日志(-v)运行 act 并保留容器供检查:

# 详细输出
act -v

# 用详细输出运行特定作业
act -j test -v

# 容器名印在日志中;失败后检查
docker exec -it <container-name> /bin/bash

Q: act 适合运行生产 CI/CD 管道吗? A: 不适合。act 设计用于本地开发和调试。对于生产 CI/CD,用 GitHub 托管 runner、自托管 runner 或专用 CI/CD 平台如 GitHub Actions、Drone 或 Jenkins。

Q: 如何更新 act 到最新版本? A: 用安装时的相同包管理器:

# Homebrew
brew upgrade act

# Chocolatey
choco upgrade act-cli

# Scoop
scoop update act

# Bash 脚本(重新运行安装器)
curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo bash

结论 #

act 是 GitHub Actions 本地开发的行业标准工具。通过 70,000+ GitHub stars 和 thriving 集成生态系统,它让开发者在推送前验证工作流变更,节省 CI 分钟数并加速反馈循环。

最适合:需要本地测试 GitHub Actions 的开发者、希望减少 CI 成本的团队、气隙环境中的 CI/CD 开发。

GitHub: https://github.com/nektos/act

💬 留言讨论