Local CI with act

SkillDev tools

Local GitHub Actions checks with act and workflow wiring triage on macOS.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Local CI with act skill

What this skill tells your AI

The instructions your AI receives, as published by po4yka/ripdpi in .agents/skills/local-ci-act/SKILL.md and read by ahel’s review.

Overview

Use act for local workflow parsing and a narrow subset of practical CI-parity jobs. Do not assume every GitHub-hosted Ubuntu lane is worth reproducing inside Docker on macOS.

Prerequisites

  • act: brew install act
  • Docker Desktop: running with at least 8 GB memory
  • Apple Silicon: .actrc already forces linux/amd64

Wrapper Coverage

scripts/ci/act-local.sh --list is the source of truth for currently wrapped, native-fallback, and intentionally skipped lanes. Do not copy that changing matrix into this skill.

Workflow Surface Outside The Wrapper

These jobs exist in CI but are not curated by the wrapper yet:

JobPractical on macOS with actPreferred local fallback
release-verificationLikelyuse the flavor-qualified release tasks from the current workflow
cli-packet-smokeMaybebash scripts/ci/run-cli-packet-smoke.sh
rust-turmoilLikelybash scripts/ci/run-rust-turmoil-tests.sh
coverageHeavy./gradlew coverageReport plus the CI-scoped bash scripts/ci/run-rust-coverage.sh
rust-criterion-benchLikelycd native/rust && cargo bench --locked --package ripdpi-bench
android-macrobenchmarkNoNeeds emulator/KVM; use GitHub CI or a native Linux host
android-instrumented-testsNoGMD instrumented-test matrix; needs emulator/KVM -- use GitHub CI
rust-loomLikelycd native/rust && cargo test --locked --features loom -- loom
rust-native-loadMaybebash scripts/ci/run-rust-native-load.sh
nightly-rust-coverageHeavyUse the repo coverage scripts directly
android-network-e2eNoRun on a local emulator outside Docker
linux-tun-e2eNoUse CI or a Linux VM
linux-tun-soakNoUse CI or a Linux VM

codeql.yml, release.yml, and mutation-testing.yml are separate workflows. Use act -W <workflow> manually only when you specifically need local workflow parsing or action wiring validation.

Quick Start

# Show the wrapper's supported jobs
scripts/ci/act-local.sh --list

# Run one wrapped job
scripts/ci/act-local.sh build
scripts/ci/act-local.sh rust-network-e2e

# Run all wrapped jobs
scripts/ci/act-local.sh --all

# Manual dry run for a workflow/job outside the wrapper
act -n -j release-verification -W .github/workflows/ci.yml

Docker Image Configuration

The repo uses catthehacker/ubuntu:full-latest in .actrc.

Why:

  • includes JDK
  • includes Android SDK command-line tools
  • is a better fit for Gradle plus Android builds than the minimal act image

Rust toolchains, NDK packages, and most cargo tools are still installed by workflow steps.

Third-party action handling

Run the exact action SHAs and versions committed in the current workflow. Do not maintain a tag-based compatibility table here. Artifact upload is normally a local no-op, emulator actions still require host virtualization, and CodeQL actions have limited value in daily local runs.

Troubleshooting

SymptomCauseFix
GITHUB_OUTPUT: No such file or directoryOld act versionbrew upgrade act
sdkmanager: command not foundWrong imageEnsure .actrc still points to full-latest
Gradle OOM / build killedDocker memory too lowRaise Docker Desktop memory to 8 GB or more
Container architecture mismatchApple Silicon without the repo .actrc settingsKeep the existing linux/amd64 override
Dispatch jobs skippedWrong event payloadUse .github/act/event-dispatch.json
upload-artifact warningsExpectedIgnore locally
Rust target not foundWorkflow has not installed targets yetWait for the toolchain steps or preinstall locally
NDK download is slowFirst-run costSubsequent runs are faster with cached layers

Event Payloads

The repo stores three payload stubs in .github/act/:

FileSimulatesUsed by
event-push.jsonpush to mainwrapped push-style jobs
event-pr.jsonPR synchronizemanual PR-shape experiments
event-dispatch.jsonmanual dispatchrust-native-soak and other workflow-dispatch experiments

The wrapper script selects the matching payload automatically for the jobs it knows about.

Gotchas

  • Concurrency groups are ignored locally.
  • RUNNER_TEMP is set by the wrapper to /tmp/runner-temp.
  • Artifact actions are no-ops; outputs stay in the container filesystem.
  • Secrets are absent, so signing and release jobs are poor candidates for local act parity.
  • First run is slow because Docker images and actions must be pulled.

Signals

GitHub stars
69
Forks
4
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
local-ci-act
Source
github.com/po4yka/ripdpi