ワンクリックで
ci-workflow-authoring
GitHub Actions authoring for workflows, CI jobs, caches, artifacts, and failure triage.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
GitHub Actions authoring for workflows, CI jobs, caches, artifacts, and failure triage.
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 | ci-workflow-authoring |
| description | GitHub Actions authoring for workflows, CI jobs, caches, artifacts, and failure triage. |
Four GitHub Actions workflows live in .github/workflows/:
| Workflow | Trigger | Purpose |
|---|---|---|
ci.yml | Push/PR to main, daily schedule, manual dispatch | Main validation pipeline: build, static analysis, release verification, coverage, Rust lanes, benchmarks, Android E2E, soak/load, Linux TUN |
codeql.yml | Push/PR to main, weekly schedule | CodeQL analysis for GitHub Actions; Kotlin analysis is intentionally disabled for now |
release.yml | Tag v* or manual dispatch | Signed release build, artifact upload, optional GitHub Release |
mutation-testing.yml | Weekly Monday 06:00 UTC, manual dispatch | Rust mutation testing via cargo-mutants |
ci.yml)build
-> static-analysis
-> release-verification
-> coverage
-> rust-network-e2e
-> cli-packet-smoke
-> android-instrumented-tests
-> rust-turmoil
-> rust-criterion-bench
-> android-macrobenchmark
-> rust-loom
rust-native-soak
rust-native-load
nightly-rust-coverage
android-network-e2e
linux-tun-e2e
linux-tun-soak
android-network-e2e also runs on regular CI, but Maestro/Appium smoke add-ons are gated behind workflow_dispatch inputs.
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
This is per-ref cancellation, not per-workflow-name cancellation.
Most Android/native jobs follow this skeleton:
steps:
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 17
- uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.96.0"
components: rustfmt, clippy
- uses: android-actions/setup-android@v4
- uses: Swatinem/rust-cache@v2
with:
workspaces: native/rust -> target
cache-on-failure: true
- name: Read native toolchain policy
id: native-toolchain
run: |
echo "ndk=$(grep '^ripdpi.nativeNdkVersion=' gradle.properties | cut -d= -f2-)" >> "$GITHUB_OUTPUT"
- name: Install Rust Android targets
run: rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android
- name: Install NDK
run: sdkmanager --install "ndk;${{ steps.native-toolchain.outputs.ndk }}"
- uses: gradle/actions/setup-gradle@v6
For native-heavy Android jobs, mozilla-actions/sccache-action@v0.0.9 is added before Gradle runs.
| Cache | Implementation | Notes |
|---|---|---|
| Gradle | gradle/actions/setup-gradle@v6 | Preferred over hand-rolled cache blocks |
| Rust workspace | Swatinem/rust-cache@v2 | Caches native/rust -> target |
| Rust compiler cache | mozilla-actions/sccache-action@v0.0.9 | Used on native-heavy jobs |
| Benchmark baselines | actions/cache/restore / save | Used by criterion baselines on PRs and main |
| Tool installs | taiki-e/install-action@v2 | Used for cargo-nextest, cargo-llvm-cov, cargo-bloat |
ci.yml currently exposes:
workflow_dispatch:
inputs:
soak_profile: smoke|full
run_maestro_smoke: true|false
run_appium_smoke: true|false
If you add a new manual-only lane, wire its input into both the job if: condition and the step logic that consumes it.
Checklist:
ci.yml, release.yml, mutation-testing.yml, or codeql.yml.gradle.properties; never hardcode it in YAML.timeout-minutes unless the job is trivially short.if: always() on artifact upload steps.schedule or workflow_dispatch.:app or :baselineprofile instrumented tests, use the Gradle Managed Device pattern: a <device>...AndroidTest task plus the shared device registry in build-logic/convention/src/main/kotlin/RipDpiManagedDevices.kt (see the android-instrumented-tests and android-macrobenchmark jobs). Specialized emulator lanes (journeys, relay-smoke, network-e2e) still use the scripts/ci/start-android-emulator.sh harness.my-new-job:
needs: [build]
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 17
- name: Run tests
run: ./gradlew :module:testDebugUnitTest
- uses: actions/upload-artifact@v7
if: always()
with:
name: my-results
path: module/build/reports/
retention-days: 7
codeql.yml)language: actions.github/codeql-action supports the repo's Kotlin 2.3.20 toolchain.release.yml)Triggered by v* tags or manual dispatch.
Key behaviors:
./gradlew bundleRelease -Pripdpi.enableAbiSplits=false then ./gradlew assembleRelease.See release-signing for signing and R8 details.
mutation-testing.yml)cargo-mutants against the Rust workspace.target/mutants-output/ artifacts.| Mistake | Fix |
|---|---|
| Hardcoding the NDK version | Read ripdpi.nativeNdkVersion from gradle.properties |
| Using outdated action versions from old workflow snippets | Match the versions already used in this repo (checkout@v6, setup-java@v5, setup-gradle@v6, etc.) |
| Forgetting schedule/manual gating on soak or load jobs | Mirror the existing `schedule |
| Uploading artifacts only on success | Use if: always() so failure artifacts are preserved |
| Treating CodeQL as if Kotlin were enabled | The current workflow analyzes only GitHub Actions files |
| Hand-rolling emulator setup for instrumented tests | Use the Gradle Managed Device pattern (RipDpiManagedDevices.kt + a <device>...AndroidTest task); reserve scripts/ci/start-android-emulator.sh for the journeys/relay/network-e2e lanes |
.github/skills/local-ci-act/SKILL.md -- Local workflow execution with act.github/skills/release-signing/SKILL.md -- Release signing and R8 details.github/skills/dependency-update/SKILL.md -- Version changes that affect workflow setup