Android CI: run on mac_mini_m2 (linux_x2 not on the billing plan)

The android-apk workflow requested linux_x2, which Codemagic rejected with
"selected instance type is not available with the current billing plan". Switch
to mac_mini_m2 — the same instance the iOS workflow already uses on this account;
Codemagic's macOS images include the Android SDK + JDK. Also make the SDK path
(ANDROID_SDK_ROOT -> ANDROID_HOME fallback) and the google-services base64 decode
(GNU --decode / BSD -D) portable to the macOS image.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-09-08 16:08:52 +05:30
parent 1efb2e4314
commit 35ce641046
+11 -7
View File
@@ -172,7 +172,9 @@ workflows:
# needed to test: download the APK artifact from the Codemagic build page (or wire an email/Slack in the # needed to test: download the APK artifact from the Codemagic build page (or wire an email/Slack in the
# UI), sideload it on a phone (enable "Install unknown apps"), and run. # UI), sideload it on a phone (enable "Install unknown apps"), and run.
# #
# Runs on a Linux instance (has the Android SDK + JDK preinstalled) — much cheaper/faster than a Mac. # Runs on the SAME macOS instance as the iOS workflow (mac_mini_m2) — Codemagic's macOS images ship the
# Android SDK + JDK too. (A Linux instance would be cheaper/faster but linux_x2 isn't on every billing
# plan; mac_mini_m2 is the one this account already uses for iOS.)
# #
# Firebase push (FCM) is OPTIONAL for this test build: app/build.gradle only applies the google-services # Firebase push (FCM) is OPTIONAL for this test build: app/build.gradle only applies the google-services
# plugin when google-services.json is present, so the APK builds fine WITHOUT it (push/call-wake just # plugin when google-services.json is present, so the APK builds fine WITHOUT it (push/call-wake just
@@ -181,7 +183,7 @@ workflows:
android-apk: android-apk:
name: Biz Connect Android → test APK name: Biz Connect Android → test APK
max_build_duration: 45 max_build_duration: 45
instance_type: linux_x2 instance_type: mac_mini_m2
environment: environment:
# To enable FCM push later, create a Codemagic variable group holding GOOGLE_SERVICES_JSON (base64 of # To enable FCM push later, create a Codemagic variable group holding GOOGLE_SERVICES_JSON (base64 of
# google-services.json, marked secure) and uncomment the two lines below. Left out for now so the first # google-services.json, marked secure) and uncomment the two lines below. Left out for now so the first
@@ -207,10 +209,11 @@ workflows:
npx cap sync android npx cap sync android
# App icon + splash from resources/icon.png & resources/splash*.png. # App icon + splash from resources/icon.png & resources/splash*.png.
npx capacitor-assets generate --android || echo "capacitor-assets returned non-zero (see above)" npx capacitor-assets generate --android || echo "capacitor-assets returned non-zero (see above)"
# The generated project points sdk.dir at wherever it was made; overwrite it with the CI SDK path # The generated project points sdk.dir at wherever it was made; overwrite it with the CI SDK path so
# (Codemagic exports ANDROID_SDK_ROOT) so Gradle finds the SDK. # Gradle finds the SDK. Codemagic exports ANDROID_SDK_ROOT (fall back to ANDROID_HOME on macOS images).
echo "sdk.dir=$ANDROID_SDK_ROOT" > android/local.properties SDK="${ANDROID_SDK_ROOT:-${ANDROID_HOME:-}}"
echo "Android SDK -> $ANDROID_SDK_ROOT" echo "sdk.dir=$SDK" > android/local.properties
echo "Android SDK -> $SDK"
# android/ is gitignored and regenerated fresh in CI, so its manifest only has INTERNET. Inject the # android/ is gitignored and regenerated fresh in CI, so its manifest only has INTERNET. Inject the
# camera/mic/notification permissions the web UI needs (mirrors ios-patch.sh for iOS). Tolerant + idempotent. # camera/mic/notification permissions the web UI needs (mirrors ios-patch.sh for iOS). Tolerant + idempotent.
node scripts/android-patch.js android/app/src/main/AndroidManifest.xml node scripts/android-patch.js android/app/src/main/AndroidManifest.xml
@@ -219,7 +222,8 @@ workflows:
script: | script: |
cd mobile/android/app cd mobile/android/app
if [ -n "$GOOGLE_SERVICES_JSON" ]; then if [ -n "$GOOGLE_SERVICES_JSON" ]; then
echo "$GOOGLE_SERVICES_JSON" | base64 --decode > google-services.json # Portable decode: GNU coreutils uses --decode/-d, BSD/macOS base64 uses -D.
echo "$GOOGLE_SERVICES_JSON" | { base64 --decode 2>/dev/null || base64 -D; } > google-services.json
echo "google-services.json written — FCM push enabled in this build" echo "google-services.json written — FCM push enabled in this build"
else else
echo "No GOOGLE_SERVICES_JSON set — building WITHOUT FCM push (fine for a shell/UI test build)" echo "No GOOGLE_SERVICES_JSON set — building WITHOUT FCM push (fine for a shell/UI test build)"