YrXtals/scripts/android/release-playstore.sh

91 lines
3.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# Builds a release-signed Android App Bundle (.aab) for the Google Play Console.
# Requires env: YRXTALS_KEYSTORE, YRXTALS_STORE_PASSWORD, YRXTALS_KEY_PASSWORD
# Optional: YRXTALS_KEY_ALIAS (defaults to "yrxtals")
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/_env.sh"
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
if [[ -z "${YRXTALS_KEYSTORE:-}" ]]; then
cat <<EOF >&2
YRXTALS_KEYSTORE not set.
create a release keystore once with:
keytool -genkey -v -keystore ~/.android/yrxtals-release.jks \\
-keyalg RSA -keysize 4096 -validity 25000 -alias yrxtals
then export:
export YRXTALS_KEYSTORE=\$HOME/.android/yrxtals-release.jks
export YRXTALS_KEY_ALIAS=yrxtals
export YRXTALS_STORE_PASSWORD=<store-password>
export YRXTALS_KEY_PASSWORD=<key-password>
EOF
exit 2
fi
if [[ -z "${YRXTALS_STORE_PASSWORD:-}" || -z "${YRXTALS_KEY_PASSWORD:-}" ]]; then
echo "YRXTALS_STORE_PASSWORD and YRXTALS_KEY_PASSWORD must be set" >&2
exit 2
fi
if [[ ! -f "$YRXTALS_KEYSTORE" ]]; then
echo "keystore not found at $YRXTALS_KEYSTORE" >&2
exit 2
fi
export YRXTALS_KEY_ALIAS="${YRXTALS_KEY_ALIAS:-yrxtals}"
bash "$SCRIPT_DIR/generate-icons.sh"
GRADLE_KTS="$REPO_ROOT/android/app/build.gradle.kts"
CURRENT_CODE="$(grep -E '^[[:space:]]*versionCode = [0-9]+' "$GRADLE_KTS" | head -1 | sed -E 's/.*versionCode = ([0-9]+).*/\1/')"
CURRENT_NAME="$(grep -E '^[[:space:]]*versionName = "[^"]+"' "$GRADLE_KTS" | head -1 | sed -E 's/.*versionName = "([^"]+)".*/\1/')"
if [[ -z "$CURRENT_CODE" || -z "$CURRENT_NAME" ]]; then
echo "could not parse versionCode / versionName from $GRADLE_KTS" >&2
exit 1
fi
echo "building versionName=$CURRENT_NAME versionCode=$CURRENT_CODE"
JNILIBS="$REPO_ROOT/android/app/src/main/jniLibs"
mkdir -p "$JNILIBS/arm64-v8a"
echo "→ cargo ndk -t arm64-v8a -P 28 -o $JNILIBS build --profile release"
( cd "$REPO_ROOT" && cargo ndk -t arm64-v8a -P 28 -o "$JNILIBS" build --profile release )
echo "→ gradlew :app:bundleRelease"
( cd "$REPO_ROOT/android" && ./gradlew :app:bundleRelease )
AAB="$REPO_ROOT/android/app/build/outputs/bundle/release/app-release.aab"
if [[ ! -f "$AAB" ]]; then
echo "expected aab missing at $AAB" >&2
exit 1
fi
# patch-bumps versionName and increments versionCode by one after a successful build, so the next invocation tags a fresh version.
NEXT_CODE=$((CURRENT_CODE + 1))
IFS='.' read -r MAJOR MINOR PATCH <<<"$CURRENT_NAME"
if [[ -z "${MAJOR:-}" || -z "${MINOR:-}" || -z "${PATCH:-}" ]]; then
echo "warning: versionName '$CURRENT_NAME' is not semver X.Y.Z; only versionCode will be bumped" >&2
NEXT_NAME="$CURRENT_NAME"
else
NEXT_PATCH=$((PATCH + 1))
NEXT_NAME="${MAJOR}.${MINOR}.${NEXT_PATCH}"
fi
sed -i.bak -E "s/^([[:space:]]*)versionCode = [0-9]+/\\1versionCode = $NEXT_CODE/" "$GRADLE_KTS"
sed -i.bak -E "s/^([[:space:]]*)versionName = \"[^\"]+\"/\\1versionName = \"$NEXT_NAME\"/" "$GRADLE_KTS"
rm -f "$GRADLE_KTS.bak"
echo
echo "signed aab: $AAB"
echo "applicationId: org.elseif.yrxtals"
echo "shipped versionName=$CURRENT_NAME versionCode=$CURRENT_CODE"
echo "bumped build.gradle.kts to versionName=$NEXT_NAME versionCode=$NEXT_CODE"
echo "upload at https://play.google.com/console"