构建Flutter Android编译环境的Jenkins Slave

曾经给公司搞了个 Android 编译环境的 Docker 镜像,但是时间比较早,大概是17年5/6月,当时还加入 Node.JS 和 Cordova ,构建出来的镜像的 Size 非常巨大,达到了 3.7 G,于是想趁着添加 Flutter 的环境,重新搞一个,这里记录下.

FROM jenkins/jnlp-slave:latest

# 官方使用的jenkins用户没有太多权限,这里用root
USER root

# 抛弃 Android 4.4 版本之前的API SDK
ARG ANDROID_APIS="android-20,android-21,android-22,android-23,android-24,android-25,android-26,android-27,android-28"
ARG ANDROID_BUILD_TOOLS_VER=28.0.2
ARG ANDROID_SDK_TOOLS_VER=4333796
ARG FLUTTER_VER=0.7.3
ARG GRADLE_VER=5.3.1

ENV ANDROID_HOME="/opt/android" \
    FLUTTER_ROOT="/opt/flutter" \
    FLUTTER_STORAGE_BASE_URL="https://storage.flutter-io.cn" \
    GRADLE_HOME="/usr/share/gradle" \
    PUB_HOSTED_URL="https://pub.flutter-io.cn"

ENV PATH {PATH}:{ANDROID_HOME}/tools:{ANDROID_HOME}/tools/bin:{ANDROID_HOME}/platform-tools:{ANDROID_HOME}/build-tools/{ANDROID_BUILD_TOOLS_VER}:{GRADLE_HOME}/bin:{FLUTTER_ROOT}/bin:{FLUTTER_ROOT}/bin/cache/dart-sdk/bin

RUN dpkg --add-architecture i386 \
    && apt-get -qq update \
    && apt-get -qq install -y apt-transport-https build-essential lib32stdc++6 lib32z1 --no-install-recommends \

    # Install Gradle
    && curl -SL https://downloads.gradle.org/distributions/gradle-{GRADLE_VER}-bin.zip -o /tmp/gradle.zip \
    && unzip /tmp/gradle.zip -d /tmp/ \
    && rm /tmp/gradle.zip \
    && mv /tmp/gradle-{GRADLE_VER}{GRADLE_HOME} \

    # Install Android SDK
    && mkdir -p {ANDROID_HOME} \
    && cd{ANDROID_HOME} \
    && curl -sSL https://dl.google.com/android/repository/sdk-tools-linux-{ANDROID_SDK_TOOLS_VER}.zip -o /tmp/tools.zip \
    && unzip /tmp/tools.zip -d ./ \
    && rm /tmp/tools.zip \
    && yes | sdkmanager --licenses \
    && yes | android update sdk -a -u -t platform-tools,{ANDROID_APIS},build-tools-{ANDROID_BUILD_TOOLS_VER} \
    && chmod a+x -R{ANDROID_HOME} \
    && chown -R jenkins:jenkins {ANDROID_HOME} \

    # Install Flutter
    && curl -sSL https://storage.googleapis.com/flutter_infra/releases/beta/linux/flutter_linux_v{FLUTTER_VER}-beta.tar.xz -o /tmp/flutter.tar.xz \
    && tar -xf /tmp/flutter.tar.xz -C /opt \
    && rm /tmp/flutter.tar.xz \
    && flutter config --no-analytics \

    # Clean
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
    && apt-get autoremove -y \
    && apt-get clean

USER jenkins

构建出来的 Image Size 达到了 2.9G,可以说本次优化并不成功.

关键加了从 Android-20 (4.4) 到 Android-28 (9) 的 API SDK 以及 Gradle 5.3 后,Image Size 就已经达到 2.2G, 这时候再加入 flutter 的 SDK 后, Size 已经飙到 2.9G . 虽然可以将jenkins/jnlp-slave:latest这个近 500M 的基础镜像换成alpine版本,这样能省将近 400M,不过环境需要的一些 Apk 包不太容易添加了.