dev
text 203 lines 8.28 KB
Raw
1 # docker buildx build --push --pull --platform linux/amd64,linux/arm64 . -f Dockerfile -t ghcr.io/cake-tech/cake_wallet:debian13-flutter3.41.9-ndkr28-go1.24.1-ruststablenightly
2
3 # Heavily inspired by cirrusci images
4 # https://github.com/cirruslabs/docker-images-android/blob/master/sdk/tools/Dockerfile
5 # https://github.com/cirruslabs/docker-images-android/blob/master/sdk/34/Dockerfile
6 # https://github.com/cirruslabs/docker-images-android/blob/master/sdk/34-ndk/Dockerfile
7 # https://github.com/cirruslabs/docker-images-flutter/blob/master/sdk/Dockerfile
8
9 FROM docker.io/debian:13
10
11 LABEL org.opencontainers.image.source=https://github.com/cake-tech/cake_wallet
12
13 # Set necessary environment variables
14 # Set Go version to latest known-working version
15 ENV GOLANG_VERSION=1.24.1
16
17 # Pin Flutter version to latest known-working version
18 ENV FLUTTER_VERSION=3.41.9
19
20 # Pin Android Studio, platform, and build tools versions to latest known-working version
21 # Comes from https://developer.android.com/studio/#command-tools
22 ENV ANDROID_SDK_TOOLS_VERSION=13114758
23 # Comes from https://developer.android.com/studio/releases/build-tools
24 ENV ANDROID_PLATFORM_VERSION=35
25 ENV ANDROID_BUILD_TOOLS_VERSION=34.0.0
26
27 # If we ever need to migrate the home directory...
28 RUN sed -i 's|^root:[^:]*:[^:]*:[^:]*:[^:]*:/root:|root:x:0:0:root:/root:|' /etc/passwd
29 # mkdir -p /root && rm -rf /root && cp -a /root /root
30 ENV HOME=/root
31 ENV ANDROID_HOME=/opt/android-sdk-linux \
32 LANG=en_US.UTF-8 \
33 LC_ALL=en_US.UTF-8 \
34 LANGUAGE=en_US:en
35
36 # Set Android SDK paths
37 ENV ANDROID_SDK_ROOT=$ANDROID_HOME \
38 PATH=${PATH}:${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/platform-tools:${ANDROID_HOME}/emulator
39
40 # Upgrade base image
41 RUN apt-get update \
42 && apt-get upgrade -y
43
44 # Install all build dependencies
45 RUN set -o xtrace \
46 && cd /opt \
47 && apt-get install -y --no-install-recommends --no-install-suggests \
48 # protobuf
49 protobuf-compiler libprotobuf-dev \
50 # Core dependencies
51 bc build-essential curl default-jdk git jq lcov libglu1-mesa libpulse0 libsqlite3-dev libstdc++6 locales openssh-client ruby-bundler ruby-full sudo unzip wget zip \
52 # for x86 emulators
53 libatk-bridge2.0-0 libgdk-pixbuf-xlib-2.0-0 libgtk-3-0 libnspr4 libnss3-dev libsqlite3-dev libxtst6 libxss1 lftp sqlite3 xxd \
54 # Linux desktop dependencies
55 clang lld cmake libgtk-3-dev ninja-build pkg-config libsecret-1-0 libsecret-1-dev gir1.2-secret-1 \
56 # monero_c dependencies
57 autoconf automake build-essential ccache gperf libtool llvm \
58 # extra stuff for KVM
59 bridge-utils libvirt-clients libvirt-daemon-system qemu-kvm udev \
60 # Linux test dependencies
61 ffmpeg network-manager x11-utils xvfb psmisc \
62 # extra linux dependencies so flutter doesn't complain
63 mesa-utils \
64 # database
65 libsqlite3-0 libsqlite3-dev \
66 # aarch64-linux-gnu dependencies
67 g++-aarch64-linux-gnu gcc-aarch64-linux-gnu \
68 # x86_64-linux-gnu dependencies
69 g++-x86-64-linux-gnu gcc-x86-64-linux-gnu \
70 # flatpak dependencies
71 flatpak flatpak-builder binutils elfutils patch unzip xz-utils zstd \
72 # docker dependencies
73 docker-cli rsync \
74 && apt clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
75 && sh -c 'echo "en_US.UTF-8 UTF-8" > /etc/locale.gen' \
76 && locale-gen \
77 && update-locale LANG=en_US.UTF-8
78
79 ENV FLATPAK_RUNTIME_VERSION=24.08
80 RUN flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo \
81 && flatpak install -y flathub org.freedesktop.Platform//${FLATPAK_RUNTIME_VERSION} \
82 && flatpak install -y flathub org.freedesktop.Sdk//${FLATPAK_RUNTIME_VERSION}
83
84 # Install nodejs for Github Actions
85 RUN curl -fsSL https://deb.nodesource.com/setup_24.x | bash - && \
86 apt-get install -y --no-install-recommends nodejs && \
87 apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
88
89 # Install Go
90 ENV PATH=${PATH}:/usr/local/go/bin:${HOME}/go/bin
91 ENV GOROOT=/usr/local/go
92 ENV GOPATH=${HOME}/go
93 RUN ARCH=$(uname -m) && \
94 if [ "$ARCH" = "x86_64" ]; then \
95 wget https://go.dev/dl/go${GOLANG_VERSION}.linux-amd64.tar.gz -O go.tar.gz; \
96 elif [ "$ARCH" = "aarch64" ]; then \
97 wget https://go.dev/dl/go${GOLANG_VERSION}.linux-arm64.tar.gz -O go.tar.gz; \
98 else \
99 echo "Unsupported architecture: $ARCH"; exit 1; \
100 fi && \
101 rm -rf /usr/local/go && \
102 tar -C /usr/local -xzf go.tar.gz && \
103 rm go.tar.gz && \
104 go install golang.org/x/mobile/cmd/gomobile@latest && \
105 gomobile init
106
107 RUN git config --global user.email "czarek@cakewallet.com" \
108 && git config --global user.name "CakeWallet CI" \
109 && git config --global --add safe.directory '*'
110
111 # Install Android SDK commandline tools and emulator
112 RUN ARCH=$(uname -m) && \
113 if [ "$ARCH" != "x86_64" ]; then exit 0; fi \
114 && wget -q https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS_VERSION}_latest.zip -O android-sdk-tools.zip \
115 && mkdir -p ${ANDROID_HOME}/cmdline-tools/ \
116 && unzip -q android-sdk-tools.zip -d ${ANDROID_HOME}/cmdline-tools/ \
117 && mv ${ANDROID_HOME}/cmdline-tools/cmdline-tools ${ANDROID_HOME}/cmdline-tools/latest \
118 && chown -R root:root $ANDROID_HOME \
119 && rm android-sdk-tools.zip \
120 && echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers \
121 && yes | sdkmanager --licenses \
122 && wget -O /usr/bin/android-wait-for-emulator https://raw.githubusercontent.com/travis-ci/travis-cookbooks/master/community-cookbooks/android-sdk/files/default/android-wait-for-emulator \
123 && chmod +x /usr/bin/android-wait-for-emulator \
124 && sdkmanager platform-tools \
125 && mkdir -p ${HOME}/.android \
126 && touch ${HOME}/.android/repositories.cfg
127
128
129 # Handle emulator not being available on linux/arm64 (https://issuetracker.google.com/issues/227219818)
130 RUN ARCH=$(uname -m) && \
131 if [ "$ARCH" != "x86_64" ]; then exit 0; fi \
132 && sdkmanager emulator
133
134 # Pre-install extra Android SDK dependencies in order to not have to download them for each build
135 RUN ARCH=$(uname -m) && \
136 if [ "$ARCH" != "x86_64" ]; then exit 0; fi \
137 && yes | sdkmanager \
138 "platforms;android-$ANDROID_PLATFORM_VERSION" \
139 "build-tools;$ANDROID_BUILD_TOOLS_VERSION" \
140 "platforms;android-33" \
141 "platforms;android-34" \
142 "platforms;android-35" \
143 "platforms;android-36" \
144 "build-tools;33.0.2" \
145 "build-tools;33.0.1" \
146 "build-tools;33.0.0" \
147 "build-tools;35.0.0" \
148 "cmake;3.22.1"
149
150 # Install extra NDK dependency for sp_scanner
151 ENV ANDROID_NDK_VERSION=28.2.13676358
152
153 ENV ANDROID_NDK_HOME=$ANDROID_SDK_ROOT/ndk/$ANDROID_NDK_VERSION
154 ENV ANDROID_NDK=$ANDROID_NDK_HOME
155
156 RUN ARCH=$(uname -m) && \
157 if [ "$ARCH" != "x86_64" ]; then exit 0; fi \
158 && yes | sdkmanager "ndk;$ANDROID_NDK_VERSION"
159
160 # Install dependencies for tests
161 # Comes from https://github.com/ReactiveCircus/android-emulator-runner
162 RUN ARCH=$(uname -m) && \
163 if [ "$ARCH" != "x86_64" ]; then exit 0; fi \
164 && yes | sdkmanager \
165 "system-images;android-29;default;x86_64" \
166 "system-images;android-31;default;x86_64" \
167 "platforms;android-29" \
168 "platforms;android-31"
169
170 # Fake the KVM status so the Android emulator doesn't complain (that much)
171 RUN (addgroup kvm || true) && \
172 adduser root kvm && \
173 mkdir -p /etc/udev/rules.d/ && \
174 echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | tee /etc/udev/rules.d/99-kvm4all.rules
175
176 # Install rustup, rust toolchains, and cargo-ndk
177 ENV PATH=${HOME}/.cargo/bin:${PATH}
178 RUN curl https://sh.rustup.rs -sSf | bash -s -- -y && \
179 cargo install cargo-ndk && \
180 for toolchain in stable nightly; \
181 do \
182 for target in aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android x86_64-unknown-linux-gnu aarch64-unknown-linux-gnu aarch64-unknown-linux-gnu; \
183 do \
184 rustup target add --toolchain $toolchain $target; \
185 done \
186 done
187
188 # Download and install Flutter
189 ENV HOME=${HOME}
190 ENV FLUTTER_HOME=${HOME}/sdks/flutter/${FLUTTER_VERSION}
191 ENV FLUTTER_ROOT=$FLUTTER_HOME
192 ENV PATH=${PATH}:${FLUTTER_HOME}/bin:${FLUTTER_HOME}/bin/cache/dart-sdk/bin
193
194 RUN git clone --branch ${FLUTTER_VERSION} https://github.com/flutter/flutter.git ${FLUTTER_HOME} && \
195 cd ${FLUTTER_HOME} && \
196 git fetch -a
197
198 RUN yes | flutter doctor --android-licenses \
199 && flutter doctor \
200 && chown -R root:root ${FLUTTER_HOME}
201
202 # Download and pre-cache necessary Flutter artifacts to speed up builds
203 RUN flutter precache