with one click
deploy-android
// Deploy the Android app to the Play Store via GitHub Actions. Runs pre-flight checks, creates a version tag, and pushes to trigger the deploy pipeline.
// Deploy the Android app to the Play Store via GitHub Actions. Runs pre-flight checks, creates a version tag, and pushes to trigger the deploy pipeline.
Migrate an Android screen from MVP (Fragment/Presenter/ViewBinder) to Compose + ViewModel with UDF. Triggers on "migrate screen", "migrate X to compose", "rewrite X screen", "convert X to compose".
Build the debug APK, install it on a connected device/emulator via ADB, and launch the app.
| name | deploy-android |
| description | Deploy the Android app to the Play Store via GitHub Actions. Runs pre-flight checks, creates a version tag, and pushes to trigger the deploy pipeline. |
| user_invocable | true |
Orchestrate a release of the Android app. This creates a v* tag that triggers the GitHub Actions continuous_deployment.yml pipeline (build → upload to Play Store Internal track).
No direct builds or uploads. The tag push triggers GitHub Actions which handles everything.
Must be on main, clean, and in sync with remote.
# Must be on main
git branch --show-current
# No uncommitted changes
git diff --quiet && git diff --cached --quiet
# No untracked files (excluding known untracked dirs)
git ls-files --others --exclude-standard
# Fetch and verify local matches remote
git fetch origin main
LOCAL=$(git rev-parse HEAD)
REMOTE=$(git rev-parse origin/main)
# LOCAL must equal REMOTE — no unpushed or missing commits
STOP if any check fails. Tell the user what needs fixing:
git checkout maingit pull origin maingit push origin main./support/scripts/unit-test
STOP if tests fail. Investigate and report failures — do not skip.
Skip instrumented tests unless the user explicitly asks to run them.
If yes:
./gradlew :android:app:smokeGroupDebugAndroidTest
If no device is available or user skips, note it and continue.
The version scheme is vYYMMDDNN where NN is the daily sequence number.
# Fetch tags
git fetch --tags
# Calculate
YY=$(date +%y)
MM=$(date +%m)
DD=$(date +%d)
BASE_CODE=$((YY * 1000000 + 10#$MM * 10000 + 10#$DD * 100))
# Count existing tags for today to determine revision
TODAY_PATTERN="v${YY}${MM}${DD}"
EXISTING=$(git tag -l "${TODAY_PATTERN}*" 2>/dev/null | wc -l | tr -d ' ')
REV=$((EXISTING + 1))
VERSION_CODE=$((BASE_CODE + REV))
VERSION_NAME="20${YY}.${MM}.${DD}"
TAG="v${VERSION_CODE}"
Tell the user: "Version: $VERSION_NAME (code: $VERSION_CODE, tag: $TAG)"
Confirm with the user before pushing: "Ready to push tag $TAG to trigger deployment?"
git tag "$TAG"
git push origin main && git push origin "$TAG"
gh run watch
Or show the user how to monitor:
gh run list --workflow=continuous_deployment.yml
gh run view --web
The pipeline will:
git pull origin main)