-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDockerfile
98 lines (87 loc) · 4.59 KB
/
Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# syntax=docker/dockerfile:1
# Stage 1: Download Android command-line tools (build platform-specific)
FROM --platform=$BUILDPLATFORM busybox:stable AS download-tools
ADD https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip /w/commandlinetools.zip
WORKDIR /w
RUN unzip commandlinetools.zip
# Stage 2: Setup Android SDK (build platform-specific)
FROM --platform=$BUILDPLATFORM eclipse-temurin:21-jdk AS android-sdk
ENV ANDROID_SDK_ROOT=/opt/android-sdk
COPY --from=download-tools /w/cmdline-tools /opt/android-sdk/cmdline-tools/latest
RUN yes | /opt/android-sdk/cmdline-tools/latest/bin/sdkmanager --install \
"platform-tools" \
"build-tools;34.0.0" \
"platforms;android-34" \
"ndk;25.1.8937393" \
"ndk;26.1.10909125" \
"ndk;26.3.11579264" \
"cmake;3.22.1"
# Stage 3: Install Volta, Node.js and EAS-CLI (build platform-specific)
FROM --platform=$BUILDPLATFORM eclipse-temurin:21-jdk AS volta
USER ubuntu
ENV VOLTA_HOME=/home/ubuntu/.volta
ENV PATH=$VOLTA_HOME/bin:$PATH
RUN curl https://get.volta.sh | bash \
&& volta install node@latest npm@latest \
&& npm i -g eas-cli@latest
# Stage 4: Prepare Environment for Prebuild (build platform-specific)
FROM --platform=$BUILDPLATFORM eclipse-temurin:21-jdk AS prebuild-env
COPY --from=volta --chown=ubuntu:ubuntu /home/ubuntu/.volta /home/ubuntu/.volta
USER ubuntu
ENV VOLTA_HOME=/home/ubuntu/.volta
ENV PATH=$VOLTA_HOME/bin:$PATH
COPY --chown=ubuntu:ubuntu ./ /home/ubuntu/work/
WORKDIR /home/ubuntu/work/
RUN --mount=type=cache,target=/home/ubuntu/.npm,uid=1000,gid=1000 npm ci
WORKDIR /home/ubuntu/work/packages/my-app
# Stage 5: Prebuild Dev Client (build platform-specific)
FROM prebuild-env AS prebuild-devclient
RUN --mount=type=cache,target=/home/ubuntu/.npm,uid=1000,gid=1000 \
--mount=type=secret,id=google-services-json,target=/home/ubuntu/work/google-services.json,uid=1000,gid=1000 \
--mount=type=tmpfs,target=/tmp \
npx expo prebuild --platform all --no-install
# Stage 6: Prebuild Preview (build platform-specific)
FROM prebuild-env AS prebuild-preview
ENV EXPO_PUBLIC_APP_ID="net.trajano.myapp"
ENV EXPO_PUBLIC_APP_NAME="My App"
RUN --mount=type=cache,target=/home/ubuntu/.npm,uid=1000,gid=1000 \
--mount=type=secret,id=google-services-json,target=/home/ubuntu/work/google-services.json,uid=1000,gid=1000 \
--mount=type=tmpfs,target=/tmp \
npx expo prebuild --platform all --no-install
# Stage 7: Prepare Environment for Gradle APK Build (build platform-specific)
FROM --platform=$BUILDPLATFORM eclipse-temurin:21-jdk AS gradle-build-env
RUN --mount=type=cache,target=/var/lib/apt/lists apt-get update \
&& apt-get install -y --no-install-recommends ninja-build
COPY --from=volta --chown=ubuntu:ubuntu /home/ubuntu/.volta /home/ubuntu/.volta
COPY --from=android-sdk /opt/android-sdk/ /opt/android-sdk/
USER ubuntu
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV VOLTA_HOME=/home/ubuntu/.volta
ENV PATH=$VOLTA_HOME/bin:$ANDROID_SDK_ROOT/platform-tools/latest/bin:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$PATH
WORKDIR /home/ubuntu/.gradle
WORKDIR /home/ubuntu/work/packages/my-app/android
ENV JAVA_OPTS="-Xmx4g -Dorg.gradle.daemon=false -Dorg.gradle.parallel=true -Dorg.gradle.caching=true"
# Stage 8: Build Dev Client APK (build platform-specific)
FROM gradle-build-env AS devclient
COPY --from=prebuild-devclient --chown=ubuntu:ubuntu /home/ubuntu/work/ /home/ubuntu/work/
RUN --mount=type=cache,id=assembleDebug,target=/home/ubuntu/.gradle,uid=1000,gid=1000 \
./gradlew assembleDebug
# Stage 9: Build Preview APK (build platform-specific)
FROM gradle-build-env AS preview-apk
COPY --from=prebuild-preview --chown=ubuntu:ubuntu /home/ubuntu/work/ /home/ubuntu/work/
RUN --mount=type=cache,id=assembleRelease,target=/home/ubuntu/.gradle,uid=1000,gid=1000 \
./gradlew assembleRelease
# EAS iOS build
FROM prebuild-env AS eas
ENV EAS_NO_VCS=1
ENV EAS_PROJECT_ROOT=/home/ubuntu/work
RUN --mount=type=cache,target=/home/ubuntu/.npm,uid=1000,gid=1000 \
--mount=type=secret,id=EXPO_TOKEN,env=EXPO_TOKEN \
--mount=type=secret,id=eas-credentials-json,target=/home/ubuntu/work/packages/my-app/credentials.json,uid=1000,gid=1000 \
--mount=type=tmpfs,target=/home/ubuntu/work/packages/my-app/credentials \
eas build --non-interactive --platform=ios --profile=development \
&& eas build --non-interactive --platform=ios --profile=preview
# Final Stage: Multiplatform APK delivery (no specific platform)
FROM busybox:stable
COPY --from=devclient /home/ubuntu/work/packages/my-app/android/app/build/outputs/apk/debug/app-debug.apk /app-debug.apk
COPY --from=preview-apk /home/ubuntu/work/packages/my-app/android/app/build/outputs/apk/release/app-release.apk /app-release.apk