From e8dd3389a74f65972248db08b0a14b6e79458fad Mon Sep 17 00:00:00 2001 From: Michael Keller Date: Fri, 5 Jan 2024 22:03:43 +1300 Subject: [PATCH] CICD: Update the android Build Docker Image. Update the android build docker image: - rebase on ubuntu 22.04; - add tooling required to sign APKs; - changes to make the container re-usable; - change to a multi-stage build to keep the image size smaller; - generic improvements to the Dockerfile Also update the example script for how to use the container. Signed-off-by: Michael Keller --- .gitignore | 3 + packaging/android/README.md | 19 ++-- .../docker/android-build-container/Dockerfile | 99 ++++++++++++------- .../android-build-container/setup-docker.sh | 12 +-- 4 files changed, 81 insertions(+), 52 deletions(-) mode change 100644 => 100755 scripts/docker/android-build-container/setup-docker.sh diff --git a/.gitignore b/.gitignore index a26a4fabb..a7a77eb71 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,6 @@ packaging/ios/Info.plist packaging/ios/Qt packaging/ios/asset_catalog_compiler.Info.plist appdata/subsurface.appdata.xml +scripts/docker/android-build-container/android-build-setup.sh +scripts/docker/android-build-container/variables.sh + diff --git a/packaging/android/README.md b/packaging/android/README.md index 9bfa68bf2..421a86b05 100644 --- a/packaging/android/README.md +++ b/packaging/android/README.md @@ -19,29 +19,24 @@ CONTAINER_ID=$(docker container ls -a -q -f name=${CONTAINER_NAME}) # Create the image if it does not exist if [[ -z "${CONTAINER_ID}" ]]; then - docker create -v ${SUBSURFACE_ROOT}:/android/subsurface -w /android --name=${CONTAINER_NAME} subsurface/android-build-container:5.15.1 sleep infinity + docker create -v ${SUBSURFACE_ROOT}:/android/subsurface --name=${CONTAINER_NAME} subsurface/android-build:5.15.1 sleep infinity fi docker start ${CONTAINER_NAME} BUILD_PARAMETERS="" if [[ -n "${CONTAINER_ID}" ]]; then - BUILD_PARAMETERS="-quick" + BUILD_PARAMETERS="-quick" else - # Prepare the image for first use - docker exec -t ${CONTAINER_NAME} rm /android/5.15.1/android/lib/cmake/Qt5Test/Qt5TestConfig.cmake - docker exec -t ${CONTAINER_NAME} apt-get install --reinstall cpp-7 gcc-7-base libgcc-7-dev libcc1-0 gcc-7 + # Prepare the image for first use - # Set the git id - docker exec -t ${CONTAINER_NAME} git config --global user.name "${GIT_NAME}" - docker exec -t ${CONTAINER_NAME} git config --global user.email "${GIT_EMAIL}" + # Set the git id + docker exec -t ${CONTAINER_NAME} git config --global user.name "${GIT_NAME}" + docker exec -t ${CONTAINER_NAME} git config --global user.email "${GIT_EMAIL}" fi # Build. Do not rebuild the dependencies if this is not the first build -docker exec -t ${CONTAINER_NAME} /bin/bash -x ./subsurface/packaging/android/qmake-build.sh ${BUILD_PARAMETERS} - -# Copy the output files into the 'android-debug' directory in the source directory -docker cp ${CONTAINER_NAME}:/android/subsurface-mobile-build/android-build/build/outputs/apk/debug/. ${SUBSURFACE_ROOT}/android-debug/ +docker exec -e OUTPUT_DIR="/android/subsurface/android-debug" -t ${CONTAINER_NAME} /bin/bash -x ./subsurface/packaging/android/qmake-build.sh ${BUILD_PARAMETERS} # Stop the container docker stop ${CONTAINER_NAME} diff --git a/scripts/docker/android-build-container/Dockerfile b/scripts/docker/android-build-container/Dockerfile index d260ea957..f5f6200a1 100644 --- a/scripts/docker/android-build-container/Dockerfile +++ b/scripts/docker/android-build-container/Dockerfile @@ -1,43 +1,33 @@ -From ubuntu:18.04 +FROM subsurface/android-build-container:5.15.1 as base + +FROM ubuntu:22.04 as build RUN apt-get update && \ apt-get upgrade -y && \ apt-get install -y \ - autoconf \ - automake \ - cmake \ - git \ - libtool-bin \ - make \ - wget \ unzip \ - python \ - python3-pip \ - bzip2 \ - pkg-config \ - libx11-xcb1 \ - libgl1-mesa-glx \ - libglib2.0-0 \ + git \ + cmake \ + autoconf \ + libtool-bin \ openjdk-8-jdk \ - curl \ - coreutils \ - p7zip-full + wget + +WORKDIR /android + +COPY --from=base /android/5.15.1 5.15.1 -# create our working directory and place the local copies of the Qt # install, NDK and SDK there, plus the three files from the Subsurface # sources that we need to get the prep routines to run -RUN mkdir -p /android -ADD commandlinetools-linux-*.zip /android/ -RUN cd /android && unzip commandlinetools-linux-*.zip -ADD android-build-setup.sh variables.sh /android/ +RUN wget https://dl.google.com/android/repository/commandlinetools-linux-6858069_latest.zip && \ + unzip commandlinetools-linux-*.zip +ADD android-build-setup.sh variables.sh . # run the build setup -RUN ls -l /android -RUN cd /android && bash -x /android/android-build-setup.sh +RUN bash -x android-build-setup.sh # clean up the files that we don't need to keep the container smaller -RUN cd /android && \ - rm -rf \ +RUN rm -rf \ 5*/android/lib/*x86* \ 5*/android/doc \ 5*/android/include/QtHelp \ @@ -48,6 +38,7 @@ RUN cd /android && \ 5*/android/include/QtTest \ 5*/android/include/QtXml \ 5*/android/plugins/geoservices/libqtgeoservices_mapboxgl.so \ + 5*/android/lib/cmake/Qt5Test/Qt5TestConfig.cmake \ commandlinetools-linux-*.zip \ $( find platforms -name arch-mips -o -name arch-x86 ) \ toolchains/x86-* android-ndk*/toolchains/llvm/prebuilt/x86-* \ @@ -69,10 +60,50 @@ RUN cd /android && \ emulator \ platform-tools-2 \ variables.sh \ - android-build-setup.sh - /usr/lib/gcc && \ - ls -l && \ - du -sh * -RUN apt-get clean -#RUN cd /android/android-ndk-r18b/toolchains && ln -s x86_64-4.9 x86-64-4.9 -RUN touch /android/finished-"`date`" + android-build-setup.sh \ + /usr/lib/gcc + +FROM ubuntu:22.04 + +# Repeat exactly the same step as in the 'build' image above, so it can be reused +RUN apt-get update && \ + apt-get upgrade -y && \ + apt-get install -y \ + unzip \ + git \ + cmake \ + autoconf \ + libtool-bin \ + openjdk-8-jdk \ + wget + +RUN apt-get install -y \ + autoconf \ + automake \ + cmake \ + git \ + make \ + wget \ + zip \ + unzip \ + python3 \ + python3-pip \ + bzip2 \ + pkg-config \ + libx11-xcb1 \ + libgl1-mesa-glx \ + libglib2.0-0 \ + openjdk-8-jdk \ + curl \ + coreutils \ + p7zip-full && \ + apt-get clean + +WORKDIR /android + +COPY --from=build /android/ . + +RUN git config --global --add safe.directory /android/subsurface && \ + git config --global --add safe.directory /android/subsurface/libdivecomputer + +RUN touch finished-"`date`" diff --git a/scripts/docker/android-build-container/setup-docker.sh b/scripts/docker/android-build-container/setup-docker.sh old mode 100644 new mode 100755 index e8437d30e..9aab98c7e --- a/scripts/docker/android-build-container/setup-docker.sh +++ b/scripts/docker/android-build-container/setup-docker.sh @@ -5,16 +5,16 @@ # Google makes it intentionally very hard to download the command line tools # the URL is constantly changing and the website requires you to click through # a license. +# # Today this URL works: -if [ ! -f commandlinetools-linux-6858069_latest.zip ] ; then - wget https://dl.google.com/android/repository/commandlinetools-linux-6858069_latest.zip -fi -# if this fails, go to https://developer.android.com/studio#cmdline-tools and click through -# for yourself... +# https://dl.google.com/android/repository/commandlinetools-linux-6858069_latest.zip +# +# If this fails, go to https://developer.android.com/studio#cmdline-tools and +# click through for yourself, and then update the URL in the Dockerfile # copy the dependency script into this folder cp ../../../packaging/android/android-build-setup.sh . cp ../../../packaging/android/variables.sh . # create the container (this takes a while) -sudo docker build -t android-builder --squash . +docker build -t android-build .