#!/usr/bin/env bash # Runs `make android` inside the local android-builder image, mirroring # what the Gitea Actions build workflow does - useful for testing # build-image/ changes locally before pushing anything to a registry. # # Usage: ./run-image.sh [VERSION] # VERSION is passed through to `make android` (see the Makefile's # `android` target); omit it for its own git-tag-based default. set -euo pipefail cd "$(dirname "${BASH_SOURCE[0]}")" ROOT="$(pwd)" fail() { echo "PREFLIGHT FAIL: $*" >&2; exit 1; } command -v docker >/dev/null 2>&1 \ || fail "docker not found in PATH" IMAGE="${REGISTRY_ANDROID_IMAGE:-cr.ladkau.de/fuelish/android-builder}" if [ -f "$ROOT/registry.env" ]; then # shellcheck disable=SC1091 source "$ROOT/registry.env" IMAGE="${REGISTRY_ANDROID_IMAGE:-$IMAGE}" fi IMAGE_TAG="$(<"$ROOT/build-image/VERSION")" [ -n "$IMAGE_TAG" ] || fail "build-image/VERSION is empty" IMAGE="$IMAGE:$IMAGE_TAG" docker image inspect "$IMAGE" >/dev/null 2>&1 \ || fail "$IMAGE not found locally - run ./build-image.sh first" VERSION="${1:-${VERSION:-}}" # CI always starts from a fresh checkout, but this script bind-mounts the # live host repo - so build output left over from a previous local run # (dist/, android/build, the generated app icon/splash resources) would # make this run skip work a real fresh checkout wouldn't, silently hiding # bugs that only show up in CI. Wipe them first so every run exercises a # true from-scratch build, same as CI. echo "== Cleaning generated build artifacts for a fresh build ==" rm -rf \ "$ROOT/dist" "$ROOT/android/build" "$ROOT/android/app/build" \ "$ROOT/android/app/src/main/res/drawable-nodpi" \ "$ROOT/android/app/src/main/res"/mipmap-mdpi "$ROOT/android/app/src/main/res"/mipmap-hdpi \ "$ROOT/android/app/src/main/res"/mipmap-xhdpi "$ROOT/android/app/src/main/res"/mipmap-xxhdpi \ "$ROOT/android/app/src/main/res"/mipmap-xxxhdpi echo "== Running make android inside $IMAGE ==" # The container runs as root (needed for the SDK/Gradle caches baked into # the image), so anything it writes into this bind mount - dist/, # android/build, android/.gradle, etc. - would otherwise come back owned # by root, leaving the host repo unusable without sudo. Chown everything # back to the host user on exit, whether the build succeeds or fails. docker run --rm \ -v "$ROOT:/workspace" \ -w /workspace \ -e VERSION="$VERSION" \ -e HOST_UID="$(id -u)" \ -e HOST_GID="$(id -g)" \ "$IMAGE" \ bash -c ' git config --global --add safe.directory /workspace trap "chown -R \"$HOST_UID:$HOST_GID\" /workspace" EXIT make android ' echo "== Done - artifact in dist/ ==" ls -la "$ROOT/dist"