一键导入
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