To fully automate your Android app build and publishing workflow using GitHub Actions, we’ll break it into three main steps:
โ What This GitHub Action Will Do
- Build the APK using Gradle on a GitHub Actions runner.
- Upload the APK to GitHub Releases as an asset (optional: GitHub Packages if you prefer).
- Deploy the APK to Google Play Store – Internal/Test Track using the
r0adkll/upload-google-playaction.
๐ Prerequisites
1. Play Store Setup
- Create a Google Play Console account.
- Upload the initial APK manually once to create the app entry.
- Create a Service Account with Release access and generate a JSON key file.
2. GitHub Repository Secrets
Add these secrets to your repository settings:
| Secret Name | Description |
|---|---|
ANDROID_KEYSTORE_BASE64 | Your keystore file, base64 encoded |
ANDROID_KEYSTORE_PASSWORD | Keystore password |
ANDROID_KEY_ALIAS | Key alias |
ANDROID_KEY_PASSWORD | Key password |
GOOGLE_PLAY_SERVICE_ACCOUNT_JSON | Contents of service_account.json |
RELEASE_SIGNING_ENABLED | true or false |
PACKAGE_NAME | Your appโs package name (e.g., com.example.app) |
๐ GitHub Actions Workflow (.github/workflows/android-release.yml)
name: Android Release Pipeline
on:
push:
tags:
- 'v*' # Triggers on version tags like v1.0.0
jobs:
build:
name: Build APK
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Set up JDK
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '17'
- name: Decode Keystore
if: env.RELEASE_SIGNING_ENABLED == 'true'
run: |
echo "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" | base64 -d > my-release-key.keystore
- name: Build APK
run: ./gradlew assembleRelease
env:
KEYSTORE_FILE: my-release-key.keystore
KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
- name: Upload APK to GitHub Release
uses: softprops/action-gh-release@v2
with:
name: "Release ${{ github.ref_name }}"
tag_name: ${{ github.ref_name }}
files: app/build/outputs/apk/release/app-release.apk
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
upload_to_playstore:
name: Upload to Google Play
runs-on: ubuntu-latest
needs: build
steps:
- name: Download Release APK from GitHub
uses: actions/download-artifact@v4
with:
name: app-release.apk
- name: Upload to Google Play (Internal)
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJsonPlainText: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_JSON }}
packageName: ${{ secrets.PACKAGE_NAME }}
releaseFiles: app/build/outputs/apk/release/app-release.apk
track: internal # use 'alpha', 'beta', 'production', or 'internal'
Code language: PHP (php)
๐ Notes
- This will auto-trigger when you push a tag like
v1.0.0. r0adkll/upload-google-playhandles version codes and uploads the APK to the internal testing track.- You can switch the track to
alpha,beta, orproductionas needed.
๐ How to Encode Keystore
base64 your-release-key.keystore > keystore.txt
# Copy contents and store in GitHub secret: ANDROID_KEYSTORE_BASE64
Code language: CSS (css)
I’m Rajesh Kumar, a DevOps, SRE, DevSecOps, Cloud, and Platform Engineering expert passionate about sharing practical knowledge, real-world experiences, and industry best practices. I have worked at Cotocus and regularly write about technology, travel, investing, health, product reviews, and digital marketing through my various platforms.
I publish technical articles at DevOps School, travel stories at Holiday Landmark, stock market insights at Stocks Mantra, health and fitness guidance at My Medic Plus, product reviews at TrueReviewNow, and SEO and digital marketing strategies at Wizbrand.
Find Trusted Cardiac Hospitals
Compare heart hospitals by city and services โ all in one place.
Explore Hospitals