1
# Usage:
2
-# docker build . -f Dockerfile.linux -t ghcr.io/cake-tech/cake_wallet:main-linux
2
+# docker build . -f Dockerfile -t ghcr.io/cake-tech/cake_wallet:main-linux
3
# docker push ghcr.io/cake-tech/cake_wallet:main-linux
4
5
+# Heavily inspired by cirrusci images
6
+# https://github.com/cirruslabs/docker-images-android/blob/master/sdk/tools/Dockerfile
7
+# https://github.com/cirruslabs/docker-images-android/blob/master/sdk/34/Dockerfile
8
+# https://github.com/cirruslabs/docker-images-android/blob/master/sdk/34-ndk/Dockerfile
9
+# https://github.com/cirruslabs/docker-images-flutter/blob/master/sdk/Dockerfile
10
+
11
FROM --platform=linux/amd64 docker.io/debian:12
12
13
LABEL org.opencontainers.image.source=https://github.com/cake-tech/cake_wallet
14
15
+# Set necessary environment variables
16
+# Set Go version to latest known-working version
17
ENV GOLANG_VERSION=1.23.4
10
-# comes from https://developer.android.com/studio/#command-tools
18
+
19
+# Pin Flutter version to latest known-working version
20
+ENV FLUTTER_VERSION=3.24.4
21
+
22
+# Pin Android Studio, platform, and build tools versions to latest known-working version
23
+# Comes from https://developer.android.com/studio/#command-tools
24
ENV ANDROID_SDK_TOOLS_VERSION=11076708
12
-# https://developer.android.com/studio/releases/build-tools
25
+# Comes from https://developer.android.com/studio/releases/build-tools
26
ENV ANDROID_PLATFORM_VERSION=34
27
ENV ANDROID_BUILD_TOOLS_VERSION=34.0.0
28
16
-ENV FLUTTER_VERSION=3.24.0
17
-
29
# If we ever need to migrate the home directory...
30
RUN sed -i 's|^root:[^:]*:[^:]*:[^:]*:[^:]*:/root:|root:x:0:0:root:/root:|' /etc/passwd
31
# mkdir -p /root && rm -rf /root && cp -a /root /root
32
ENV HOME=/root
22
-# Heavily inspired by cirrusci images
23
-# https://github.com/cirruslabs/docker-images-android/blob/master/sdk/tools/Dockerfile
24
-# https://github.com/cirruslabs/docker-images-android/blob/master/sdk/34/Dockerfile
25
-# https://github.com/cirruslabs/docker-images-android/blob/master/sdk/34-ndk/Dockerfile
26
-# https://github.com/cirruslabs/docker-images-flutter/blob/master/sdk/Dockerfile
27
-
33
ENV ANDROID_HOME=/opt/android-sdk-linux \
34
LANG=en_US.UTF-8 \
35
LC_ALL=en_US.UTF-8 \
36
LANGUAGE=en_US:en
37
38
+# Set Android SDK paths
39
ENV ANDROID_SDK_ROOT=$ANDROID_HOME \
40
PATH=${PATH}:${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/platform-tools:${ANDROID_HOME}/emulator
41
42
+# Upgrade base image
43
+RUN apt-get update \
44
+ && apt-get upgrade -y
45
+
46
+# Install all build dependencies
47
RUN set -o xtrace \
48
&& cd /opt \
38
- && apt-get update \
39
- && apt-get upgrade -y \
40
- && apt-get install -y jq \
41
- && apt-get install -y default-jdk \
42
- && apt-get install -y sudo wget zip unzip git openssh-client curl bc software-properties-common build-essential ruby-full ruby-bundler libstdc++6 libpulse0 libglu1-mesa locales lcov libsqlite3-dev --no-install-recommends \
49
+ && apt-get install -y --no-install-recommends --no-install-suggests \
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 software-properties-common sudo unzip wget zip \
52
# for x86 emulators
44
- && apt-get install -y libxtst6 libnss3-dev libnspr4 libxss1 libatk-bridge2.0-0 libgtk-3-0 libgdk-pixbuf2.0-0 \
45
- && apt-get install -y -qq xxd \
46
- && apt-get install -y lftp \
47
- && apt-get install -qq -y sqlite3 libsqlite3-dev \
48
- # linux desktop dependencies
49
- && apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev \
53
+ libatk-bridge2.0-0 libgdk-pixbuf2.0-0 libgtk-3-0 libnspr4 libnss3-dev libsqlite3-dev libxtst6 libxss1 lftp sqlite3 xxd \
54
+ # Linux desktop dependencies
55
+ clang cmake libgtk-3-dev ninja-build pkg-config \
56
# monero_c dependencies
51
- && apt-get install -y ccache build-essential autoconf libtool gperf llvm \
57
+ autoconf automake build-essential ccache gperf libtool llvm \
58
# extra stuff for KVM
53
- && apt-get install -y udev qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils \
54
- # for linux tests
55
- && apt-get install -y xvfb network-manager ffmpeg x11-utils \
56
- # for aarch64-linux-gnu
57
- && apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu \
58
- && rm -rf /var/lib/apt/lists/* \
59
+ bridge-utils libvirt-clients libvirt-daemon-system qemu-kvm udev \
60
+ # Linux test dependencies
61
+ ffmpeg network-manager x11-utils xvfb psmisc \
62
+ # aarch64-linux-gnu dependencies
63
+ g++-aarch64-linux-gnu gcc-aarch64-linux-gnu \
64
+ && apt clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
65
&& sh -c 'echo "en_US.UTF-8 UTF-8" > /etc/locale.gen' \
66
&& locale-gen \
67
&& update-locale LANG=en_US.UTF-8
68
63
-# install nodejs for actions
64
-RUN apt-get update && \
65
- apt-get install -y curl && \
66
- curl -fsSL https://deb.nodesource.com/setup_23.x | bash - && \
67
- apt-get install -y nodejs && \
68
- apt-get clean && \
69
- rm -rf /var/lib/apt/lists/*
70
-
71
-RUN wget https://go.dev/dl/go${GOLANG_VERSION}.linux-amd64.tar.gz &&\
72
- rm -rf /usr/local/go &&\
73
- tar -C /usr/local -xzf go${GOLANG_VERSION}.linux-amd64.tar.gz
69
+# Install nodejs for Github Actions
70
+RUN curl -fsSL https://deb.nodesource.com/setup_23.x | bash - && \
71
+ apt-get install -y --no-install-recommends nodejs && \
72
+ apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
73
74
+# Install Go
75
ENV PATH=${PATH}:/usr/local/go/bin:${HOME}/go/bin
76
ENV GOROOT=/usr/local/go
77
ENV GOPATH=${HOME}/go
78
-RUN go install golang.org/x/mobile/cmd/gomobile@latest
79
-RUN gomobile init
78
+RUN wget https://go.dev/dl/go${GOLANG_VERSION}.linux-amd64.tar.gz &&\
79
+ rm -rf /usr/local/go &&\
80
+ tar -C /usr/local -xzf go${GOLANG_VERSION}.linux-amd64.tar.gz && \
81
+ go install golang.org/x/mobile/cmd/gomobile@latest && \
82
+ gomobile init
83
84
+# Install Android SDK commandline tools and emulator
85
RUN wget -q https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS_VERSION}_latest.zip -O android-sdk-tools.zip \
86
&& mkdir -p ${ANDROID_HOME}/cmdline-tools/ \
87
&& unzip -q android-sdk-tools.zip -d ${ANDROID_HOME}/cmdline-tools/ \
98
&& git config --global user.email "czarek@cakewallet.com" \
99
&& git config --global user.name "CakeWallet CI"
100
97
-# emulator is not available on linux/arm64 (https://issuetracker.google.com/issues/227219818)
101
+# Handle emulator not being available on linux/arm64 (https://issuetracker.google.com/issues/227219818)
102
RUN if [ $(uname -m) == "x86_64" ]; then sdkmanager emulator ; fi
103
100
-# Extra dependencies to not download them for cake wallet build
104
+# Pre-install extra Android SDK dependencies in order to not have to download them for each build
105
RUN yes | sdkmanager \
106
"platforms;android-$ANDROID_PLATFORM_VERSION" \
107
"build-tools;$ANDROID_BUILD_TOOLS_VERSION" \
111
"build-tools;33.0.0" \
112
"build-tools;35.0.0"
113
114
+# Install extra NDK dependency for sp_scanner
115
ENV ANDROID_NDK_VERSION=27.2.12479018
111
-
112
-# Extra ndk dependency for sp_scanner
116
RUN yes | sdkmanager "ndk;$ANDROID_NDK_VERSION" \
117
"ndk;27.0.12077973"
118
116
-# https://github.com/ReactiveCircus/android-emulator-runner dependencies for tests
119
+# Install dependencies for tests
120
+# Comes from https://github.com/ReactiveCircus/android-emulator-runner
121
RUN yes | sdkmanager "system-images;android-29;default;x86" \
122
"system-images;android-29;default;x86_64" \
123
"system-images;android-31;default;x86_64" \
124
"platforms;android-29"
125
122
-# fake the KVM status so android emulator doesn't complain (that much)
126
+# Fake the KVM status so the Android emulator doesn't complain (that much)
127
RUN (addgroup kvm || true) && \
128
adduser root kvm && \
129
mkdir -p /etc/udev/rules.d/ && \
130
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | tee /etc/udev/rules.d/99-kvm4all.rules
131
132
+# Install rustup, rust toolchains, and cargo-ndk
133
ENV PATH=${HOME}/.cargo/bin:${PATH}
129
-
134
RUN curl https://sh.rustup.rs -sSf | bash -s -- -y && \
135
cargo install cargo-ndk && \
136
for target in aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android x86_64-unknown-linux-gnu; \
138
rustup target add --toolchain stable $target; \
139
done
140
137
-
141
+# Download and install Flutter
142
ENV HOME=${HOME}
143
ENV FLUTTER_HOME=${HOME}/sdks/flutter/${FLUTTER_VERSION}
144
ENV FLUTTER_ROOT=$FLUTTER_HOME
141
-
145
ENV PATH=${PATH}:${FLUTTER_HOME}/bin:${FLUTTER_HOME}/bin/cache/dart-sdk/bin
146
144
-RUN git clone --depth 1 --branch ${FLUTTER_VERSION} https://github.com/flutter/flutter.git ${FLUTTER_HOME}
145
-
146
-RUN yes | flutter doctor --android-licenses \
147
+RUN git clone --depth 1 --branch ${FLUTTER_VERSION} https://github.com/flutter/flutter.git ${FLUTTER_HOME} \
148
+ && yes | flutter doctor --android-licenses \
149
&& flutter doctor \
150
&& chown -R root:root ${FLUTTER_HOME}
151
152
+# Download and pre-cache necessary Flutter artifacts to speed up builds
153
RUN flutter precache