Test GitHub Actions workflows locally using act, including installation, configuration, debugging, and troubleshooting local workflow execution
Test GitHub Actions workflows locally using act. Activate when debugging workflow failures, testing changes before committing, or developing actions without pushing to remote repositories.
/plugin marketplace add vinnie357/claude-skills/plugin install github@vinnie357This skill inherits all available tools. When active, it can use any tool Claude has access to.
scripts/install-act.nuActivate when testing GitHub Actions workflows locally, debugging workflow issues, or developing actions without committing to remote repositories. This skill covers act installation, configuration, and usage patterns.
Activate when:
The act tool is configured in the github plugin's mise.toml:
# Install act via mise
mise install act
# Verify installation
act --version
macOS (Homebrew):
brew install act
Linux (via script):
curl -s https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo bash
From source:
git clone https://github.com/nektos/act.git
cd act
make install
Windows (Chocolatey):
choco install act-cli
act reads workflow files from .github/workflows/ and:
Key Concept: act uses Docker to simulate GitHub's runner environment locally.
.github/workflows/*.yml files in repositoryVerify Docker is running:
docker ps
# List all workflows
act -l
# Output:
# Stage Job ID Job name Workflow name Workflow file Events
# 0 build build CI ci.yml push,pull_request
# 0 test test CI ci.yml push,pull_request
# Run all jobs triggered by push event
act
# Run specific job
act -j build
# Run specific workflow
act -W .github/workflows/ci.yml
# Pull request event
act pull_request
# Manual workflow dispatch
act workflow_dispatch
# Push to specific branch
act push -e .github/workflows/push-event.json
# Schedule event
act schedule
# Show what would run without executing
act -n
# Show with full details
act -n -v
Create event JSON file:
{
"pull_request": {
"number": 123,
"head": {
"ref": "feature-branch"
},
"base": {
"ref": "main"
}
}
}
Use with act:
act pull_request -e event.json
{
"inputs": {
"environment": "staging",
"debug": true
}
}
act workflow_dispatch -e inputs.json
# Single secret
act -s GITHUB_TOKEN=ghp_xxxxx
# Multiple secrets
act -s API_KEY=key123 -s DB_PASSWORD=pass456
Create .secrets file (add to .gitignore):
GITHUB_TOKEN=ghp_xxxxx
API_KEY=key123
DB_PASSWORD=pass456
Run with secrets file:
act --secret-file .secrets
# Use existing env var
act -s GITHUB_TOKEN
# Set from command
export MY_SECRET=value
act -s MY_SECRET
Create .actrc in repository root or home directory:
# Use specific platform
-P ubuntu-latest=catthehacker/ubuntu:act-latest
# Default secrets file
--secret-file .secrets
# Default environment
--env-file .env
# Container architecture
--container-architecture linux/amd64
# Verbose output
-v
# Use custom image for platform
act -P ubuntu-latest=my-custom-image:latest
# Use medium size images (recommended)
act -P ubuntu-latest=catthehacker/ubuntu:act-latest
# Use micro images (faster, less compatible)
act -P ubuntu-latest=node:16-buster-slim
act supports different image sizes:
Medium images (recommended):
-P ubuntu-latest=catthehacker/ubuntu:act-latest
-P ubuntu-22.04=catthehacker/ubuntu:act-22.04
Micro images:
Create .env file:
NODE_ENV=test
API_URL=http://localhost:3000
LOG_LEVEL=debug
Use with act:
act --env-file .env
act --env NODE_ENV=test --env API_URL=http://localhost:3000
Mount local directory into container:
act --bind
Keep containers between runs for faster execution:
act --reuse
# Run on specific platform
act -P ubuntu-latest=ubuntu:latest
# Multiple platforms
act -P ubuntu-latest=ubuntu:latest \
-P windows-latest=windows:latest
# Specify architecture (useful for M1/M2 Macs)
act --container-architecture linux/amd64
# Use host network
act --container-daemon-socket -
# Custom network
act --network my-network
# Enable artifact server on specific port
act --artifact-server-path /tmp/artifacts \
--artifact-server-port 34567
# Verbose logging
act -v
# Very verbose (debug level)
act -vv
# Watch for file changes and re-run
act --watch
# Drop into shell on failure
act --shell bash
# List act containers
docker ps -a | grep act
# Inspect specific container
docker inspect <container-id>
# View logs
docker logs <container-id>
Missing tools:
steps:
- name: Install missing tool
run: |
if ! command -v tool &> /dev/null; then
apt-get update && apt-get install -y tool
fi
GitHub API calls:
# Use GITHUB_TOKEN from secrets
- env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh api repos/${{ github.repository }}/issues
# Create PR event payload
cat > pr-event.json << EOF
{
"pull_request": {
"number": 1,
"head": { "ref": "feature" },
"base": { "ref": "main" }
}
}
EOF
# Run PR workflow
act pull_request -e pr-event.json -j test
# Test entire CI pipeline
act push
# Test specific stages
act push -j build
act push -j test
act push -j deploy --secret-file .secrets
# Run matrix strategy locally
act -j test
# Test specific matrix combination (modify workflow temporarily)
act -j test --matrix node-version:20
# 1. List jobs
act -l
# 2. Dry run
act -n -j build
# 3. Run with verbose output
act -v -j build
# 4. Iterate and test
act --reuse -j build
Error: Cannot connect to Docker daemon
# Start Docker
# macOS: Start Docker Desktop
# Linux:
sudo systemctl start docker
Error: Permission denied
# Add user to docker group (Linux)
sudo usermod -aG docker $USER
newgrp docker
Error: Failed to pull image
# Use specific image version
act -P ubuntu-latest=ubuntu:22.04
# Or use act's recommended images
act -P ubuntu-latest=catthehacker/ubuntu:act-latest
Error: No workflows found
# Verify workflow files exist
ls -la .github/workflows/
# Check workflow syntax
act -n -v
Error: Secret not found
# List required secrets from workflow
grep -r "secrets\." .github/workflows/
# Provide via command line
act -s SECRET_NAME=value
# Or use secrets file
act --secret-file .secrets
Error: Action not found or fails
# Ensure action versions are compatible
# Some actions may not work locally
# Use alternative actions if needed
# Or skip problematic steps locally:
- name: Problematic step
if: github.event_name != 'act' # Skip in act
uses: some/action@v1
Error: Command not found
# Use medium-sized images with more tools
act -P ubuntu-latest=catthehacker/ubuntu:act-latest
# Or install tools in workflow
- run: apt-get update && apt-get install -y <tool>
Create .actrc in repository:
-P ubuntu-latest=catthehacker/ubuntu:act-latest
--secret-file .secrets
--container-architecture linux/amd64
--artifact-server-path /tmp/artifacts
# act secrets and config
.secrets
.env
# act artifacts
/tmp/artifacts/
steps:
# Skip in local testing
- name: Deploy
if: github.event_name != 'act'
run: ./deploy.sh
# Run only in local testing
- name: Local setup
if: github.event_name == 'act'
run: ./local-setup.sh
# Use reuse flag for faster iterations
act --reuse -j test
# Run specific job being developed
act -j my-new-job -v
# Watch mode for continuous testing
act --watch -j test
# Test before committing
act -j test && git commit -m "message"
# Git hook (.git/hooks/pre-commit)
#!/bin/bash
act -j test --quiet
# Validate workflow syntax
act -n
# Test specific changes
act -j affected-job
# Use same images as CI
act -P ubuntu-latest=ubuntu:22.04
# Use same secrets structure
act --secret-file .secrets
The plugin includes an installation script at scripts/install-act.sh:
#!/usr/bin/env bash
# Install act via mise or fallback methods
if command -v mise &> /dev/null; then
echo "Installing act via mise..."
mise install act
elif [[ "$OSTYPE" == "darwin"* ]] && command -v brew &> /dev/null; then
echo "Installing act via Homebrew..."
brew install act
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
echo "Installing act via install script..."
curl -s https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo bash
else
echo "Please install act manually: https://github.com/nektos/act"
exit 1
fi
act --version
Run with:
chmod +x scripts/install-act.sh
./scripts/install-act.sh
act --version before documenting version numbersact -l to verify actual workflows before claiming their presencedocker ps to confirm Docker is running before troubleshootingact -n to validate workflow syntax before claiming correctnessact commands to verify behavior before documenting output formatdocker images to verify available images before recommending specific versionsact -v to observe actual error messages before documenting troubleshooting stepsCreating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.