agentsclimarketplace

Ci cd android

Skill piyushverma0/android-agent-skills/skills/ci-cd-android

27 Android skills for AI agents (Claude Code, Codex, Cursor). Fixes Supabase auth, Hilt errors, design inconsistency, kapt→ksp, missing UiState states. Reduced my token bills 5×. FitGenZ AI shipped in 18 days.

Install
npx -y skills add piyushverma0/android-agent-skills --skill ci-cd-android

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 14 stars14 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

CI/CD pipeline for Android AI agents. Use this skill whenever setting up GitHub Actions for Android, automated testing in CI, APK/AAB build automation, Play Store deployment automation, Fastlane for Android, code quality checks in CI, lint in pipeline, unit test automation, instrumented test automation, Firebase Test Lab integration, code signing in CI, artifact upload, pull request checks, or any continuous integration/deployment for Android.

SKILL.md

5.1 KB, as published. Nobody here has run it

CI/CD for Android

GitHub Actions — complete workflow

# .github/workflows/ci.yml
name: Android CI

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main, develop]

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true  # cancel in-progress runs on new push

jobs:
  lint:
    name: Lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: 17
      - uses: gradle/actions/setup-gradle@v4
      - name: Run lint
        run: ./gradlew lint --continue
      - name: Upload lint results
        if: failure()
        uses: actions/upload-artifact@v4
        with:
          name: lint-results
          path: '**/build/reports/lint-results-*.html'

  unit-test:
    name: Unit Tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: 17
      - uses: gradle/actions/setup-gradle@v4
      - name: Run unit tests
        run: ./gradlew testDebugUnitTest --continue
      - name: Upload test results
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: unit-test-results
          path: '**/build/test-results/**/*.xml'

  build:
    name: Build
    needs: [lint, unit-test]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: 17
      - uses: gradle/actions/setup-gradle@v4
      - name: Build debug APK
        run: ./gradlew assembleProdDebug
      - name: Upload APK
        uses: actions/upload-artifact@v4
        with:
          name: debug-apk
          path: app/build/outputs/apk/prod/debug/*.apk

  deploy-internal:
    name: Deploy to Internal Testing
    needs: build
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    environment: production
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: 17
      - uses: gradle/actions/setup-gradle@v4
      - name: Decode keystore
        run: echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > keystore.jks
      - name: Build release AAB
        env:
          KEYSTORE_PATH: ${{ github.workspace }}/keystore.jks
          KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
          KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
          KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
        run: ./gradlew bundleProdRelease
      - name: Upload to Play Store (Internal)
        uses: r0adkll/upload-google-play@v1
        with:
          serviceAccountJsonPlainText: ${{ secrets.PLAY_SERVICE_ACCOUNT_JSON }}
          packageName: com.company.app
          releaseFiles: app/build/outputs/bundle/prodRelease/*.aab
          track: internal
          status: completed

Rule 2: Required secrets setup

GitHub Secrets needed:
  KEYSTORE_BASE64          → base64 of your .jks file: base64 -i keystore.jks | pbcopy
  KEYSTORE_PASSWORD        → keystore password
  KEY_ALIAS                → key alias
  KEY_PASSWORD             → key password
  PLAY_SERVICE_ACCOUNT_JSON → Google Play service account JSON with Editor permissions

Rule 3: Gradle caching for faster CI

# Add to every job that uses Gradle
- uses: gradle/actions/setup-gradle@v4
  with:
    cache-read-only: ${{ github.ref != 'refs/heads/main' }}
# Saves 3-5 minutes per run

Rule 4: Instrumented tests on Firebase Test Lab

- name: Run instrumented tests on Firebase Test Lab
  uses: google-github-actions/auth@v2
  with:
    credentials_json: ${{ secrets.GCP_SERVICE_ACCOUNT_JSON }}
- run: |
    gcloud firebase test android run \
      --type instrumentation \
      --app app/build/outputs/apk/debug/*.apk \
      --test app/build/outputs/apk/androidTest/debug/*.apk \
      --device model=Pixel6,version=33 \
      --device model=Pixel_Tablet,version=33 \
      --timeout 15m

Common Mistakes

❌ Committing keystore or passwords — always use GitHub Secrets ❌ No concurrency: group — multiple PRs queue up unnecessarily ❌ Running tests before lint — lint is faster, fail fast ❌ No Gradle caching — every CI run downloads all dependencies ❌ Building unsigned APK for Play Store — AAB must be signed ❌ Uploading APK instead of AAB — Play Store requires AAB since 2021

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.