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-play
action.
๐ 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-play
handles version codes and uploads the APK to the internal testing track.- You can switch the track to
alpha
,beta
, orproduction
as 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 a DevOps/SRE/DevSecOps/Cloud Expert passionate about sharing knowledge and experiences. I am working at Cotocus. I blog tech insights at DevOps School, travel stories at Holiday Landmark, stock market tips at Stocks Mantra, health and fitness guidance at My Medic Plus, product reviews at I reviewed , and SEO strategies at Wizbrand.
Do you want to learn Quantum Computing?
Please find my social handles as below;
Rajesh Kumar Personal Website
Rajesh Kumar at YOUTUBE
Rajesh Kumar at INSTAGRAM
Rajesh Kumar at X
Rajesh Kumar at FACEBOOK
Rajesh Kumar at LINKEDIN
Rajesh Kumar at PINTEREST
Rajesh Kumar at QUORA
Rajesh Kumar at WIZBRAND