#!/usr/bin/env bash # Build GNU Taler Android wallet from source at a git **ref**, then run the same # adb deep-link (or GUI) smoke as run-android-pay-smoke.sh. # # Source (default): $HOME/taler/taler-android # Build: ./gradlew :wallet:assembleFdroidDebug # Package id: net.taler.wallet.fdroid.debug # # Typical refs: # BRANCH=master # tip of master # BRANCH=wallet-1.6.1 # published stable **tag** (self-build) # BRANCH=dev/hernani-inference/fix-… # GOA automation fix branch # # For a multi-variant matrix (master + stable self-build + published APK): # ./run-android-variant-matrix.sh # # Usage: # ./run-android-build-and-smoke.sh # BRANCH=master STACK=goa ./run-android-build-and-smoke.sh # BRANCH=wallet-1.6.1 LABEL=stable-self ./run-android-build-and-smoke.sh # SKIP_PULL=1 BRANCH=master ./run-android-build-and-smoke.sh # set -euo pipefail ROOT=$(cd "$(dirname "$0")" && pwd) SMOKE="$ROOT/run-android-pay-smoke.sh" SRC="${TALER_ANDROID_SRC:-$HOME/taler/taler-android}" SKIP_PULL="${SKIP_PULL:-0}" # Prefer existing inference fix branch for GOA withdraw (spinner/exchange resolve). # Matrix uses BRANCH=master and BRANCH=$STABLE_TAG explicitly. BRANCH="${BRANCH:-dev/hernani-inference/fix-bank-withdraw-auto-exchange}" # Optional human label for logs / artifact names (default = sanitized BRANCH) LABEL="${LABEL:-}" VARIANT="${VARIANT:-fdroidDebug}" export ANDROID_HOME="${ANDROID_HOME:-$HOME/Android/Sdk}" export ANDROID_SDK_ROOT="${ANDROID_SDK_ROOT:-$ANDROID_HOME}" if [ ! -x "$SRC/gradlew" ]; then echo "taler-android not found at $SRC (set TALER_ANDROID_SRC=…)" >&2 exit 2 fi if [ ! -d "$ANDROID_HOME" ]; then echo "ANDROID_HOME missing: $ANDROID_HOME" >&2 exit 2 fi printf 'sdk.dir=%s\n' "$ANDROID_HOME" >"$SRC/local.properties" # --- checkout REF (branch, origin/branch, or tag) -------------------------------- cd "$SRC" if [ -d .git ]; then git fetch origin --tags 2>/dev/null || git fetch origin 2>/dev/null || true REF="$BRANCH" checked=0 if [ -n "$REF" ]; then if git rev-parse --verify "refs/tags/${REF}" >/dev/null 2>&1; then echo "checkout tag ${REF} (stable / release self-build)" git checkout -f "refs/tags/${REF}" checked=1 SKIP_PULL=1 elif git rev-parse --verify "origin/${REF}" >/dev/null 2>&1; then echo "checkout origin/${REF}" git checkout -B "$REF" "origin/${REF}" 2>/dev/null || git checkout "$REF" 2>/dev/null || true checked=1 elif git rev-parse --verify "${REF}" >/dev/null 2>&1; then echo "checkout ${REF}" git checkout -f "$REF" checked=1 else echo "WARN: ref '${REF}' not found locally after fetch — staying on current HEAD" >&2 fi fi if [ "$SKIP_PULL" != "1" ] && [ "$checked" = "1" ]; then # only pull real branches, never tags if git symbolic-ref -q HEAD >/dev/null 2>&1; then br=$(git rev-parse --abbrev-ref HEAD) git pull --ff-only origin "$br" 2>/dev/null || true fi fi fi COMMIT=$(git rev-parse --short=12 HEAD 2>/dev/null || echo unknown) HEAD_DESC=$(git describe --tags --always 2>/dev/null || echo "$COMMIT") BR_NOW=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo detached) if [ -z "$LABEL" ]; then LABEL=$(printf '%s' "$BRANCH" | tr '/:' '--' | tr -c 'A-Za-z0-9._-' '-' | cut -c1-48) fi echo "source: $SRC @ $COMMIT ($HEAD_DESC) ref=$BRANCH label=$LABEL head=$BR_NOW" echo "variant: $VARIANT" # Map VARIANT → gradle task case "$VARIANT" in fdroidDebug|FdroidDebug) task=assembleFdroidDebug ;; fdroidRelease|FdroidRelease) task=assembleFdroidRelease ;; nightlyDebug|NightlyDebug) task=assembleNightlyDebug ;; googleDebug|GoogleDebug) task=assembleGoogleDebug ;; *) task="assemble$(printf '%s' "$VARIANT" | python3 -c 'import sys; s=sys.stdin.read().strip(); print(s[:1].upper()+s[1:] if s else "FdroidDebug")')" ;; esac # Low-RAM hosts: cap JVM export GRADLE_OPTS="${GRADLE_OPTS:--Xmx1280m -Dorg.gradle.daemon=false -Dorg.gradle.workers.max=1}" echo "gradle :wallet:$task …" ./gradlew ":wallet:$task" --no-daemon --max-workers="${GRADLE_MAX_WORKERS:-1}" \ -Dorg.gradle.jvmargs="${GRADLE_JVMARGS:--Xmx1280m}" # Prefer fdroid debug APK if multiple exist APK=$(find "$SRC/wallet/build/outputs/apk" -path '*fdroid*debug*.apk' -type f 2>/dev/null | sort | tail -1) if [ -z "$APK" ] || [ ! -f "$APK" ]; then APK=$(find "$SRC/wallet/build/outputs/apk" -name '*.apk' -type f 2>/dev/null | sort | tail -1) fi if [ -z "$APK" ] || [ ! -f "$APK" ]; then echo "no APK under wallet/build/outputs/apk" >&2 exit 4 fi echo "built apk: $APK ($(wc -c <"$APK") bytes)" PKG="${PKG:-}" if [ -z "$PKG" ] && command -v aapt >/dev/null 2>&1; then PKG=$(aapt dump badging "$APK" 2>/dev/null | sed -n "s/^package: name='\([^']*\)'.*/\1/p" | head -1) fi if [ -z "$PKG" ] && command -v aapt2 >/dev/null 2>&1; then PKG=$(aapt2 dump badging "$APK" 2>/dev/null | sed -n "s/^package: name='\([^']*\)'.*/\1/p" | head -1) fi : "${PKG:=net.taler.wallet.fdroid.debug}" mkdir -p "$ROOT/apks" "$ROOT/out" STAMP_APK="$ROOT/apks/wallet-${LABEL}-${COMMIT}.apk" cp -f "$APK" "$STAMP_APK" echo "copied → $STAMP_APK" { echo "label=$LABEL" echo "ref=$BRANCH" echo "commit=$COMMIT" echo "describe=$HEAD_DESC" echo "apk=$STAMP_APK" echo "pkg=$PKG" echo "task=$task" } | tee "$ROOT/out/build-${LABEL}.txt" echo "$COMMIT" >"$ROOT/out/build-commit.txt" echo "$APK" >"$ROOT/out/build-apk-path.txt" export APK_PATH="$STAMP_APK" export APK_NAME APK_NAME="$(basename "$STAMP_APK")" export PKG export OUT_DIR="${OUT_DIR:-$ROOT/out-source-$LABEL}" mkdir -p "$OUT_DIR" cp -f "$ROOT/out/build-${LABEL}.txt" "$OUT_DIR/build-meta.txt" 2>/dev/null || true SMOKE_CMD="$SMOKE" if [ "${GUI:-0}" = "1" ]; then SMOKE_CMD="$ROOT/run-android-gui-smoke.sh" case "$OUT_DIR" in *-gui) ;; *) OUT_DIR="${OUT_DIR}-gui"; export OUT_DIR; mkdir -p "$OUT_DIR" ;; esac fi echo "=== smoke label=$LABEL PKG=$PKG GUI=${GUI:-0} OUT_DIR=$OUT_DIR ===" # Do not exec: allow matrix wrapper to run multiple variants set +e env APK_DIR="$ROOT/apks" APK_NAME="$APK_NAME" APK_PATH="$APK_PATH" PKG="$PKG" OUT_DIR="$OUT_DIR" \ "$SMOKE_CMD" rc=$? set -e echo "=== smoke label=$LABEL exit=$rc ===" exit "$rc"