From 0bca3ff872c45f0a8f0425e7b4fb402c2a435312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matou=C5=A1=20Volf?= Date: Thu, 18 Dec 2025 22:39:58 +0100 Subject: [PATCH] fix: Android bundling --- .dockerignore | 1 + docker-compose-android-bundle.yaml | 5 ++++ docker/dev/app/Dockerfile | 4 +-- docker/prod/app/Dockerfile | 41 +++++++++++++++++------------- scripts/export_android_bundle.sh | 12 +++++++-- 5 files changed, 42 insertions(+), 21 deletions(-) create mode 100755 docker-compose-android-bundle.yaml diff --git a/.dockerignore b/.dockerignore index 2d29730..9e1a31b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -3,6 +3,7 @@ /.github /bundle /node_modules +/scripts /target /.dockerignore diff --git a/docker-compose-android-bundle.yaml b/docker-compose-android-bundle.yaml new file mode 100755 index 0000000..61685a4 --- /dev/null +++ b/docker-compose-android-bundle.yaml @@ -0,0 +1,5 @@ +--- +services: + app: + build: + target: builder_android diff --git a/docker/dev/app/Dockerfile b/docker/dev/app/Dockerfile index 8f7756b..133e8b9 100644 --- a/docker/dev/app/Dockerfile +++ b/docker/dev/app/Dockerfile @@ -5,8 +5,8 @@ RUN useradd -m -u 1000 -s /bin/bash app_user \ USER app_user -RUN cargo install --git https://github.com/diesel-rs/diesel --rev 2e85ba060d3d70ea605ea58a79b8a435749a7adc diesel_cli \ - && cargo install --git https://github.com/DioxusLabs/dioxus --rev 8f8b58ea80ba0ec8057807bcd58fb609f7a5f2b1 dioxus-cli +RUN cargo install --git https://github.com/diesel-rs/diesel --rev 2e85ba060d3d70ea605ea58a79b8a435749a7adc --locked diesel_cli \ + && cargo install --git https://github.com/DioxusLabs/dioxus --rev 8f8b58ea80ba0ec8057807bcd58fb609f7a5f2b1 --locked dioxus-cli COPY --chown=app_user . /srv/app WORKDIR /srv/app diff --git a/docker/prod/app/Dockerfile b/docker/prod/app/Dockerfile index 5a752b8..f480346 100644 --- a/docker/prod/app/Dockerfile +++ b/docker/prod/app/Dockerfile @@ -1,4 +1,13 @@ -FROM rust:1.92.0-bookworm@sha256:9676d0547a259997add8f5924eb6b959c589ed39055338e23b99aba7958d6d31 AS builder +FROM rust:1.92.0-bookworm@sha256:9676d0547a259997add8f5924eb6b959c589ed39055338e23b99aba7958d6d31 AS builder_base + +RUN cargo install --git https://github.com/diesel-rs/diesel --rev 2e85ba060d3d70ea605ea58a79b8a435749a7adc --locked diesel_cli \ + && cargo install --git https://github.com/DioxusLabs/dioxus --rev 8f8b58ea80ba0ec8057807bcd58fb609f7a5f2b1 --locked dioxus-cli --features disable-telemetry + +COPY . /srv/app +WORKDIR /srv/app + + +FROM builder_base AS builder_android ARG ANDROID_NDK_VERSION=26.2.11394342 ARG ANDROID_COMMAND_LINE_TOOLS_VERSION=13114758 @@ -13,11 +22,8 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"] RUN apt-get update && apt-get install -y --no-install-recommends \ openjdk-17-jdk-headless=17.0.17+10-1~deb12u1 \ - && curl -fsSL -o /tmp/cmdline-tools.zip "https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_COMMAND_LINE_TOOLS_VERSION}_latest.zip" \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* \ - && cargo install --git https://github.com/diesel-rs/diesel --rev 2e85ba060d3d70ea605ea58a79b8a435749a7adc diesel_cli \ - && cargo install --git https://github.com/DioxusLabs/dioxus --rev 8f8b58ea80ba0ec8057807bcd58fb609f7a5f2b1 dioxus-cli --features disable-telemetry \ && rustup target add aarch64-linux-android \ && mkdir -p "$ANDROID_SDK_ROOT/cmdline-tools" \ && curl -fsSL -o /tmp/cmdline-tools.zip "https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_COMMAND_LINE_TOOLS_VERSION}_latest.zip" \ @@ -25,32 +31,33 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && export PATH="$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/platform-tools:$PATH" \ && mv "$ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools" "$ANDROID_SDK_ROOT/cmdline-tools/latest" \ && rm /tmp/cmdline-tools.zip \ - && yes | sdkmanager --sdk_root="$ANDROID_SDK_ROOT" --licenses > /dev/null \ + # `yes` can exit with 141, which is okay, so the `test` is added to ignore it. + && yes | sdkmanager --sdk_root="$ANDROID_SDK_ROOT" --licenses > /dev/null; test "${PIPESTATUS[1]}" -eq 0 \ && sdkmanager --sdk_root="$ANDROID_SDK_ROOT" "platform-tools" "platforms;android-$ANDROID_VERSION" "build-tools;$ANDROID_BUILD_TOOLS_VERSION" "ndk;$ANDROID_NDK_VERSION" \ && curl -fsSL -o /tmp/bundletool-all.jar "https://github.com/google/bundletool/releases/download/$ANDROID_BUNDLETOOL_VERSION/bundletool-all-${ANDROID_BUNDLETOOL_VERSION}.jar" \ && echo "$ANDROID_BUNDLETOOL_SHA256 /tmp/bundletool-all.jar" | sha256sum -c - \ - && keytool -genkeypair -noprompt -keystore /tmp/android_keystore.jks -alias key -keyalg RSA -keysize 2048 -validity 3660 -dname "CN=" -storepass 123456 -keypass 123456 - -COPY . /srv/app -WORKDIR /srv/app - -RUN export ANDROID_HOME="$ANDROID_SDK_ROOT" \ + && keytool -genkeypair -noprompt -keystore /tmp/android_keystore.jks -alias key -keyalg RSA -keysize 2048 -validity 3660 -dname "CN=" -storepass 123456 -keypass 123456 \ + && export ANDROID_HOME="$ANDROID_SDK_ROOT" \ && export ANDROID_NDK_HOME="$ANDROID_SDK_ROOT/ndk/$ANDROID_NDK_VERSION" \ - && dx bundle --release \ && dx bundle --platform android --target aarch64-linux-android --release \ && java -jar /tmp/bundletool-all.jar build-apks --bundle=/srv/app/target/dx/todo_baggins/release/android/app/app/build/outputs/bundle/release/TodoBaggins-aarch64-linux-android.aab --output=/tmp/todo_baggins.apks --mode=universal --ks=/tmp/android_keystore.jks --ks-key-alias=key --ks-pass=pass:123456 \ - && mkdir -p /srv/app/bundle/android \ - && unzip -qp /tmp/todo_baggins.apks universal.apk > /srv/app/bundle/android/todo_baggins.apk + && mkdir -p /srv/app/bundle \ + && unzip -qp /tmp/todo_baggins.apks universal.apk > /srv/app/bundle/todo_baggins.apk -FROM debian:bookworm@sha256:b877a1a3fdf02469440f1768cf69c9771338a875b7add5e80c45b756c92ac20a AS runner + +FROM builder_base AS builder_web + +RUN dx bundle --release + + +FROM debian:bookworm@sha256:b877a1a3fdf02469440f1768cf69c9771338a875b7add5e80c45b756c92ac20a AS runner_web RUN apt-get update \ && apt-get install -y --no-install-recommends libpq5=15.10-0+deb12u1 \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* -COPY --from=builder /srv/app/target/dx/todo_baggins/release/web /srv/app/web -COPY --from=builder /srv/app/bundle/android /srv/app/android +COPY --from=builder_web /srv/app/target/dx/todo_baggins/release/web /srv/app/web RUN chown -R 1000:1000 /srv/app/web diff --git a/scripts/export_android_bundle.sh b/scripts/export_android_bundle.sh index f00b509..04d8d81 100644 --- a/scripts/export_android_bundle.sh +++ b/scripts/export_android_bundle.sh @@ -1,4 +1,12 @@ #!/bin/sh -mkdir -p ../bundle \ -&& docker compose -f docker-compose-prod.yaml cp app:/srv/app/android bundle +echo "Warning: This script needs to stop any currently running Docker compose stacks. Stopping them now..." +docker compose down + +mkdir -p bundle/android bundle/temp \ +&& docker compose -f docker-compose-prod.yaml -f docker-compose-android-bundle.yaml up --build --no-start --no-deps app \ +&& docker compose -f docker-compose-prod.yaml -f docker-compose-android-bundle.yaml cp app:/srv/app/bundle bundle/temp \ +&& mv bundle/temp/bundle/* bundle/android \ +&& rm -r bundle/temp + +echo "Warning: If a running Docker compose stack has been stopped by this script, you may want to bring it up again now."