From d9c29c675144d953baa1498390a72ccfe928cc36 Mon Sep 17 00:00:00 2001 From: Fmstrat Date: Fri, 21 Feb 2025 22:12:11 +0000 Subject: [PATCH] add support for building via a docker container [remote dev] --- .dockerignore | 15 ++++++++ .gitignore | 3 +- docker/Dockerfile | 84 +++++++++++++++++++++++++++++++++++++++++++++ docker/builder.sh | 21 ++++++++++++ docker/mkbuilder.sh | 14 ++++++++ 5 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 .dockerignore create mode 100644 docker/Dockerfile create mode 100755 docker/builder.sh create mode 100755 docker/mkbuilder.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..9baa71a --- /dev/null +++ b/.dockerignore @@ -0,0 +1,15 @@ +LICENSE.md +README.md +analysis_options.yaml +android +assets +build +build.sh +data +docker +fastlane +lib +pubspec.lock +pubspec.yaml +sign.sh +test diff --git a/.gitignore b/.gitignore index 12e500c..0349890 100644 --- a/.gitignore +++ b/.gitignore @@ -48,4 +48,5 @@ app.*.map.json /android/app/.cxx # Custom -TODO.txt \ No newline at end of file +TODO.txt +data \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..c00e8df --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,84 @@ +FROM ubuntu:22.04 + +ENV DEBIAN_FRONTEND noninteractive +ENV ANDROID_SDK_ROOT /opt/android-sdk-linux +ENV PATH "${PATH}:/opt/flutter/bin:/root/.pub-cache/bin:${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin:/opt/android-sdk-linux/platform-tools" + +ENV HOME=/root + +# Prereqs +RUN \ + apt-get update &&\ + apt-get install -y --no-install-recommends \ + bash \ + curl \ + file \ + git 2.x \ + unzip \ + xz-utils \ + zip \ + libglu1-mesa \ + libxi-dev \ + libxmu-dev \ + libglu1-mesa-dev \ + git-lfs \ + openssl \ + wget + +# Build prereqs +RUN \ + apt-get install -y \ + cmake curl git wget unzip libgconf-2-4 gdb libstdc++6 libglu1-mesa fonts-droid-fallback lib32stdc++6 python3 sed \ + cmake ninja-build build-essential libgl1-mesa-dev libegl1-mesa-dev libgles2-mesa-dev clang pkg-config libgtk-3-dev \ + liblzma-dev libmount-dev libblkid-dev libgcrypt20-dev libgpg-error-dev libssl-dev libpng-dev libjpeg-dev \ + libtiff-dev libgif-dev libgtk-3-dev + +# Android SDK prequisites +# https://developer.android.com/studio#command-tools +RUN \ + apt-get install -y --no-install-recommends \ + git \ + git-lfs \ + openssl \ + wget \ + unzip +# Android SDK +RUN \ + wget --quiet https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -O /tmp/tools.zip && \ + mkdir -p ${ANDROID_SDK_ROOT}/cmdline-tools && \ + unzip -q /tmp/tools.zip -d ${ANDROID_SDK_ROOT}/cmdline-tools && \ + mv ${ANDROID_SDK_ROOT}/cmdline-tools/cmdline-tools ${ANDROID_SDK_ROOT}/cmdline-tools/latest && \ + rm -v /tmp/tools.zip && \ + mkdir -p /root/.android/ && touch /root/.android/repositories.cfg &&\ + apt-get install -y --no-install-recommends openjdk-17-jdk openjdk-17-jre &&\ + yes | sdkmanager --licenses &&\ + sdkmanager --update +# Platform tools +# Get latest with sdkmanager --list +RUN sdkmanager --install "build-tools;33.0.1" +RUN sdkmanager --install "ndk;26.3.11579264" +RUN sdkmanager --install "cmake;3.31.4" +RUN sdkmanager --install platform-tools +RUN sdkmanager --install emulator +RUN sdkmanager --install tools +RUN sdkmanager --install "platforms;android-28" +RUN sdkmanager --install "platforms;android-31" +RUN sdkmanager --install "platforms;android-33" +RUN sdkmanager --install "platforms;android-35" +RUN sdkmanager --install "platforms;android-34" +RUN sdkmanager --install "platforms;android-32" + +# Flutter +ARG DEV_UID=0 +RUN \ + wget --quiet https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.29.0-stable.tar.xz -O /tmp/flutter.tar.xz &&\ + mkdir -p /opt &&\ + cd /opt &&\ + tar xf /tmp/flutter.tar.xz &&\ + rm /tmp/flutter.tar.xz &&\ + git config --global --add safe.directory /opt/flutter &&\ + dart pub global activate cider &&\ + chown -R ${DEV_UID} /opt/flutter +RUN flutter --disable-analytics +RUN flutter upgrade +RUN chmod a+w /opt/flutter/packages -R diff --git a/docker/builder.sh b/docker/builder.sh new file mode 100755 index 0000000..c046ac0 --- /dev/null +++ b/docker/builder.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +cd ${SCRIPT_DIR}/.. +mkdir -p ./data/home +docker run \ + --rm \ + -ti \ + --net host \ + -v "${PWD}/../:${PWD}/../" \ + -w "${PWD}" \ + --name flutter-dev-obtainium \ + --user $(id -u) \ + -v ./data/home:/home/${USER} \ + -e USER=${USER} \ + -e HOME=/home/${USER} \ + -e ANDROID_USER_HOME=${HOME}/.android \ + -e GRADLE_USER_HOME=${HOME}/.gradle \ + -e PS1="${debian_chroot:+($debian_chroot)}${USER}@\h:\w\$ " \ + flutter-builder-obtainium \ No newline at end of file diff --git a/docker/mkbuilder.sh b/docker/mkbuilder.sh new file mode 100755 index 0000000..77fd71c --- /dev/null +++ b/docker/mkbuilder.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +D=$(date +'%Y%m%d.%H%M%S%3N') + +set -e + +cd "${SCRIPT_DIR}/.." +# Create the builder image +docker build \ + -t flutter-builder-obtainium \ + -f ./docker/Dockerfile \ + --build-arg="DEV_UID=$(id -u)" \ + .