Mobile App CI/CD Secrets Setup Guide
Last updated: December 18, 2025
Configure GitHub Actions secrets to enable the DevOpser mobile CI/CD pipeline to build, sign, and optionally upload your Android and iOS apps automatically.
main and staging branches.
Other branches produce debug builds for testing only.
GitHub repo → Settings → Secrets and variables → Actions → New repository secret
Android Secrets
Configure these secrets to enable signed Android builds and optional Google Play uploads.
Required for Signed Builds
Your Android applicationId / package name used to identify your app.
com.example.app
How to get this value
- Open your Android project file:
android/app/build.gradleorandroid/app/build.gradle.kts
- Find the
applicationIdfield and copy its value - Add it to GitHub as
ANDROID_PACKAGE_NAME
Your Android upload keystore file encoded as base64.
How to get this value
Step 1: Create an upload keystore (do this once on a secure machine):
keytool -genkeypair -v \
-storetype PKCS12 \
-keystore android-upload.keystore \
-alias yourapp \
-keyalg RSA \
-keysize 2048 \
-validity 10000
Step 2: Convert the keystore to base64 (macOS):
base64 -i android-upload.keystore | pbcopy
Step 3: Paste the copied output into GitHub secret ANDROID_KEYSTORE_BASE64
The password you set when creating the keystore.
How to get this value
Use the same password you typed during keystore creation in the previous step.
The alias inside your keystore that identifies the key entry.
yourapp (the -alias value you used)
The password for the key entry (can be the same as the keystore password).
How to get this value
Use the "key password" you typed during keystore creation. Often this is the same as the keystore password.
Optional (Deep Links & Auto-Upload)
Debug signing certificate SHA-256 fingerprint for deep links / assetlinks.
How to get this value
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey
Default password is android. Copy the SHA-256 fingerprint from the output.
Release signing certificate SHA-256 fingerprint for deep links / assetlinks.
How to get this value
keytool -list -v -keystore android-upload.keystore -alias yourapp
Copy the SHA-256 fingerprint from the output.
Google Play app signing certificate SHA-256 fingerprint.
How to get this value
- Open Google Play Console
- Select your app → Setup → App integrity
- Copy the SHA-256 fingerprint for the App signing key certificate
A Google Cloud service account JSON key used by CI to upload the AAB to Google Play automatically.
How to get this value
Step 1: Create a service account key (Google Cloud)
- Open Service Accounts
- Select (or create) a Google Cloud project
- Create a service account (example:
github-actions-play-upload) - Open it → Keys → Add Key → Create new key → choose JSON
- Download the JSON file and store it securely
Step 2: Grant access in Google Play Console
- Open Google Play Console
- Select your app → Setup → API access
- Link your Google Cloud project (if not linked yet)
- Grant the service account permissions to upload releases
Step 3: Add the secret to GitHub
- Open the downloaded JSON file
- Copy the entire JSON contents
- Paste into GitHub secret
GOOGLE_PLAY_SERVICE_ACCOUNT_JSON
iOS Secrets
Configure these secrets to enable signed iOS builds and optional TestFlight uploads.
Required for Signed Builds
Your iOS Bundle ID that uniquely identifies your app on the App Store.
com.example.app
How to get this value
- Open Apple Developer Identifiers
- Find your App ID and copy the Bundle ID
- Add it to GitHub secret
IOS_BUNDLE_ID
ANDROID_PACKAGE_NAME or com.example.app
Your Apple Developer Team ID (10 characters).
How to get this value
- Open Apple Developer Account
- Go to Membership and copy your Team ID
- Add it to GitHub secret
IOS_TEAM_ID
Same Team ID as above. Some workflows use both variables for compatibility.
IOS_TEAM_ID
Your Apple Distribution certificate exported as .p12 and base64-encoded.
How to get this value
- Create or confirm an Apple Distribution certificate at Apple Developer Certificates
- On a Mac, open Keychain Access and locate your Apple Distribution certificate under "My Certificates"
- Right-click → Export → save as
ios_distribution.p12and set a password - Convert to base64:
base64 -i ios_distribution.p12 | pbcopy
Paste into GitHub secret IOS_CERTIFICATE_BASE64
The password you set when exporting the .p12 certificate.
How to get this value
Use the export password you chose in Keychain Access when exporting the certificate.
An App Store provisioning profile (.mobileprovision) encoded as base64.
How to get this value
- Open Apple Developer Profiles
- Create an App Store provisioning profile for your Bundle ID
- Download the
.mobileprovisionfile - Convert to base64:
base64 -i YourProfile.mobileprovision | pbcopy
Paste into GitHub secret IOS_PROVISIONING_PROFILE_BASE64
Optional (TestFlight Upload)
Key ID for an App Store Connect API key.
How to get this value
- Open App Store Connect Users and Access
- Go to Keys → create a key with role App Manager
- Copy the Key ID and save it as
APP_STORE_CONNECT_API_KEY_ID
Issuer ID shown on the App Store Connect Keys page.
How to get this value
- Open App Store Connect Users and Access
- Go to Keys and copy the Issuer ID shown at the top of the page
- Save it as
APP_STORE_CONNECT_API_ISSUER_ID
The downloaded .p8 private key file encoded as base64.
How to get this value
- When you create the App Store Connect API key, download the
AuthKey_XXXXXXXXXX.p8file (one-time download) - Convert to base64:
base64 -i AuthKey_XXXXXXXXXX.p8 | pbcopy
Paste into GitHub secret APP_STORE_CONNECT_API_KEY_BASE64
Prerequisites & Security
Developer Accounts Required
- Google Play Console — Required for Android app distribution
- Apple Developer Program — $99/year membership required
- App Store Connect — For TestFlight and App Store distribution
If you enroll as an organization/business, Apple (and often Google) will require business verification, typically including a D-U-N-S number.
Security Recommendations
- Use GitHub Environments for
stagingandproductionwith environment-protected secrets - Limit who can run workflows on
mainandstagingbranches - Never commit keystores, certificates, provisioning profiles, or API keys to your repo
- Rotate secrets periodically and after team member departures