
Local Action Verification
- 638 installs
- 84 repo stars
- Updated June 4, 2026
- google-labs-code/jules-skills
local-action-verification is a Jules bootstrapper skill that installs nektos/act scripts into a repository and documents local GitHub Actions verification in AGENTS.md so agents validate CI passes before pushing code.
About
local-action-verification is a bootstrapper skill from google-labs-code/jules-skills that prepares repositories for local GitHub Actions testing with nektos/act. When run, it copies two scripts into scripts/act/: install-act.sh for platform-aware act installation with sudo fallback, and run-act.sh as a background runner with log polling and timeout handling. The skill also appends a Local CI Verification section to the repository AGENTS.md so Jules discovers and invokes the scripts during coding tasks. After setup, agents can run workflows locally and confirm CI passes before pushing branches that would fail on GitHub. Developers reach for local-action-verification when GitHub Actions workflows exist but local feedback loops are missing and failed pushes waste remote CI minutes.
- Bootstraps scripts/act/install-act.sh and run-act.sh for platform-aware act setup
- Updates AGENTS.md with Local CI Verification instructions that Jules discovers automatically
- Runs full workflow analysis including job IDs, matrix configs, and secret handling
- Executes GitHub Actions in Docker with background runner, log polling, and timeout controls
- Prevents broken CI by verifying builds, tests, and linting locally first
Local Action Verification by the numbers
- 638 all-time installs (skills.sh)
- Ranked #580 of 2,184 Testing & QA skills by installs in the Skillselion catalog
- Security screen: HIGH risk (skills.sh audit)
- Data as of Jul 27, 2026 (Skillselion catalog sync)
npx skills add https://github.com/google-labs-code/jules-skills --skill local-action-verificationAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 638 |
|---|---|
| repo stars | ★ 84 |
| Security audit | 1 / 3 scanners passed |
| Last updated | June 4, 2026 |
| Repository | google-labs-code/jules-skills ↗ |
How do you run GitHub Actions locally before pushing?
Let their agent verify GitHub Actions locally with nektos/act before pushing code.
Who is it for?
Developers using Jules or coding agents on repositories with GitHub Actions who want local nektos/act verification before every push.
Skip if: Teams without GitHub Actions workflows, or projects that only need unit test runners like Jest or pytest without CI YAML replication.
When should I use this skill?
The user wants to verify GitHub Actions locally, set up nektos/act, or validate CI passes before pushing code to a remote branch.
What you get
scripts/act/install-act.sh, scripts/act/run-act.sh, and an AGENTS.md Local CI Verification section enabling local act workflow runs.
- scripts/act/install-act.sh
- scripts/act/run-act.sh
- AGENTS.md CI verification section
By the numbers
- Bundles 2 scripts: install-act.sh and run-act.sh in scripts/act/
Files
Local Action Verification with act
You are setting up a repository so that Jules (or any agent) can run GitHub Actions workflows locally using act to verify code changes pass CI before pushing.
What You're Setting Up
Two scripts and an agents.md section that enable local CI verification:
1. install-act.sh — Installs act if missing (platform-aware, sudo fallback) 2. run-act.sh — Runs act in the background with log polling to avoid agent timeouts 3. AGENTS.md section — Instructions Jules reads to know how to use these scripts
Setup Steps
Step 1: Copy scripts to the repository
Copy the scripts/ directory from this skill into the target repository at scripts/act/:
Target structure:
scripts/act/
├── install-act.sh
└── run-act.shMake sure the scripts are executable:
chmod +x scripts/act/install-act.sh scripts/act/run-act.shStep 2: Add instructions to AGENTS.md
Append the following section to the repository's AGENTS.md file (create it if it doesn't exist). This is how Jules discovers the local verification capability:
## Local CI Verification
Before pushing code or opening a PR, verify changes pass CI locally using `act`.
### Prerequisites
- Docker must be running
- If `act` is not installed, run: `bash scripts/act/install-act.sh`
### How to Verify
1. Read `.github/workflows/` to find the CI workflow and identify the job ID
2. Run the verification script:bash scripts/act/run-act.sh "push -j <JOB_ID>"
With matrix: `bash scripts/act/run-act.sh "push -j <JOB_ID> --matrix <KEY>:<VALUE>"`
3. If the run fails, read the log output, fix the code, and re-run
4. After verification, clean up:rm -f act_output.log git checkout <any unintended file changes>
### Configuration
- Timeout: `ACT_TIMEOUT=900 bash scripts/act/run-act.sh "..."` (default: 600s)
- Poll interval: `ACT_POLL=15 bash scripts/act/run-act.sh "..."` (default: 10s)
- Custom image: pass `-P ubuntu-latest=node:20-bookworm` in the arguments for faster pullsStep 3: Update .gitignore
Append these entries to .gitignore if they don't already exist:
# act artifacts
act_output.log
.secretsStep 4: Print next steps for the user
Tell the user: 1. Docker must be installed and running on any machine (or Jules VM) where verification runs 2. act will be auto-installed on first use via scripts/act/install-act.sh 3. If workflows require secrets, create a .secrets file (KEY=VALUE format) — never commit it 4. Commit all generated files
Troubleshooting
- Docker not running:
actrequires Docker. Ensure the Docker daemon is started. - Image pull slow: First run downloads ~2GB+. Use
-P ubuntu-latest=node:20-bookwormfor faster pulls. - ARM64 issues: On Apple Silicon, add
--container-architecture linux/amd64to act arguments. - Secrets required: Create a
.secretsfile and pass--secret-file .secretsin the act arguments. - Timeout: Increase with
ACT_TIMEOUT=1200 bash scripts/act/run-act.sh "...".
Resource References
- Troubleshooting Guide — Detailed solutions for common issues
Local Action Verification
A bootstrapper skill that sets up a repository for local GitHub Actions verification using nektos/act. After setup, Jules can validate CI passes before pushing code.
What It Does
When run, this skill copies scripts and instructions into the target repository:
scripts/act/
├── install-act.sh # Installs act (platform-aware, sudo fallback)
└── run-act.sh # Background runner with log polling and timeoutIt also adds a Local CI Verification section to the repo's AGENTS.md, which Jules reads to discover and use the scripts during tasks.
How It Works
flowchart TD
A["🎯 Jules receives task<br/>(e.g. 'refactor X, verify CI')"] --> B["📖 Read AGENTS.md"]
subgraph prereqs ["Step 1: Prerequisites"]
B --> C{"Docker running?"}
C -- No --> C1["⛔ Stop, tell user"]
C -- Yes --> D{"act installed?"}
D -- No --> D1["Run scripts/act/install-act.sh"]
D1 --> E["✅ Ready"]
D -- Yes --> E
end
subgraph analyze ["Step 2: Analyze Workflows"]
E --> F["Read .github/workflows/"]
F --> G["Identify job IDs,<br/>matrix configs, secrets"]
end
subgraph run ["Step 3: Run in Docker"]
G --> H["scripts/act/run-act.sh<br/>starts act in background"]
H --> I["act spins up Docker container"]
I --> J["GitHub Action runs<br/>(build, test, lint)"]
J --> K{"Exit code?"}
end
subgraph heal ["Self-Heal Loop"]
K -- "❌ Fail" --> L["Read log output"]
L --> M["Diagnose & fix code"]
M --> H
end
K -- "✅ Pass" --> N
subgraph cleanup ["Step 4: Cleanup"]
N["Remove act_output.log"] --> O["Revert unintended changes"]
O --> P["Verify git diff"]
end
P --> Q["🚀 Ready to push / open PR"]
style prereqs fill:#1a1a2e,stroke:#16213e,color:#e0e0e0
style analyze fill:#1a1a2e,stroke:#16213e,color:#e0e0e0
style run fill:#1a1a2e,stroke:#16213e,color:#e0e0e0
style heal fill:#2d1b1b,stroke:#8b0000,color:#e0e0e0
style cleanup fill:#1a1a2e,stroke:#16213e,color:#e0e0e0After Setup
Once the skill has set up the repository, Jules can verify CI locally whenever it's given a coding task. The skill itself is no longer needed — everything Jules needs is in the repo.
Example Flow
1. Jules receives: "Refactor lib/utils.js and verify CI" 2. Jules reads AGENTS.md → sees "Local CI Verification" instructions 3. Jules runs bash scripts/act/run-act.sh "push -j test" 4. CI passes → Jules pushes / opens PR
Prerequisites
- Docker — Must be installed and running (preinstalled on Jules VMs)
- act — Installed automatically by
scripts/act/install-act.sh
Limitations
actdoes not support all GitHub Actions features (e.g., service containers, some caching)- Large Docker images can be slow to pull on first run
- Jobs requiring GitHub-specific secrets need a
.secretsfile
This is not an officially supported Google product.
Troubleshooting Local Action Verification
Docker Hub Rate Limits
Symptoms: Too Many Requests, pull access denied, or unauthorized errors in the log.
Fix: 1. Set DOCKER_USERNAME and DOCKER_PASSWORD environment variables. 2. Run: echo "$DOCKER_PASSWORD" | docker login --username "$DOCKER_USERNAME" --password-stdin 3. Re-run the action.
Image Pull Failures
Symptoms: Container not found, image download hangs, or architecture mismatch errors.
The default image catthehacker/ubuntu:act-latest is ~20GB. Alternatives:
| Image | Size | Best For |
|---|---|---|
catthehacker/ubuntu:act-latest | ~20GB | Full GitHub runner compatibility |
node:20-bookworm | ~1GB | Node.js-only workflows |
node:20-slim | ~200MB | Minimal Node.js (may miss system deps) |
To override, add -P ubuntu-latest=<image> to the act arguments:
./run-act.sh "push -j test -P ubuntu-latest=node:20-bookworm"ARM64 (Apple Silicon) Issues
act may pull amd64 images on ARM64 machines, causing slow emulation or crashes.
Fix: Use --container-architecture linux/amd64 explicitly, or pull an ARM64-native image if available.
Secrets and Environment Variables
Jobs that reference ${{ secrets.* }} will fail unless secrets are provided.
Fix: Create a .secrets file (KEY=VALUE format, one per line) and pass it:
./run-act.sh "push -j deploy --secret-file .secrets"⚠️ Never commit `.secrets`. Add it to .gitignore.File Permission Issues
act runs as root inside the container. This can cause permission changes to mounted files.
Symptoms: package-lock.json, node_modules, or other files modified after running.
Fix: Revert unintended changes:
git checkout package-lock.jsonTimeout / Hanging
Symptoms: run-act.sh runs past the timeout, or the process appears stuck.
Causes:
- A workflow step is waiting for user input
- A network resource is unreachable from inside the container
- The Docker image is still downloading (first run can take 10+ minutes)
Fixes: 1. Increase timeout: ACT_TIMEOUT=1200 ./run-act.sh "..." 2. Check act_output.log for the last step that ran 3. Kill stale containers: docker ps | grep act | awk '{print $1}' | xargs docker kill
Service Containers
act has limited support for services: in workflow files. Jobs using service containers (e.g., Postgres, Redis) may not work.
Workaround: Start the service manually before running act:
docker run -d --name test-postgres -p 5432:5432 -e POSTGRES_PASSWORD=test postgres:15
./run-act.sh "push -j test"
docker stop test-postgres && docker rm test-postgres#!/bin/bash
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Installs 'act' (https://github.com/nektos/act) for running GitHub Actions locally.
# Always installs the latest release.
# Usage: ./install-act.sh
set -euo pipefail
INSTALL_DIR="${HOME}/.local/bin"
echo "🔧 Installing act..."
# Detect platform
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m)
case "$ARCH" in
x86_64) ARCH="x86_64" ;;
aarch64) ARCH="arm64" ;;
arm64) ARCH="arm64" ;;
*)
echo "❌ Unsupported architecture: $ARCH"
exit 1
;;
esac
# Create install directory if it doesn't exist
mkdir -p "$INSTALL_DIR"
# Try system-wide install first, fall back to user-local
if command -v sudo &> /dev/null && sudo -n true 2>/dev/null; then
echo " Installing to /usr/local/bin (system-wide)..."
curl -sL https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo bash -s -- -b /usr/local/bin
else
echo " No sudo access. Installing to ${INSTALL_DIR} (user-local)..."
curl -sL https://raw.githubusercontent.com/nektos/act/master/install.sh | bash -s -- -b "$INSTALL_DIR"
# Ensure install dir is on PATH
if [[ ":$PATH:" != *":${INSTALL_DIR}:"* ]]; then
echo " ⚠️ ${INSTALL_DIR} is not on your PATH."
echo " Add this to your shell profile: export PATH=\"${INSTALL_DIR}:\$PATH\""
export PATH="${INSTALL_DIR}:$PATH"
fi
fi
# Verify installation
if command -v act &> /dev/null; then
echo "✅ act installed successfully: $(act --version)"
else
echo "❌ Installation failed. act not found on PATH."
exit 1
fi
#!/bin/bash
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Runs 'act' in the background with log polling to prevent agent timeouts.
# Usage: ./run-act.sh "<act arguments>"
# Example: ./run-act.sh "push -j build --matrix node-version:20.x"
set -euo pipefail
ACT_ARGS="${1:-}"
LOG_FILE="act_output.log"
TIMEOUT="${ACT_TIMEOUT:-600}" # Default: 10 minutes
POLL_INTERVAL="${ACT_POLL:-10}" # Default: 10 seconds
if [ -z "$ACT_ARGS" ]; then
echo "Error: No arguments provided."
echo "Usage: $0 \"<act arguments>\""
echo "Example: $0 \"push -j build --matrix node-version:20.x\""
exit 1
fi
# Check Docker is running
if ! docker info > /dev/null 2>&1; then
echo "❌ Docker is not running. Start Docker and try again."
exit 1
fi
# Check act is available
if ! command -v act &> /dev/null; then
echo "❌ 'act' is not installed. Run install-act.sh first."
exit 1
fi
echo "🚀 Starting: act ${ACT_ARGS}"
echo "📄 Logging to: ${LOG_FILE}"
echo "⏱️ Timeout: ${TIMEOUT}s | Poll: ${POLL_INTERVAL}s"
echo ""
# Run act in background
# Add default runner image only if the user didn't specify one via -P
if echo "$ACT_ARGS" | grep -q -- '-P '; then
act ${ACT_ARGS} > "$LOG_FILE" 2>&1 &
else
act ${ACT_ARGS} -P ubuntu-latest=catthehacker/ubuntu:act-latest > "$LOG_FILE" 2>&1 &
fi
ACT_PID=$!
echo "Process started (PID: ${ACT_PID})"
ELAPSED=0
# Poll log file while process is running
while kill -0 "$ACT_PID" 2>/dev/null; do
if [ $ELAPSED -ge $TIMEOUT ]; then
echo ""
echo "⏰ Timeout reached (${TIMEOUT}s). Killing act process..."
kill "$ACT_PID" 2>/dev/null || true
wait "$ACT_PID" 2>/dev/null || true
echo ""
echo "--- Full Log ---"
cat "$LOG_FILE" 2>/dev/null || true
echo "--- End Log ---"
exit 1
fi
sleep "$POLL_INTERVAL"
ELAPSED=$((ELAPSED + POLL_INTERVAL))
# Show last few lines as progress
echo "⏳ Running... (${ELAPSED}s/${TIMEOUT}s)"
tail -n 5 "$LOG_FILE" 2>/dev/null || true
echo ""
done
# Capture exit code
wait "$ACT_PID"
EXIT_CODE=$?
echo ""
echo "--- Full Execution Log ---"
cat "$LOG_FILE"
echo "--- End Log ---"
echo ""
if [ $EXIT_CODE -eq 0 ]; then
echo "✅ Local GitHub Actions passed."
exit 0
else
echo "❌ Local GitHub Actions failed (exit code: ${EXIT_CODE})."
exit 1
fi
Related skills
How it compares
Pick local-action-verification to bootstrap nektos/act for GitHub Actions YAML; use generic test skills for running Jest or pytest without workflow replication.
FAQ
What files does local-action-verification add to a repo?
local-action-verification copies install-act.sh and run-act.sh into scripts/act/ and adds a Local CI Verification section to AGENTS.md. Jules reads AGENTS.md to discover and run the scripts during coding tasks.
Which tool runs GitHub Actions locally in this skill?
local-action-verification uses nektos/act to execute GitHub Actions workflows on the developer machine. install-act.sh handles platform-aware installation and run-act.sh runs workflows in the background with log polling and timeout.
Is Local Action Verification safe to install?
skills.sh reports 1 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.