#!/usr/bin/env bash set -Eeuo pipefail APP_NAME="e-SUN" MODULE="app" API_LEVEL="35" BUILD_TOOLS_VERSION="35.0.0" DIST_DIR="dist" COMMIT_MSG_FILE="commit-message.txt" ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$ROOT_DIR" export GRADLE_OPTS="${GRADLE_OPTS:-} -Dorg.gradle.daemon=false" usage() { cat <&2; usage; exit 1 ;; esac done need_cmd() { command -v "$1" >/dev/null 2>&1 || { echo "Missing required command: $1" >&2 exit 1 } } ensure_java() { need_cmd java local major major="$(java -version 2>&1 | awk -F[\".] '/version/ {print $2}')" if [[ "${major:-0}" -lt 17 ]]; then echo "Java 17+ is required. Found Java ${major:-unknown}." >&2 exit 1 fi } ensure_android_sdk() { if [[ -z "${ANDROID_HOME:-}" ]]; then export ANDROID_HOME="$ROOT_DIR/.android-sdk" fi export ANDROID_SDK_ROOT="$ANDROID_HOME" export PATH="$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$PATH" if [[ ! -x "$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" ]]; then need_cmd curl need_cmd unzip mkdir -p "$ANDROID_HOME/cmdline-tools" local zip_path="$ANDROID_HOME/cmdline-tools/commandlinetools.zip" echo "Downloading Android command line tools..." curl -L -o "$zip_path" \ "https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip" rm -rf "$ANDROID_HOME/cmdline-tools/latest" "$ANDROID_HOME/cmdline-tools/cmdline-tools" unzip -q "$zip_path" -d "$ANDROID_HOME/cmdline-tools" mv "$ANDROID_HOME/cmdline-tools/cmdline-tools" "$ANDROID_HOME/cmdline-tools/latest" rm "$zip_path" fi yes | sdkmanager --licenses >/dev/null || true sdkmanager \ "platform-tools" \ "platforms;android-$API_LEVEL" \ "build-tools;$BUILD_TOOLS_VERSION" >/dev/null } ensure_gradle_wrapper() { if [[ ! -x "./gradlew" ]]; then if [[ -f "./gradlew" ]]; then chmod +x ./gradlew else echo "Missing Gradle wrapper ./gradlew. Please add/commit it first." >&2 exit 1 fi fi } gradle_no_daemon() { ./gradlew --no-daemon -Dorg.gradle.daemon=false "$@" } ensure_gitignore_entries() { touch .gitignore for entry in \ "$COMMIT_MSG_FILE" \ ".android-sdk/" \ ".gradle/" \ "$DIST_DIR/" \ "local.properties" \ "**/build/" \ "*.iml" \ ".idea/" \ ; do grep -qxF "$entry" .gitignore || echo "$entry" >> .gitignore done } increment_versions() { local gradle_file="$MODULE/build.gradle.kts" if [[ ! -f "$gradle_file" ]]; then echo "Cannot find $gradle_file" >&2 exit 1 fi python3 - "$gradle_file" <<'PY' import re import sys from pathlib import Path path = Path(sys.argv[1]) text = path.read_text() m_code = re.search(r'\bversionCode\s*=\s*(\d+)', text) m_name = re.search(r'\bversionName\s*=\s*"(\d+(?:\.\d+)*)"', text) if not m_code: raise SystemExit('versionCode = not found') if not m_name: raise SystemExit('versionName = "" not found (must be numeric, e.g. "1" or "1.0")') old_code = int(m_code.group(1)) new_code = old_code + 1 old_name = m_name.group(1) parts = old_name.split('.') parts[-1] = str(int(parts[-1]) + 1) new_name = '.'.join(parts) text = re.sub(r'(\bversionCode\s*=\s*)\d+', r'\g<1>%d' % new_code, text, count=1) text = re.sub(r'(\bversionName\s*=\s*)"\d+(?:\.\d+)*"', r'\g<1>"%s"' % new_name, text, count=1) path.write_text(text) print(new_code) PY } build_artifacts() { gradle_no_daemon clean testDebugUnitTest assembleDebug if [[ "$WITH_AAB" == true ]]; then gradle_no_daemon bundleRelease fi } copy_artifacts() { local version_code="$1" mkdir -p "$DIST_DIR" local debug_apk debug_apk="$(find "$MODULE/build/outputs/apk/debug" -name "*.apk" | head -n 1 || true)" if [[ -z "$debug_apk" || ! -f "$debug_apk" ]]; then echo "Debug APK not found." >&2 exit 1 fi cp "$debug_apk" "$DIST_DIR/${APP_NAME}-v${version_code}-debug.apk" echo "Created: $DIST_DIR/${APP_NAME}-v${version_code}-debug.apk" if [[ "$WITH_AAB" == true ]]; then local release_aab release_aab="$(find "$MODULE/build/outputs/bundle/release" -name "*.aab" | head -n 1 || true)" if [[ -z "$release_aab" || ! -f "$release_aab" ]]; then echo "Release AAB not found." >&2 exit 1 fi cp "$release_aab" "$DIST_DIR/${APP_NAME}-v${version_code}-release.aab" echo "Created: $DIST_DIR/${APP_NAME}-v${version_code}-release.aab" fi } commit_successful_build() { git rev-parse --is-inside-work-tree >/dev/null 2>&1 || { echo "Not a git repo; skipping commit." >&2 return } local message if [[ -s "$COMMIT_MSG_FILE" ]]; then message="$(cat "$COMMIT_MSG_FILE")" else message="No Details" fi git add -A if git diff --cached --quiet; then echo "No changes to commit." else git commit -m "$message" fi : > "$COMMIT_MSG_FILE" } main() { need_cmd python3 ensure_java ensure_android_sdk ensure_gradle_wrapper ensure_gitignore_entries if [[ "$SETUP_ONLY" == true ]]; then echo "Build environment setup complete." exit 0 fi local version_code version_code="$(increment_versions)" build_artifacts copy_artifacts "$version_code" if [[ "$DO_COMMIT" == true ]]; then commit_successful_build fi echo "Build completed successfully for versionCode $version_code." } main "$@"