8.1 KiB
Testing GitHub Actions Locally with Act
This guide explains how to use act to run GitHub Actions workflows locally, helping diagnose and fix issues before pushing to GitHub.
What is Act?
Act allows you to run GitHub Actions workflows on your local machine using Docker. This enables rapid iteration and debugging without polluting your GitHub commit history with "fix CI" commits.
Installation
Linux
curl -s https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo bash
macOS
brew install act
Windows
choco install act-cli
Or download from: https://github.com/nektos/act/releases
Prerequisites
- Docker must be installed and running
- Sufficient disk space for runner images (~2-5GB)
Quick Start
1. List Available Workflows
act -l
This lists all jobs defined in .github/workflows/
2. Run All Jobs (Dry Run)
act -n
The -n flag performs a dry run without executing steps.
3. Run Specific Workflow
# Run push event workflows
act push
# Run pull request workflows
act pull_request
# Run a specific job
act -j lint
act -j build
act -j test-e2e
Our Project Workflows
CI/CD Workflow (ci.yml)
Tests linting, building, and e2e tests:
# Run entire CI pipeline
act push
# Run specific jobs
act -j prisma-check
act -j lint
act -j build
act -j test-e2e
Code Review Workflow (code-review.yml)
Automated PR review:
act pull_request -W .github/workflows/code-review.yml
Auto Merge Workflow (auto-merge.yml)
act workflow_run -W .github/workflows/auto-merge.yml
PR Management Workflow (pr-management.yml)
act pull_request -W .github/workflows/pr-management.yml
Common Issues and Solutions
Issue 1: Missing Secrets
Error:
Error: Required secret not found
Solution:
Create a .secrets file in the project root:
GITHUB_TOKEN=your_github_token_here
Then run:
act --secret-file .secrets
Issue 2: Docker Image Size
Act downloads large Docker images. To use smaller images:
# Use medium-sized image (recommended)
act -P ubuntu-latest=catthehacker/ubuntu:act-latest
# Use smaller image (faster but may be missing some tools)
act -P ubuntu-latest=catthehacker/ubuntu:act-20.04
Issue 3: Insufficient Resources
Error:
Error: Process completed with exit code 137
Solution: Increase Docker's memory limit in Docker Desktop settings (recommend 8GB+).
Issue 4: Node/NPM Cache Issues
Some workflows use cache: 'npm' which may fail locally:
# Skip cache-related steps
act push --env ACT=true
Then modify workflows to skip cache when ACT env var is set.
Issue 5: Missing npm ci Dependencies
Error:
npm ERR! The `npm ci` command can only install with an existing package-lock.json
Solution:
Ensure package-lock.json is committed and up-to-date:
npm install
git add package-lock.json
git commit -m "Update package-lock.json"
Workflow-Specific Testing
Testing Prisma Setup
act -j prisma-check
Expected issues to check:
- Missing
prisma/schema.prisma - Incorrect DATABASE_URL
- Missing Prisma dependencies
Testing Linting
act -j lint
This runs ESLint against the codebase. Fix errors before pushing.
Testing Build
act -j build
Simulates production build. Check for:
- TypeScript compilation errors
- Missing imports
- Build optimization issues
Testing E2E Tests
act -j test-e2e
Note: Playwright tests may not work perfectly in act due to browser dependencies. Consider:
- Running Playwright tests directly:
npm run test:e2e - Using GitHub Actions for full E2E validation
Advanced Usage
Run with Verbose Output
act -v
Run in Interactive Mode
act --bind
This allows you to inspect the container interactively.
Use Custom Event Payload
Create event.json:
{
"pull_request": {
"number": 1,
"title": "Test PR",
"body": "Testing locally"
}
}
Run with:
act pull_request -e event.json
Set Environment Variables
act -e NODE_ENV=production -e DEBUG=true
Platform Specification
# Create .actrc file for consistent settings
cat > ~/.actrc << EOF
-P ubuntu-latest=catthehacker/ubuntu:act-latest
--secret-file .secrets
--env ACT=true
EOF
Debugging Workflows
Step 1: Identify the Failing Step
act -j <job-name> -v
Look for red error messages indicating which step failed.
Step 2: Check Logs
Act outputs detailed logs. Search for:
Error:exit code 1Process completed with exit code
Step 3: Test Locally
If a command fails in act, test it directly:
# Example: If npm ci fails
npm ci
# Example: If lint fails
npm run lint
# Example: If build fails
npm run build
Step 4: Iterate
Make changes, then re-run:
act -j <job-name>
Current Known Issues in Our Workflows
CI/CD (ci.yml)
-
Prisma Dependencies Missing
- Status: ❌ Failing
- Issue:
@prisma/clientandprismapackages not installed - Fix:
npm install @prisma/client prisma
-
Prisma Schema Missing
- Status: ❌ Failing
- Issue: No
prisma/schema.prismafile - Fix: Create Prisma schema file
-
Test Script Missing
- Status: ❌ Failing
- Issue:
test:e2escript not in package.json - Fix: Verify
package.jsonhas the script
Code Review (code-review.yml)
- Status: ⚠️ Requires PR context
- Can be tested with custom event payload
Auto Merge (auto-merge.yml)
- Status: ⚠️ Requires GitHub API access
- May not work fully in local environment
Best Practices
-
Run workflows before pushing:
act -j lint && act -j build -
Use specific job testing: Only run the jobs relevant to your changes.
-
Keep workflows simple: Complex workflows are harder to debug locally.
-
Mock external services: Use
if: ${{ !env.ACT }}to skip steps that require GitHub-specific features. -
Test incrementally: After fixing one job, test the next.
Continuous Integration Best Practices
Before Every Push
# Quick validation
npm run lint
npm run build
npm run test:e2e
# Or use act to validate workflows
act push -j lint -j build
Before Creating PR
# Full CI simulation
act push
# Simulate PR checks
act pull_request
Troubleshooting Checklist
- Docker is running
- Act is installed (
act --version) .secretsfile exists (if secrets needed)package-lock.jsonis committed- All dependencies are installed (
npm install) - Prisma schema exists (if using Prisma)
- Scripts in
package.jsonmatch workflow expectations
Additional Resources
Getting Help
If workflows still fail after testing with act:
- Check the project issues
- Review recent commits for workflow changes
- Compare with working workflows in other projects
- Test commands individually outside of workflows
Quick Reference
# List all workflows
act -l
# Dry run
act -n
# Run push workflows
act push
# Run PR workflows
act pull_request
# Run specific job
act -j <job-name>
# Verbose output
act -v
# With secrets
act --secret-file .secrets
# Custom platform
act -P ubuntu-latest=catthehacker/ubuntu:act-latest