
Github Actions
Stand up a reusable GitHub Actions composite action that builds React Native Android emulator APKs and uploads artifacts you can pull with gh or the REST API.
Overview
GitHub Actions Builds is an agent skill for the Ship phase that templates a React Native Android emulator composite action for GitHub Actions and documents artifact upload and retrieval via gh or the API.
Install
npx skills add https://github.com/callstackincubator/agent-skills --skill github-actionsWhat is this skill?
- Composite action template at `.github/actions/github-actions/android-build/action.yml` for RN CLI Android emulator APKs
- Configurable inputs including `working-directory` and `variant` (Debug by default for emulator flows)
- Action outputs `artifact-name`, `artifact-id`, and `artifact-url` for downstream jobs
- Documented artifact retrieval patterns using GitHub CLI and the REST API
- Prerequisites checklist: Linux runner, JDK 17, Android SDK, Gradle wrapper, and installed RN dependencies
- Composite action path: `.github/actions/github-actions/android-build/action.yml`
- Three documented action outputs: `artifact-name`, `artifact-id`, `artifact-url`
- Default emulator-oriented Gradle `variant`: Debug
Adoption & trust: 4k installs on skills.sh; 1.4k GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
You need repeatable GitHub Actions jobs that build React Native Android emulator APKs and expose artifact IDs and URLs you can actually fetch in later steps.
Who is it for?
Indie React Native CLI maintainers setting up first-class Android emulator CI on GitHub-hosted Linux runners.
Skip if: Teams that only build locally, need iOS/simulator pipelines, or want production signing and store release automation without extending this template.
When should I use this skill?
Need cloud Android emulator build artifacts for testing, configurable debug-style builds from one action, or reliable artifact retrieval through gh and the REST API.
What do I get? / Deliverables
You get a copy-paste composite action, wired workflow inputs/outputs, and uploaded emulator build artifacts ready for test jobs or manual download.
- Composite `action.yml` under `.github/actions/github-actions/android-build/`
- Uploaded Android emulator APK artifact with name, ID, and URL outputs for downstream jobs
Recommended Skills
Journey fit
Automated emulator builds and artifact handoff are part of shipping safely—getting testable binaries out of CI before release and ongoing validation. Launch under Ship is where solo builders wire CI/CD and repeatable build pipelines, not one-off local Gradle runs.
How it compares
Use as an in-repo composite-action recipe—not a hosted CI product or a generic workflow marketplace plug-in.
Common Questions / FAQ
Who is github-actions for?
Solo and small-team React Native builders who use GitHub Actions and want standardized Android emulator APK builds with clear artifact outputs.
When should I use github-actions?
Use it during Ship when you are wiring CI launch prep: you need cloud emulator artifacts, a single reusable action with a Debug default variant, or dependable `gh`/REST downloads for downstream QA jobs.
Is github-actions safe to install?
Treat it like any third-party agent skill: review the Security Audits panel on this Prism page and inspect the composite action YAML and permissions before enabling workflows that touch secrets or production branches.
SKILL.md
READMESKILL.md - Github Actions
interface: display_name: "GitHub Actions Builds" short_description: "React Native GitHub Actions simulator/emulator build artifact patterns" default_prompt: "Use $github-actions to set up React Native GitHub Actions builds and download artifacts with gh or API." --- title: Android Emulator Composite Action (RN CLI) impact: HIGH tags: android, emulator, github-actions, react-native, gradle, artifact --- # Skill: Android Emulator Composite Action (RN CLI) Composite action template for building React Native Android emulator APKs in GitHub Actions and uploading the resulting artifact. ## Quick Config 1. Create `.github/actions/github-actions/android-build/action.yml`. 2. Copy the template below. 3. Set `variant` (for emulator flows, use `Debug` by default). 4. Use action outputs (`artifact-name`, `artifact-id`, `artifact-url`) in downstream jobs. ## When to Use - Need cloud Android emulator build artifacts for testing. - Need configurable debug-style builds from one action. - Need reliable artifact retrieval through `gh` and REST API. ## Prerequisites - Linux runner with JDK 17. - React Native dependencies installed. - Android SDK and Gradle wrapper available in the repository. ## Template (`.github/actions/github-actions/android-build/action.yml`) ```yaml name: React Native Android Emulator Build description: Build React Native Android emulator APK in GitHub Actions and upload artifact inputs: working-directory: description: Project root required: false default: "." variant: description: Build variant (Debug by default for emulator flows) required: false default: Debug artifact-prefix: description: Prefix for artifact naming required: false default: rn-android-emulator custom-identifier: description: Optional stable identifier (PR number, channel, etc.) required: false artifact-retention-days: description: GitHub artifact retention required: false default: "7" outputs: artifact-name: description: Uploaded artifact name value: ${{ steps.names.outputs.artifact_name }} artifact-id: description: Uploaded artifact id value: ${{ steps.upload.outputs.artifact-id }} artifact-url: description: Uploaded artifact URL value: ${{ steps.upload.outputs.artifact-url }} runs: using: composite steps: - name: Resolve Android project settings id: resolve shell: bash working-directory: ${{ inputs.working-directory }} run: | set -euo pipefail CONFIG_JSON="$(npx react-native config)" ANDROID_SOURCE_DIR="$(printf '%s' "$CONFIG_JSON" | node -e "const fs=require('fs');const j=JSON.parse(fs.readFileSync(0,'utf8'));process.stdout.write(j.project?.android?.sourceDir || 'android')")" APP_NAME="$(printf '%s' "$CONFIG_JSON" | node -e "const fs=require('fs');const j=JSON.parse(fs.readFileSync(0,'utf8'));process.stdout.write(j.project?.android?.appName || 'app')")" IDENTIFIER="${{ inputs.custom-identifier }}" if [[ -z "$IDENTIFIER" ]]; then if [[ "${{ github.event_name }}" == "pull_request" ]]; then IDENTIFIER="pr-${{ github.event.pull_request.number }}" else IDENTIFIER="${GITHUB_SHA::7}" fi fi echo "android_source_dir=$ANDROID_SOURCE_DIR" >> "$GITHUB_OUTPUT" echo "app_name=$APP_NAME" >> "$GITHUB_OUTPUT" echo "identifier=$IDENTIFIER" >> "$GITHUB_OUTPUT" - name: Build Android APK id: build shell: bash working-directory: ${{ inputs.working-directory }} run: | set -euo pipefail VARIANT="${{ inputs.variant }}" VARIANT_LOWER="$(echo "$VARIANT" | tr '[:upper:]' '[:lower:]')" GRADLE_TASK="assemble${VARIANT}" ( cd "${{ steps.resolve.outputs.android_source_dir }}" ./gradlew ":${{ steps.resolve.outputs.app_name }}:${GRADLE_TASK}" ) OUTPUT_ROOT="${{ steps.resolve.outputs.android_source_d