{"id":"71b939c8-e5f2-4c3d-948a-ec18d45b7746","shortId":"S2huZK","kind":"skill","title":"ci-cd-android","tagline":"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.","description":"# CI/CD for Android\r\n\r\n## GitHub Actions — complete workflow\r\n\r\n```yaml\r\n# .github/workflows/ci.yml\r\nname: Android CI\r\n\r\non:\r\n  push:\r\n    branches: [main, develop]\r\n  pull_request:\r\n    branches: [main, develop]\r\n\r\nconcurrency:\r\n  group: ${{ github.workflow }}-${{ github.ref }}\r\n  cancel-in-progress: true  # cancel in-progress runs on new push\r\n\r\njobs:\r\n  lint:\r\n    name: Lint\r\n    runs-on: ubuntu-latest\r\n    steps:\r\n      - uses: actions/checkout@v4\r\n      - uses: actions/setup-java@v4\r\n        with:\r\n          distribution: temurin\r\n          java-version: 17\r\n      - uses: gradle/actions/setup-gradle@v4\r\n      - name: Run lint\r\n        run: ./gradlew lint --continue\r\n      - name: Upload lint results\r\n        if: failure()\r\n        uses: actions/upload-artifact@v4\r\n        with:\r\n          name: lint-results\r\n          path: '**/build/reports/lint-results-*.html'\r\n\r\n  unit-test:\r\n    name: Unit Tests\r\n    runs-on: ubuntu-latest\r\n    steps:\r\n      - uses: actions/checkout@v4\r\n      - uses: actions/setup-java@v4\r\n        with:\r\n          distribution: temurin\r\n          java-version: 17\r\n      - uses: gradle/actions/setup-gradle@v4\r\n      - name: Run unit tests\r\n        run: ./gradlew testDebugUnitTest --continue\r\n      - name: Upload test results\r\n        if: always()\r\n        uses: actions/upload-artifact@v4\r\n        with:\r\n          name: unit-test-results\r\n          path: '**/build/test-results/**/*.xml'\r\n\r\n  build:\r\n    name: Build\r\n    needs: [lint, unit-test]\r\n    runs-on: ubuntu-latest\r\n    steps:\r\n      - uses: actions/checkout@v4\r\n      - uses: actions/setup-java@v4\r\n        with:\r\n          distribution: temurin\r\n          java-version: 17\r\n      - uses: gradle/actions/setup-gradle@v4\r\n      - name: Build debug APK\r\n        run: ./gradlew assembleProdDebug\r\n      - name: Upload APK\r\n        uses: actions/upload-artifact@v4\r\n        with:\r\n          name: debug-apk\r\n          path: app/build/outputs/apk/prod/debug/*.apk\r\n\r\n  deploy-internal:\r\n    name: Deploy to Internal Testing\r\n    needs: build\r\n    runs-on: ubuntu-latest\r\n    if: github.ref == 'refs/heads/main'\r\n    environment: production\r\n    steps:\r\n      - uses: actions/checkout@v4\r\n      - uses: actions/setup-java@v4\r\n        with:\r\n          distribution: temurin\r\n          java-version: 17\r\n      - uses: gradle/actions/setup-gradle@v4\r\n      - name: Decode keystore\r\n        run: echo \"${{ secrets.KEYSTORE_BASE64 }}\" | base64 -d > keystore.jks\r\n      - name: Build release AAB\r\n        env:\r\n          KEYSTORE_PATH: ${{ github.workspace }}/keystore.jks\r\n          KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}\r\n          KEY_ALIAS: ${{ secrets.KEY_ALIAS }}\r\n          KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}\r\n        run: ./gradlew bundleProdRelease\r\n      - name: Upload to Play Store (Internal)\r\n        uses: r0adkll/upload-google-play@v1\r\n        with:\r\n          serviceAccountJsonPlainText: ${{ secrets.PLAY_SERVICE_ACCOUNT_JSON }}\r\n          packageName: com.company.app\r\n          releaseFiles: app/build/outputs/bundle/prodRelease/*.aab\r\n          track: internal\r\n          status: completed\r\n```\r\n\r\n## Rule 2: Required secrets setup\r\n\r\n```\r\nGitHub Secrets needed:\r\n  KEYSTORE_BASE64          → base64 of your .jks file: base64 -i keystore.jks | pbcopy\r\n  KEYSTORE_PASSWORD        → keystore password\r\n  KEY_ALIAS                → key alias\r\n  KEY_PASSWORD             → key password\r\n  PLAY_SERVICE_ACCOUNT_JSON → Google Play service account JSON with Editor permissions\r\n```\r\n\r\n## Rule 3: Gradle caching for faster CI\r\n\r\n```yaml\r\n# Add to every job that uses Gradle\r\n- uses: gradle/actions/setup-gradle@v4\r\n  with:\r\n    cache-read-only: ${{ github.ref != 'refs/heads/main' }}\r\n# Saves 3-5 minutes per run\r\n```\r\n\r\n## Rule 4: Instrumented tests on Firebase Test Lab\r\n\r\n```yaml\r\n- name: Run instrumented tests on Firebase Test Lab\r\n  uses: google-github-actions/auth@v2\r\n  with:\r\n    credentials_json: ${{ secrets.GCP_SERVICE_ACCOUNT_JSON }}\r\n- run: |\r\n    gcloud firebase test android run \\\r\n      --type instrumentation \\\r\n      --app app/build/outputs/apk/debug/*.apk \\\r\n      --test app/build/outputs/apk/androidTest/debug/*.apk \\\r\n      --device model=Pixel6,version=33 \\\r\n      --device model=Pixel_Tablet,version=33 \\\r\n      --timeout 15m\r\n```\r\n\r\n## Common Mistakes\r\n\r\n❌ Committing keystore or passwords — always use GitHub Secrets\r\n❌ No `concurrency:` group — multiple PRs queue up unnecessarily\r\n❌ Running tests before lint — lint is faster, fail fast\r\n❌ No Gradle caching — every CI run downloads all dependencies\r\n❌ Building unsigned APK for Play Store — AAB must be signed\r\n❌ Uploading APK instead of AAB — Play Store requires AAB since 2021","tags":["android","agent","skills","piyushverma0","agent-skills","ai-agent","antigravity","claude-code","codex","cursor","gemini-cli","hilt"],"capabilities":["skill","source-piyushverma0","skill-ci-cd-android","topic-agent-skills","topic-ai-agent","topic-android","topic-antigravity","topic-claude-code","topic-codex","topic-cursor","topic-gemini-cli","topic-hilt","topic-jetpack-compose","topic-kotlin","topic-material3"],"categories":["android-agent-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/piyushverma0/android-agent-skills/ci-cd-android","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add piyushverma0/android-agent-skills","source_repo":"https://github.com/piyushverma0/android-agent-skills","install_from":"skills.sh"}},"qualityScore":"0.454","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 8 github stars · SKILL.md body (4,685 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:09:09.054Z","embedding":null,"createdAt":"2026-05-18T13:14:48.530Z","updatedAt":"2026-05-18T19:09:09.054Z","lastSeenAt":"2026-05-18T19:09:09.054Z","tsv":"'-5':401 '/auth':427 '/build/reports/lint-results-':126 '/build/test-results':181 '/gradlew':108,162,219,305 '/keystore.jks':291 '15m':462 '17':100,153,210,269 '18':36 '2':332 '2021':519 '27':5 '3':375,400 '33':454,460 '4':406 '5':31 'aab':286,326,505,513,517 'account':320,364,369,434 'action':42,426 'actions/checkout':89,142,199,258 'actions/setup-java':92,145,202,261 'actions/upload-artifact':118,172,225 'add':382 'agent':10 'ai':9,33 'alia':297,299,355,357 'alway':170,469 'android':4,6,40,48,440 'apk':217,223,231,234,446,449,501,510 'app':444 'app/build/outputs/apk/androidtest/debug':448 'app/build/outputs/apk/debug':445 'app/build/outputs/apk/prod/debug':233 'app/build/outputs/bundle/prodrelease':325 'assembleproddebug':220 'auth':17 'base64':279,280,340,341,346 'bill':30 'branch':52,57 'build':183,185,215,244,284,499 'bundleprodreleas':306 'cach':377,394,492 'cache-read-on':393 'cancel':65,69 'cancel-in-progress':64 'cd':3 'ci':2,49,380,494 'ci-cd-android':1 'ci/cd':38 'claud':11 'code':12 'codex':13 'com.company.app':323 'commit':465 'common':463 'complet':43,330 'concurr':60,474 'continu':110,164 'credenti':430 'cursor':14 'd':281 'day':37 'debug':216,230 'debug-apk':229 'decod':274 'depend':498 'deploy':236,239 'deploy-intern':235 'design':20 'develop':54,59 'devic':450,455 'distribut':95,148,205,264 'download':496 'echo':277 'editor':372 'env':287 'environ':254 'error':19 'everi':384,493 'fail':488 'failur':116 'fast':489 'faster':379,487 'file':345 'firebas':410,419,438 'fitgenz':32 'fix':15 'gcloud':437 'github':41,336,425,471 'github.ref':63,252,397 'github.workflow':62 'github.workspace':290 'github/workflows/ci.yml':46 'googl':366,424 'google-github-act':423 'gradl':376,388,491 'gradle/actions/setup-gradle':102,155,212,271,390 'group':61,475 'hilt':18 'html':127 'in-progress':70 'inconsist':21 'instead':511 'instrument':407,416,443 'intern':237,241,312,328 'java':98,151,208,267 'java-vers':97,150,207,266 'jks':344 'job':77,385 'json':321,365,370,431,435 'kapt':22 'key':296,300,354,356,358,360 'keystor':275,288,292,339,350,352,466 'keystore.jks':282,348 'ksp':23 'lab':412,421 'latest':86,139,196,250 'lint':78,80,106,109,113,123,187,484,485 'lint-result':122 'main':53,58 'minut':402 'miss':24 'mistak':464 'model':451,456 'multipl':476 'must':506 'name':47,79,104,111,121,131,157,165,175,184,214,221,228,238,273,283,307,414 'need':186,243,338 'new':75 'packagenam':322 'password':293,295,301,303,351,353,359,361,468 'path':125,180,232,289 'pbcopi':349 'per':403 'permiss':373 'pixel':457 'pixel6':452 'play':310,362,367,503,514 'product':255 'progress':67,72 'prs':477 'pull':55 'push':51,76 'queue':478 'r0adkll/upload-google-play':314 'read':395 'reduc':27 'refs/heads/main':253,398 'releas':285 'releasefil':324 'request':56 'requir':333,516 'result':114,124,168,179 'rule':331,374,405 'run':73,82,105,107,135,158,161,192,218,246,276,304,404,415,436,441,481,495 'runs-on':81,134,191,245 'save':399 'secret':334,337,472 'secrets.gcp':432 'secrets.key':298,302 'secrets.keystore':278,294 'secrets.play':318 'servic':319,363,368,433 'serviceaccountjsonplaintext':317 'setup':335 'ship':34 'sign':508 'sinc':518 'skill':7 'skill-ci-cd-android' 'source-piyushverma0' 'state':26 'status':329 'step':87,140,197,256 'store':311,504,515 'supabas':16 'tablet':458 'temurin':96,149,206,265 'test':130,133,160,167,178,190,242,408,411,417,420,439,447,482 'testdebugunittest':163 'timeout':461 'token':29 'topic-agent-skills' 'topic-ai-agent' 'topic-android' 'topic-antigravity' 'topic-claude-code' 'topic-codex' 'topic-cursor' 'topic-gemini-cli' 'topic-hilt' 'topic-jetpack-compose' 'topic-kotlin' 'topic-material3' 'track':327 'true':68 'type':442 'ubuntu':85,138,195,249 'ubuntu-latest':84,137,194,248 'uistat':25 'unit':129,132,159,177,189 'unit-test':128,188 'unit-test-result':176 'unnecessarili':480 'unsign':500 'upload':112,166,222,308,509 'use':88,91,101,117,141,144,154,171,198,201,211,224,257,260,270,313,387,389,422,470 'v1':315 'v2':428 'v4':90,93,103,119,143,146,156,173,200,203,213,226,259,262,272,391 'version':99,152,209,268,453,459 'workflow':44 'xml':182 'yaml':45,381,413","prices":[{"id":"99ea6198-1153-4e22-9169-e2fba4c77720","listingId":"71b939c8-e5f2-4c3d-948a-ec18d45b7746","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"piyushverma0","category":"android-agent-skills","install_from":"skills.sh"},"createdAt":"2026-05-18T13:14:48.530Z"}],"sources":[{"listingId":"71b939c8-e5f2-4c3d-948a-ec18d45b7746","source":"github","sourceId":"piyushverma0/android-agent-skills/ci-cd-android","sourceUrl":"https://github.com/piyushverma0/android-agent-skills/tree/main/skills/ci-cd-android","isPrimary":false,"firstSeenAt":"2026-05-18T13:14:48.530Z","lastSeenAt":"2026-05-18T19:09:09.054Z"}],"details":{"listingId":"71b939c8-e5f2-4c3d-948a-ec18d45b7746","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"piyushverma0","slug":"ci-cd-android","github":{"repo":"piyushverma0/android-agent-skills","stars":8,"topics":["agent-skills","ai-agent","android","antigravity","claude-code","codex","cursor","gemini-cli","hilt","jetpack-compose","kotlin","material3","open-source","skills","supabase"],"license":"mit","html_url":"https://github.com/piyushverma0/android-agent-skills","pushed_at":"2026-04-27T09:15:31Z","description":"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.","skill_md_sha":"f906db6b87fea351b2d617a565f55d3bf7347414","skill_md_path":"skills/ci-cd-android/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/piyushverma0/android-agent-skills/tree/main/skills/ci-cd-android"},"layout":"multi","source":"github","category":"android-agent-skills","frontmatter":{},"skills_sh_url":"https://skills.sh/piyushverma0/android-agent-skills/ci-cd-android"},"updatedAt":"2026-05-18T19:09:09.054Z"}}