원클릭으로
local-ci-act
Local GitHub Actions checks with act and workflow wiring triage on macOS.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Local GitHub Actions checks with act and workflow wiring triage on macOS.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Use this skill to generate well-branded interfaces and assets for RIPDPI (an Android-native, Compose-first VPN and DPI-bypass app), either for production or throwaway prototypes/mocks/etc. Contains essential design guidelines, colors, type, fonts, brand-ship icons, and an interactive UI kit of every public composable from the live ui/components tree.
Use when managing the Rust workspace, adding/removing crates, editing workspace dependencies, running cargo nextest/audit/deny, configuring Cargo profiles for Android cross-compilation, debugging Cargo.lock churn, migrating crate edition, or wiring Gradle to cargo via the ripdpi.android.rust-native plugin.
Use when modifying the diagnostics scan pipeline, ScanRequest/ScanReport types, ProbeTask families, ripdpi-monitor-engine / ripdpi-diagnostics-* crates, strategy-probe candidates, the diagnostics catalog (packs/profiles), wire-schema contracts between Rust and Kotlin, DIAGNOSTICS_ENGINE_SCHEMA_VERSION, golden contract tests, or adding a new probe type / profile. Triggers on diagnostics scans, strategy probes, automatic audit, dpi-detector profiles, or anything in core/diagnostics or native/rust/crates/ripdpi-monitor-*.
Android-specific Rust build, verification, and packaging — per-target 16 KiB page alignment, size-optimized release profile, ELF symbol allowlist, .so size budgets, NDK 29 specifics. Use when modifying .cargo/config.toml for Android targets, the workspace [profile.release] / [profile.android-jni] block, or when verifying a built .so before release.
Telemetry and observability discipline for the RIPDPI Android Rust stack — control-plane vs data-plane logging, bounded flume event queues, atomic counters, snapshot polling, readiness callbacks, and deterministic JSON contracts. Use when authoring or modifying telemetry emission code, the bounded event ring, the Kotlin-side telemetry consumer, or any per-packet logging.
Custom detekt rules, DI/privacy/suppression guardrails, detekt.yml configuration, and false-positive triage.
| name | local-ci-act |
| description | Local GitHub Actions checks with act and workflow wiring triage on macOS. |
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.
brew install act.actrc already forces linux/amd64scripts/ci/act-local.sh currently wraps this subset of ci.yml:
| Job | Wrapped | Notes |
|---|---|---|
build | Yes | Best first local parity check |
static-analysis | Yes | Covers Gradle plus Rust static checks |
rust-network-e2e | Yes | Lightest repo-owned network lane |
rust-native-soak | Yes* | Uses the dispatch payload helper |
*rust-native-soak requires a workflow_dispatch event payload, which the wrapper selects automatically.
These jobs exist in CI but are not curated by the wrapper yet:
| Job | Practical on macOS with act | Preferred local fallback |
|---|---|---|
release-verification | Likely | ./gradlew :app:assembleRelease |
cli-packet-smoke | Maybe | bash scripts/ci/run-cli-packet-smoke.sh |
rust-turmoil | Likely | bash scripts/ci/run-rust-turmoil-tests.sh |
coverage | Heavy | ./gradlew coverageReport plus the CI-scoped bash scripts/ci/run-rust-coverage.sh |
rust-criterion-bench | Likely | cd native/rust && cargo bench --locked --package ripdpi-bench |
android-macrobenchmark | No | Needs emulator/KVM; use GitHub CI or a native Linux host |
android-instrumented-tests | No | GMD instrumented-test matrix; needs emulator/KVM -- use GitHub CI |
rust-loom | Likely | cd native/rust && cargo test --locked --features loom -- loom |
rust-native-load | Maybe | bash scripts/ci/run-rust-native-load.sh |
nightly-rust-coverage | Heavy | Use the repo coverage scripts directly |
android-network-e2e | No | Run on a local emulator outside Docker |
linux-tun-e2e | No | Use CI or a Linux VM |
linux-tun-soak | No | Use 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.
# 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
The repo uses catthehacker/ubuntu:full-latest in .actrc.
Why:
Rust toolchains, NDK packages, and most cargo tools are still installed by workflow steps.
| Action | Works in act | Notes |
|---|---|---|
actions/checkout@v6 | Yes | Mounts the local repo |
actions/setup-java@v5 | Yes | Downloads JDK |
dtolnay/rust-toolchain@master | Yes | Installs Rust |
android-actions/setup-android@v4 | Yes | Sets up SDK paths |
Swatinem/rust-cache@v2 | Yes | Works well for the native workspace |
gradle/actions/setup-gradle@v6 | Yes | Preferred Gradle cache/setup path |
taiki-e/install-action@v2 | Yes | Installs cargo tools |
EmbarkStudios/cargo-deny-action@v2 | Yes | Runs cargo-deny |
actions/upload-artifact@v7 | No-op | Expected locally |
reactivecircus/android-emulator-runner@v2 | No | Requires KVM |
github/codeql-action/* | Mixed | Fine for YAML wiring checks; low value for daily local use |
| Symptom | Cause | Fix |
|---|---|---|
GITHUB_OUTPUT: No such file or directory | Old act version | brew upgrade act |
sdkmanager: command not found | Wrong image | Ensure .actrc still points to full-latest |
| Gradle OOM / build killed | Docker memory too low | Raise Docker Desktop memory to 8 GB or more |
| Container architecture mismatch | Apple Silicon without the repo .actrc settings | Keep the existing linux/amd64 override |
| Dispatch jobs skipped | Wrong event payload | Use .github/act/event-dispatch.json |
upload-artifact warnings | Expected | Ignore locally |
| Rust target not found | Workflow has not installed targets yet | Wait for the toolchain steps or preinstall locally |
| NDK download is slow | First-run cost | Subsequent runs are faster with cached layers |
The repo stores three payload stubs in .github/act/:
| File | Simulates | Used by |
|---|---|---|
event-push.json | push to main | wrapped push-style jobs |
event-pr.json | PR synchronize | manual PR-shape experiments |
event-dispatch.json | manual dispatch | rust-native-soak and other workflow-dispatch experiments |
The wrapper script selects the matching payload automatically for the jobs it knows about.
RUNNER_TEMP is set by the wrapper to /tmp/runner-temp.