FROM gradle:jdk25
# Dockerfile to build Mastodon for Android from source using Gradle and Android SDK
ENV DEBIAN_FRONTEND=noninteractive
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV PATH=$PATH:${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin:${ANDROID_SDK_ROOT}/tools/bin:${ANDROID_SDK_ROOT}/platform-tools
# Install system dependencies
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
curl \
unzip \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Install Android Command Line Tools and Android SDK components
RUN mkdir -p ${ANDROID_SDK_ROOT}/cmdline-tools \
&& curl -fsSL https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip -o /tmp/commandlinetools-linux.zip \
&& unzip -q /tmp/commandlinetools-linux.zip -d ${ANDROID_SDK_ROOT}/cmdline-tools \
&& rm /tmp/commandlinetools-linux.zip \
&& mv ${ANDROID_SDK_ROOT}/cmdline-tools/cmdline-tools ${ANDROID_SDK_ROOT}/cmdline-tools/latest
# Accept licenses and install essential components
RUN yes | ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager --licenses
RUN ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager \
"platform-tools" \
"platforms;android-33" \
"build-tools;33.0.0"
# Prepare workspace
WORKDIR /workspace
# Copy source
COPY . .
# Provide Gradle with Android SDK dir and enable signing via environment (CI will supply keystore in CI runs)
RUN echo "sdk.dir=${ANDROID_SDK_ROOT}" > local.properties
# Ensure Gradle wrapper is executable and available
RUN chmod +x ./gradlew
# Print Gradle version to verify environment
RUN ./gradlew --version
# Build release artifacts (best effort; signing may require CI-provided keystore)
RUN ./gradlew assembleRelease || true
RUN ./gradlew assembleGithubRelease || true
# Default to an interactive shell to inspect the image if needed
CMD ["bash"]
.git node_modules .gradle build .gradle.kts .gradle/ .gradle/ .mvn/ Dockerfile .dockerignore
Concerns: Base image tag 'gradle:jdk25' may not exist or be unsupported in some environments., Build steps use '|| true' after Gradle tasks, which masks failures and could leave the image without a successful build., Android SDK/tooling installation relies on external URLs and specific versions; changes or network issues could break the build without pinning checksums or validating components. Smoke [PASS]: test -x /workspace/gradlew && /workspace/gradlew --version Smoke [PASS]: test -d /opt/android-sdk && test -x /opt/android-sdk/platform-tools/adb && adb --version Smoke [PASS]: test -f /workspace/local.properties