From 00561436bf1277bacd3e51a171a5b26918f61b6b Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Mon, 21 Sep 2026 16:40:21 +0100 Subject: [PATCH] Preload Gradle 9.4.1 in Android image --- .github/workflows/build.yml | 7 +++++++ Dockerfile | 32 ++++++++++++++++++++++++++++++++ README.md | 5 +++++ 3 files changed, 44 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8ec3b0b..f0f8fbd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,6 +24,13 @@ jobs: --depth 1 \ --no-tags \ https://github.com/facebook/react-native.git + - name: Verify preloaded Gradle Wrapper distribution + run: | + docker run --rm --network none \ + -v "$(pwd)/react-native:/react-native" \ + -w /react-native \ + react-native-community/react-native \ + ./gradlew --version - name: Build React Native run: | docker run --rm --ulimit nofile=10240 -v "$(pwd)/scripts/":/scripts -v "$(pwd)/react-native/":/react-native -w /react-native react-native-community/react-native /bin/sh -c "/scripts/test-react-native-setup.sh" diff --git a/Dockerfile b/Dockerfile index ce97d70..54631d6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,6 +15,7 @@ ARG NDK_VERSION=27.1.12297006 ARG NODE_VERSION=22.14 ARG WATCHMAN_VERSION=4.9.0 ARG CMAKE_VERSION=3.30.5 +ARG GRADLE_VERSION=9.4.1 # set default environment variables, please don't remove old env for compatibilty issue ENV ADB_INSTALL_TIMEOUT=10 @@ -24,6 +25,7 @@ ENV ANDROID_NDK_HOME=${ANDROID_HOME}/ndk/$NDK_VERSION ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 ENV CMAKE_BIN_PATH=${ANDROID_HOME}/cmake/$CMAKE_VERSION/bin +ENV GRADLE_USER_HOME=/opt/gradle-home ENV PATH=${CMAKE_BIN_PATH}:${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/emulator:${ANDROID_HOME}/platform-tools:${ANDROID_HOME}/tools:${ANDROID_HOME}/tools/bin:${PATH} @@ -66,6 +68,36 @@ RUN apt update -qq && apt install -qq -y --no-install-recommends \ && gem install bundler \ && rm -rf /var/lib/apt/lists/*; +# Seed the Gradle Wrapper cache used by React Native builds. GitHub Actions +# replaces HOME inside job containers, so keep this cache at a stable path. +RUN curl --fail --location --retry 5 --retry-all-errors \ + --output /tmp/gradle-${GRADLE_VERSION}-bin.zip \ + https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip \ + && curl --fail --location --retry 5 --retry-all-errors \ + --output /tmp/gradle-${GRADLE_VERSION}-bin.zip.sha256 \ + https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip.sha256 \ + && echo "$(cat /tmp/gradle-${GRADLE_VERSION}-bin.zip.sha256) /tmp/gradle-${GRADLE_VERSION}-bin.zip" | sha256sum --check \ + && unzip -q /tmp/gradle-${GRADLE_VERSION}-bin.zip -d /tmp \ + && mkdir -p /tmp/gradle-wrapper-seed \ + && touch /tmp/gradle-wrapper-seed/settings.gradle \ + && /tmp/gradle-${GRADLE_VERSION}/bin/gradle \ + --no-daemon \ + --project-dir /tmp/gradle-wrapper-seed \ + wrapper \ + --gradle-version ${GRADLE_VERSION} \ + --distribution-type bin \ + && sed -i 's/networkTimeout=10000/networkTimeout=60000/' \ + /tmp/gradle-wrapper-seed/gradle/wrapper/gradle-wrapper.properties \ + && echo "distributionSha256Sum=$(cat /tmp/gradle-${GRADLE_VERSION}-bin.zip.sha256)" \ + >> /tmp/gradle-wrapper-seed/gradle/wrapper/gradle-wrapper.properties \ + && /tmp/gradle-wrapper-seed/gradlew --no-daemon --version \ + && rm -rf \ + /tmp/gradle-${GRADLE_VERSION} \ + /tmp/gradle-${GRADLE_VERSION}-bin.zip \ + /tmp/gradle-${GRADLE_VERSION}-bin.zip.sha256 \ + /tmp/gradle-wrapper-seed \ + && chmod -R a+rwX ${GRADLE_USER_HOME} + # install nodejs using n RUN curl -L https://raw.githubusercontent.com/tj/n/master/bin/n -o n \ && bash n $NODE_VERSION \ diff --git a/README.md b/README.md index 986061e..5120fff 100644 --- a/README.md +++ b/README.md @@ -13,4 +13,9 @@ https://github.com/react-native-community/ci-sample ## Dockerhub Image see https://hub.docker.com/r/reactnativecommunity/react-native-android/ +The image preloads the Gradle Wrapper distribution selected by the +`GRADLE_VERSION` build argument. Its wrapper cache is stored in +`GRADLE_USER_HOME=/opt/gradle-home`, so `./gradlew` can start without +downloading Gradle in ephemeral CI containers. + Original version is split from react-native repo, see https://github.com/facebook/react-native/blob/988366a4179d87d667e5d9396efdfba4cbbe0b2e/ContainerShip/Dockerfile.android-base.