# Stage 1: Build with JDK 8 and Android SDK
FROM openjdk:8-jdk-slim as builder
# Android SDK root
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV PATH=${PATH}:${ANDROID_SDK_ROOT}/tools:${ANDROID_SDK_ROOT}/tools/bin:${ANDROID_SDK_ROOT}/platform-tools
# Install dependencies
RUN apt-get update && \
apt-get install -y --no-install-recommends curl unzip ca-certificates && \
rm -rf /var/lib/apt/lists/*
# Install Android SDK command-line tools and platforms
RUN mkdir -p ${ANDROID_SDK_ROOT} && \
cd ${ANDROID_SDK_ROOT} && \
curl -o commandlinetools.zip -L "https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip" && \
unzip -q commandlinetools.zip -d cmdline-tools && \
rm commandlinetools.zip && \
mkdir -p cmdline-tools/tools && \
# Move extracted tools into the expected location
if [ -d cmdline-tools/cmdline-tools ]; then \
mv cmdline-tools/cmdline-tools/* cmdline-tools/tools/; \
else \
mv cmdline-tools/* cmdline-tools/tools/; \
fi && \
yes | ${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin/sdkmanager --sdk_root=${ANDROID_SDK_ROOT} "platform-tools" "platforms;android-30" "build-tools;30.0.3" && \
yes | ${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin/sdkmanager --licenses
WORKDIR /workspace
COPY . /workspace
# Make sure Gradle wrapper is executable
RUN chmod +x ./gradlew
# Build the project
RUN ./gradlew --no-daemon clean assemble
# Stage 2: Lightweight runtime image containing build artifacts
FROM openjdk:8-jre-slim
ENV APP_HOME=/workspace
WORKDIR ${APP_HOME}
# Copy built artifacts from builder
COPY --from=builder /workspace/app/build/outputs /workspace/app/build/outputs
COPY --from=builder /workspace/easypermissions/build/outputs /workspace/easypermissions/build/outputs
# Default command; keep container around for inspection
CMD ["bash"]
# Stage 1: Build with JDK 8 and Android SDK
FROM openjdk:8-jdk as builder
# Android SDK root
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV PATH=${PATH}:${ANDROID_SDK_ROOT}/platform-tools:${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin:${ANDROID_SDK_ROOT}/tools/bin
# Install dependencies
RUN apt-get update && \
apt-get install -y --no-install-recommends curl unzip ca-certificates && \
rm -rf /var/lib/apt/lists/*
# Install Android SDK command-line tools and platforms
RUN mkdir -p ${ANDROID_SDK_ROOT} && \
cd ${ANDROID_SDK_ROOT} && \
curl -o cmdline-tools.zip -L "https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip" && \
unzip -q cmdline-tools.zip -d ${ANDROID_SDK_ROOT}/cmdline-tools && \
rm cmdline-tools.zip && \
yes | ${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin/sdkmanager --sdk_root=${ANDROID_SDK_ROOT} "platform-tools" "platforms;android-30" "build-tools;30.0.3" && \
yes | ${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin/sdkmanager --licenses
WORKDIR /workspace
COPY . /workspace
# Make sure Gradle wrapper is executable
RUN chmod +x ./gradlew
# Build the project
RUN ./gradlew --no-daemon clean assemble
# Stage 2: Lightweight runtime image containing build artifacts
FROM openjdk:8-jre-slim
ENV APP_HOME=/workspace
WORKDIR ${APP_HOME}
# Copy built artifacts from builder
COPY --from=builder /workspace/app/build/outputs /workspace/app/build/outputs
COPY --from=builder /workspace/easypermissions/build/outputs /workspace/easypermissions/build/outputs
# Default command; keep container around for inspection
CMD ["bash"]
# Stage 1: Build with Ubuntu 20.04, JDK 8 and Android SDK
FROM ubuntu:20.04 as builder
ENV DEBIAN_FRONTEND=noninteractive
# Install necessary packages
RUN apt-get update && \
apt-get install -y --no-install-recommends \
software-properties-common \
curl \
unzip \
zip \
ca-certificates \
openjdk-8-jdk \
&& rm -rf /var/lib/apt/lists/*
# Android SDK root
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV PATH=${PATH}:${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin:${ANDROID_SDK_ROOT}/platform-tools
# Install Android cmdline-tools and platforms
RUN mkdir -p ${ANDROID_SDK_ROOT}/cmdline-tools && \
mkdir -p ${ANDROID_SDK_ROOT}/platform-tools && \
cd ${ANDROID_SDK_ROOT} && \
curl -o commandlinetools-linux.zip -L "https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip" && \
unzip -q commandlinetools-linux.zip -d ${ANDROID_SDK_ROOT}/cmdline-tools && \
rm commandlinetools-linux.zip && \
# Some layouts place tools binary under cmdline-tools/tools/bin
if [ -f ${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin/sdkmanager ]; then \
true; \
else \
# sometimes the extracted layout is cmdline-tools/bin/sdkmanager
if [ -f ${ANDROID_SDK_ROOT}/cmdline-tools/bin/sdkmanager ]; then \
ln -s ${ANDROID_SDK_ROOT}/cmdline-tools/bin/sdkmanager ${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin/sdkmanager; \
fi; \
fi && \
yes | ${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin/sdkmanager --sdk_root=${ANDROID_SDK_ROOT} "platform-tools" "platforms;android-30" "build-tools;30.0.3" && \
yes | ${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin/sdkmanager --licenses
WORKDIR /workspace
COPY . /workspace
# Build the project
RUN chmod +x ./gradlew
RUN ./gradlew --no-daemon clean assemble
# Stage 2: Lightweight runtime image containing build artifacts
FROM openjdk:8-jre-slim
ENV APP_HOME=/workspace
WORKDIR ${APP_HOME}
# Copy built artifacts from builder
COPY --from=builder /workspace/app/build/outputs /workspace/app/build/outputs
COPY --from=builder /workspace/easypermissions/build/outputs /workspace/easypermissions/build/outputs
# Default command; keep container around for inspection
CMD ["bash"]
# Stage 1: Build with Ubuntu 20.04, JDK 8 and Android SDK
FROM ubuntu:20.04 as builder
ENV DEBIAN_FRONTEND=noninteractive
# Install necessary packages
RUN apt-get update && \
apt-get install -y --no-install-recommends \
curl \
unzip \
zip \
ca-certificates \
openjdk-8-jdk \
&& rm -rf /var/lib/apt/lists/*
# Android SDK root
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV PATH=${PATH}:${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin:${ANDROID_SDK_ROOT}/platform-tools
# Install Android cmdline-tools and platforms
RUN mkdir -p ${ANDROID_SDK_ROOT} && \
cd ${ANDROID_SDK_ROOT} && \
curl -o commandlinetools-linux.zip -L "https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip" && \
unzip -q commandlinetools-linux.zip -d ${ANDROID_SDK_ROOT}/cmdline-tools && \
rm commandlinetools-linux.zip && \
yes | ${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin/sdkmanager --sdk_root=${ANDROID_SDK_ROOT} "platform-tools" "platforms;android-30" "build-tools;30.0.3" && \
yes | ${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin/sdkmanager --licenses
WORKDIR /workspace
COPY . /workspace
# Build the project
RUN chmod +x ./gradlew
RUN ./gradlew --no-daemon clean assemble
# Stage 2: Lightweight runtime image containing build artifacts
FROM ubuntu:20.04
ENV APP_HOME=/workspace
WORKDIR ${APP_HOME}
# Copy built artifacts from builder
COPY --from=builder /workspace/app/build/outputs /workspace/app/build/outputs
COPY --from=builder /workspace/easypermissions/build/outputs /workspace/easypermissions/build/outputs
# Default command; keep container around for inspection
CMD ["bash"]
Dockerfile .dockerignore .git node_modules build .gradle .gradle* .idea /.gradle */build */out *.iml .DS_Store
Error summary
- Exact error message and exit code
- /bin/sh: 1: /opt/android-sdk/cmdline-tools/tools/bin/sdkmanager: not found
- Exit code: 127
- Failing command/step
- The RUN step in builder 3/7:
mkdir -p /opt/android-sdk && cd /opt/android-sdk && curl -o commandlinetools-linux.zip -L "https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip" && unzip -q commandlinetools-linux.zip -d /opt/android-sdk/cmdline-tools && rm commandlinetools-linux.zip && yes | /opt/android-sdk/cmdline-tools/tools/bin/sdkmanager --sdk_root=/opt/android-sdk "platform-tools" "platforms;android-30" "build-tools;30.0.3" && yes | /opt/android-sdk/cmdline-tools/tools/bin/sdkmanager --licenses
- Missing packages/files mentioned
- The sdkmanager binary was not found at the expected path: /opt/android-sdk/cmdline-tools/tools/bin/sdkmanager
- This followed a curl download and unzip of commandlinetools-linux-9477386_latest.zip into /opt/android-sdk/cmdline-tools
- Version mismatch information
- No explicit version mismatch noted.
- The step uses commandlinetools-linux-9477386_latest.zip and targets Android platform-tools, android-30, and build-tools 30.0.3, but the missing binary prevents further validation.
- Possible cause: the downloaded archive layout does not place sdkmanager at the expected path.# Stage 1: Build with Ubuntu 20.04, JDK 8 and Android SDK
FROM ubuntu:20.04 as builder
ENV DEBIAN_FRONTEND=noninteractive
# Install necessary packages
RUN apt-get update && \
apt-get install -y --no-install-recommends \
curl \
unzip \
zip \
ca-certificates \
openjdk-8-jdk \
&& rm -rf /var/lib/apt/lists/*
# Android SDK root
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV PATH=${PATH}:${ANDROID_SDK_ROOT}/platform-tools:${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin:${ANDROID_SDK_ROOT}/cmdline-tools/bin:${ANDROID_SDK_ROOT}/tools/bin
# Install Android cmdline-tools and platforms with robust sdkmanager path
RUN mkdir -p ${ANDROID_SDK_ROOT} && \
cd ${ANDROID_SDK_ROOT} && \
curl -o cmdline-tools.zip -L "https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip" && \
unzip -q cmdline-tools.zip -d cmdline-tools && \
rm cmdline-tools.zip && \
set -e; \
if [ -x "${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin/sdkmanager" ]; then \
SDKMANAGER="${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin/sdkmanager"; \
elif [ -x "${ANDROID_SDK_ROOT}/cmdline-tools/bin/sdkmanager" ]; then \
SDKMANAGER="${ANDROID_SDK_ROOT}/cmdline-tools/bin/sdkmanager"; \
mkdir -p ${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin; \
ln -s "${ANDROID_SDK_ROOT}/cmdline-tools/bin/sdkmanager" "${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin/sdkmanager"; \
elif [ -x "${ANDROID_SDK_ROOT}/tools/bin/sdkmanager" ]; then \
SDKMANAGER="${ANDROID_SDK_ROOT}/tools/bin/sdkmanager"; \
else \
echo "sdkmanager not found"; exit 1; \
fi; \
echo "Using SDKMANAGER=$SDKMANAGER"; \
yes | "$SDKMANAGER" --sdk_root="${ANDROID_SDK_ROOT}" "platform-tools" "platforms;android-30" "build-tools;30.0.3" && \
yes | "$SDKMANAGER" --licenses
WORKDIR /workspace
COPY . /workspace
# Build the project
RUN chmod +x ./gradlew
RUN ./gradlew --no-daemon clean assemble
# Stage 2: Lightweight runtime image containing build artifacts
FROM ubuntu:20.04
ENV APP_HOME=/workspace
WORKDIR ${APP_HOME}
# Copy built artifacts from builder
COPY --from=builder /workspace/app/build/outputs /workspace/app/build/outputs
COPY --from=builder /workspace/easypermissions/build/outputs /workspace/easypermissions/build/outputs
# Default command; keep container around for inspection
CMD ["bash"]
- Exact error message and exit code
- Error: sdkmanager not found
- Exit code: 1
- Failing command/step
- Dockerfile step: builder 3/7
- Command snippet:
RUN mkdir -p /opt/android-sdk && cd /opt/android-sdk && curl -o cmdline-tools.zip -L "https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip" && unzip -q cmdline-tools.zip -d cmdline-tools && rm cmdline-tools.zip && set -e; if [ -x "/opt/android-sdk/cmdline-tools/tools/bin/sdkmanager" ]; then SDKMANAGER="/opt/android-sdk/cmdline-tools/tools/bin/sdkmanager"; elif [ -x "/opt/android-sdk/cmdline-tools/bin/sdkmanager" ]; then SDKMANAGER="/opt/android-sdk/cmdline-tools/bin/sdkmanager"; mkdir -p /opt/android-sdk/cmdline-tools/tools/bin; ln -s "/opt/android-sdk/cmdline-tools/bin/sdkmanager" "/opt/android-sdk/cmdline-tools/tools/bin/sdkmanager"; elif [ -x "/opt/android-sdk/tools/bin/sdkmanager" ]; then SDKMANAGER="/opt/android-sdk/tools/bin/sdkmanager"; else echo "sdkmanager not found"; exit 1; fi; echo "Using SDKMANAGER=$SDKMANAGER"; yes | "$SDKMANAGER" --sdk_root="/opt/android-sdk" "platform-tools" "platforms;android-30" "build-tools;30.0.3" && yes | "$SDKMANAGER" --licenses
- Missing packages or files mentioned
- sdkmanager tool not found in any expected location after extraction:
- /opt/android-sdk/cmdline-tools/tools/bin/sdkmanager
- /opt/android-sdk/cmdline-tools/bin/sdkmanager
- /opt/android-sdk/tools/bin/sdkmanager
- Version mismatch info
- No explicit version mismatch reported.
- The script downloads commandlinetools-linux-9477386_latest.zip (version reference in URL).# Stage 1: Build with Ubuntu 20.04, JDK 8 and Android SDK
FROM ubuntu:20.04 as builder
ENV DEBIAN_FRONTEND=noninteractive
# Install necessary packages
RUN apt-get update && \
apt-get install -y --no-install-recommends \
curl \
unzip \
zip \
ca-certificates \
openjdk-8-jdk \
&& rm -rf /var/lib/apt/lists/*
# Android SDK root
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV PATH=${PATH}:${ANDROID_SDK_ROOT}/platform-tools:${ANDROID_SDK_ROOT}/cmdline-tools/bin:${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin
# Install Android cmdline-tools and platforms robustly
RUN mkdir -p ${ANDROID_SDK_ROOT} && \
cd ${ANDROID_SDK_ROOT} && \
curl -o cmdline-tools.zip -L "https://dl.google.com/android/repository/commandlinetools-linux_latest.zip" && \
unzip -q cmdline-tools.zip -d . && \
rm cmdline-tools.zip && \
# Locate sdkmanager regardless of layout
sdkman=$(find . -name sdkmanager -type f | head -n 1) && \
if [ -z "$sdkman" ]; then echo "sdkmanager not found"; exit 1; fi && \
chmod +x "$sdkman" && \
"$sdkman" --sdk_root="${ANDROID_SDK_ROOT}" "platform-tools" "platforms;android-30" "build-tools;30.0.3" && \
printf 'yes
' | "$sdkman" --licenses
WORKDIR /workspace
COPY . /workspace
# Build the project
RUN chmod +x ./gradlew
RUN ./gradlew --no-daemon clean assemble
# Stage 2: Lightweight runtime image containing build artifacts
FROM ubuntu:20.04
ENV APP_HOME=/workspace
WORKDIR ${APP_HOME}
# Copy built artifacts from builder
COPY --from=builder /workspace/app/build/outputs /workspace/app/build/outputs
COPY --from=builder /workspace/easypermissions/build/outputs /workspace/easypermissions/build/outputs
# Default command; keep container around for inspection
CMD ["bash"]
#0 building with "default" instance using docker driver
#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 1.79kB done
#1 WARN: FromAsCasing: 'as' and 'FROM' keywords' casing do not match (line 2)
#1 DONE 0.0s
[33m1 warning found (use docker --debug to expand):
[0m - FromAsCasing: 'as' and 'FROM' keywords' casing do not match (line 2)
Dockerfile:32
--------------------
30 | "$sdkman" --sdk_root="${ANDROID_SDK_ROOT}" "platform-tools" "platforms;android-30" "build-tools;30.0.3" && \
31 | printf 'yes
32 | >>> ' | "$sdkman" --licenses
33 |
34 | WORKDIR /workspace
--------------------
ERROR: failed to build: failed to solve: dockerfile parse error on line 32: unknown instruction: '# Stage 1: Build with Ubuntu 20.04, JDK 8 and Android SDK
FROM ubuntu:20.04 as builder
ENV DEBIAN_FRONTEND=noninteractive
# Install necessary packages
RUN apt-get update && \
apt-get install -y --no-install-recommends \
curl \
unzip \
zip \
ca-certificates \
openjdk-8-jdk \
&& rm -rf /var/lib/apt/lists/*
# Android SDK root
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV PATH=$PATH:$ANDROID_SDK_ROOT/platform-tools:$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$ANDROID_SDK_ROOT/cmdline-tools/bin:$ANDROID_SDK_ROOT/tools/bin
# Install Android cmdline-tools and platforms robustly
RUN mkdir -p ${ANDROID_SDK_ROOT} && \
cd ${ANDROID_SDK_ROOT} && \
curl -o cmdline-tools.zip -L "https://dl.google.com/android/repository/commandlinetools-linux_latest.zip" && \
unzip -q cmdline-tools.zip -d cmdline-tools && \
rm cmdline-tools.zip && \
SDKMANAGER_PATH=$(find cmdline-tools -name sdkmanager | head -n 1) && \
if [ -z "$SDKMANAGER_PATH" ]; then echo "sdkmanager not found"; exit 1; fi && \
chmod +x "$SDKMANAGER_PATH" && \
"$SDKMANAGER_PATH" --sdk_root="${ANDROID_SDK_ROOT}" "platform-tools" "platforms;android-30" "build-tools;30.0.3" && \
yes | "$SDKMANAGER_PATH" --licenses
WORKDIR /workspace
COPY . /workspace
# Build the project
RUN chmod +x ./gradlew
RUN ./gradlew --no-daemon clean assemble
# Stage 2: Lightweight runtime image containing build artifacts
FROM openjdk:8-jre-slim
ENV APP_HOME=/workspace
WORKDIR ${APP_HOME}
# Copy built artifacts from builder
COPY --from=builder /workspace/app/build/outputs /workspace/app/build/outputs
COPY --from=builder /workspace/easypermissions/build/outputs /workspace/easypermissions/build/outputs
# Default command; keep container around for inspection
CMD ["bash"]
# Stage 1: Build with Ubuntu 20.04, JDK 8 and Android SDK
FROM ubuntu:20.04 as builder
ENV DEBIAN_FRONTEND=noninteractive
# Install necessary packages
RUN apt-get update && \
apt-get install -y --no-install-recommends \
curl \
unzip \
zip \
ca-certificates \
openjdk-8-jdk \
&& rm -rf /var/lib/apt/lists/*
# Android SDK root
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV PATH=${PATH}:${ANDROID_SDK_ROOT}/platform-tools:${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin:${ANDROID_SDK_ROOT}/cmdline-tools/bin:${ANDROID_SDK_ROOT}/tools/bin
# Install Android cmdline-tools and platforms with robust sdkmanager path
RUN mkdir -p ${ANDROID_SDK_ROOT} && \
cd ${ANDROID_SDK_ROOT} && \
curl -o cmdline-tools.zip -L "https://dl.google.com/android/repository/commandlinetools-linux_latest.zip" && \
unzip -q cmdline-tools.zip -d cmdline-tools && \
rm cmdline-tools.zip && \
# Locate sdkmanager in a robust way
SDKMANAGER_PATH=""; \
if [ -f ${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin/sdkmanager ]; then \
SDKMANAGER_PATH="${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin/sdkmanager"; \
elif [ -f ${ANDROID_SDK_ROOT}/cmdline-tools/bin/sdkmanager ]; then \
SDKMANAGER_PATH="${ANDROID_SDK_ROOT}/cmdline-tools/bin/sdkmanager"; \
elif [ -f ${ANDROID_SDK_ROOT}/tools/bin/sdkmanager ]; then \
SDKMANAGER_PATH="${ANDROID_SDK_ROOT}/tools/bin/sdkmanager"; \
else \
echo "sdkmanager not found"; exit 1; \
fi; \
echo "Using SDKMANAGER_PATH=$SDKMANAGER_PATH"; \
chmod +x "$SDKMANAGER_PATH"; \
"$SDKMANAGER_PATH" --sdk_root="${ANDROID_SDK_ROOT}" "platform-tools" "platforms;android-30" "build-tools;30.0.3" && \
yes | "$SDKMANAGER_PATH" --licenses
WORKDIR /workspace
COPY . /workspace
# Build the project
RUN chmod +x ./gradlew
RUN ./gradlew --no-daemon clean assemble
# Stage 2: Lightweight runtime image containing build artifacts
FROM ubuntu:20.04
ENV APP_HOME=/workspace
WORKDIR ${APP_HOME}
# Copy built artifacts from builder
COPY --from=builder /workspace/app/build/outputs /workspace/app/build/outputs
COPY --from=builder /workspace/easypermissions/build/outputs /workspace/easypermissions/build/outputs
# Default command; keep container around for inspection
CMD ["bash"]
- VerifyBuild status: build_failed
- Concerns
- The final runtime image contains no Java runtime, so built artifacts (e.g., jars) cannot be executed directly.
- COPY --from=builder /workspace/app/build/outputs and /workspace/easypermissions/build/outputs assumes Gradle Android outputs exist at those paths; if the project uses a different output structure (e.g., build/libs), the COPY steps will fail.
- Failing step
- Failing step: builder 3/7 RUN mkdir -p /opt/android-sdk && cd /opt/android-sdk && curl -o cmdline-tools.zip -L "https://dl.google.com/android/repository/commandlinetools-linux_latest.zip" && unzip -q cmdline-tools.zip -d cmdline-tools && rm cmdline-tools.zip && SDKMANAGER_PATH=""; if [ -f /opt/android-sdk/cmdline-tools/tools/bin/sdkmanager ]; then SDKMANAGER_PATH="/opt/android-sdk/cmdline-tools/tools/bin/sdkmanager"; elif [ -f /opt/android-sdk/cmdline-tools/bin/sdkmanager ]; then SDKMANAGER_PATH="/opt/android-sdk/cmdline-tools/bin/sdkmanager"; elif [ -f /opt/android-sdk/tools/bin/sdkmanager ]; then SDKMANAGER_PATH="/opt/android-sdk/tools/bin/sdkmanager"; else echo "sdkmanager not found"; exit 1; fi; echo "Using SDKMANAGER_PATH=$SDKMANAGER_PATH"; chmod +x "$SDKMANAGER_PATH"; "$SDKMANAGER_PATH" --sdk_root="/opt/android-sdk" "platform-tools" "platforms;android-30" "build-tools;30.0.3" && yes | "$SDKMANAGER_PATH" --licenses
- Exact error messages and exit code
- End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive.
- unzip: cannot find zipfile directory in one of cmdline-tools.zip or
cmdline-tools.zip.zip, and cannot find cmdline-tools.zip.ZIP, period.
- sdkmanager not found
- ERROR: process "/bin/sh -c ... " did not complete successfully: exit code: 1
- Missing packages or files mentioned
- The downloaded file cmdline-tools.zip is not a valid zip (End-of-central-directory signature error), so the expected Android cmdline-tools cannot be extracted.
- As a result, sdkmanager is not found, preventing installation of: platform-tools, platforms;android-30, build-tools;30.0.3.
- Version mismatch info
- No explicit version mismatch reported. The step aims to install Android SDK components: platform-tools, platforms;android-30, and build-tools;30.0.3, but the failure is due to a corrupted cmdline-tools zip rather than a version conflict.
- Actionable next steps (brief)
- Verify the URL download of cmdline-tools.zip and the integrity of the zip.
- Ensure cmdline-tools.zip is a valid zip (not corrupted) before unzip.
- If needed, pre-download a valid cmdline-tools package and retry sdkmanager installation.# Multi-stage build using CircleCI's Android images which come with JDK and Android SDK FROM circleci/android:api-30 as builder WORKDIR /workspace # Copy source and build COPY . /workspace # Ensure Gradle wrapper is executable and build RUN chmod +x ./gradlew RUN ./gradlew --no-daemon clean assemble # Final runtime image (same base as builder for simplicity) FROM circleci/android:api-30 WORKDIR /workspace # Copy built artifacts from builder stage COPY --from=builder /workspace/app/build/outputs /workspace/app/build/outputs COPY --from=builder /workspace/easypermissions/build/outputs /workspace/easypermissions/build/outputs # Default command; keep container around for inspection CMD ["bash"]
Summary (under 1500 chars): - Exact error message and exit code - Exited with code: 1 - Error: changing permissions of './gradlew': Operation not permitted - Failing command/step - [builder 4/5] RUN chmod +x ./gradlew - Dockerfile context shows this precedes the step RUN ./gradlew --no-daemon clean assemble - Missing packages or files mentioned - None specified in the error output (no missing file/package messages) - Version mismatch / other info - Base image used: docker.io/circleci/android:api-30 - Warning observed: FromAsCasing: 'as' and 'FROM' keywords' casing do not match (line 2) - No explicit version mismatch reported beyond that warning
# Multi-stage build using CircleCI's Android images FROM circleci/android:api-30 as builder WORKDIR /workspace # Copy source and build COPY . /workspace # Build the project using Bash to avoid chmod issues with permissions RUN bash -lc "./gradlew --no-daemon clean assemble" # Final runtime image (same base as builder for simplicity) FROM circleci/android:api-30 WORKDIR /workspace # Copy built artifacts from builder (if present under common Gradle output paths) # Note: outputs can vary; keep all build outputs within the project tree for inspection COPY --from=builder /workspace /workspace # Default command; keep container around for inspection CMD ["bash"]
- Exact error message and exit code
- Execution failed for task ':app:generateDebugBuildConfig'. > Failed to create parent directory '/workspace/app/build' when creating directory '/workspace/app/build/generated/source/buildConfig/debug'
- did not complete successfully: exit code: 1
- Failing command/step
- Failing step: RUN bash -lc "./gradlew --no-daemon clean assemble"
- Missing packages or files mentioned
- Missing/blocked path issue: Failed to create parent directory '/workspace/app/build' when creating directory '/workspace/app/build/generated/source/buildConfig/debug'
- Version mismatch info
- Gradle 6.8.3 is being used (downloaded and started):
- Downloading https://services.gradle.org/distributions/gradle-6.8.3-bin.zip
- Welcome to Gradle 6.8.3!
- No explicit version mismatch reported in the logapply plugin: 'com.android.application'
android {
compileSdkVersion 30
testOptions.unitTests.includeAndroidResources = true
defaultConfig {
applicationId "pub.devrel.easypermissions.sample"
minSdkVersion 14
targetSdkVersion 30
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled false
// Sets Java compatibility to Java 8
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation "androidx.annotation:annotation:1.1.0"
implementation project(':easypermissions')
}
# Project-wide Gradle settings. # IDE (e.g. Android Studio) users: # Gradle settings configured through the IDE *will override* # any settings specified in this file. # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. org.gradle.jvmargs=-Xmx1536m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true # Configure on demand org.gradle.configureondemand=true # Required by Robolectric 4.x #android.enableUnitTestBinaryResources=true # Move transitive dependencies to AndroidX android.useAndroidX=true android.enableJetifier=true
apply plugin: 'com.android.library'
// See: https://github.com/vanniktech/gradle-maven-publish-plugin/issues/206
ext {
RELEASE_REPOSITORY_URL = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
SNAPSHOT_REPOSITORY_URL = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
}
apply plugin: 'com.vanniktech.maven.publish'
android {
compileSdkVersion 30
testOptions.unitTests.includeAndroidResources = true
defaultConfig {
minSdkVersion 14
targetSdkVersion 30
versionCode 1
versionName "3.0.0"
}
buildTypes {
debug {
testCoverageEnabled true
}
release {
minifyEnabled false
consumerProguardFiles 'proguard-rules.pro'
}
}
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
dependencies {
api "androidx.appcompat:appcompat:1.1.0"
api "androidx.annotation:annotation:1.1.0"
api "androidx.core:core:1.3.0"
api "androidx.fragment:fragment:1.2.5"
testImplementation 'junit:junit:4.13'
testImplementation 'com.google.truth:truth:0.42'
testImplementation 'org.robolectric:robolectric:4.1'
testImplementation 'androidx.test:core:1.3.0-rc01'
testImplementation 'androidx.fragment:fragment-testing:1.2.5'
testImplementation 'org.mockito:mockito-core:2.23.4'
}
include ':app', ':easypermissions'
- Exact error message and exit code
- BUILD FAILED in 49s
- Execution failed for task ':app:generateDebugBuildConfig'.
> Failed to create parent directory '/workspace/app/build' when creating directory '/workspace/app/build/generated/source/buildConfig/debug'
- Exit code: 1
- Failing command/step
- [builder 4/4] RUN bash -lc "./gradlew --no-daemon clean assemble"
- Missing packages or files mentioned
- No specific packages or files are listed as missing. The failure is due to being unable to create the directory /workspace/app/build (and its subpath /workspace/app/build/generated/source/buildConfig/debug).
- Version mismatch / versioning info
- Gradle is downloaded and used: Gradle 6.8.3
- Downloading https://services.gradle.org/distributions/gradle-6.8.3-bin.zip
- Welcome to Gradle 6.8.3!
- Base image used: docker.io/circleci/android:api-30
- Additional note
- Dockerfile warning observed: FromAsCasing: 'as' and 'FROM' keywords' casing do not match (line 2)# Multi-stage build using CircleCI's Android images FROM circleci/android:api-30 as builder WORKDIR /workspace # Copy source and build COPY . /workspace # Ensure build directories exist to avoid permission issues RUN mkdir -p /workspace/app/build/generated/source/buildConfig/debug # Build the project using Bash to avoid chmod issues with permissions RUN bash -lc "./gradlew --no-daemon clean assemble" # Final runtime image (same base as builder for simplicity) FROM circleci/android:api-30 WORKDIR /workspace # Copy built artifacts from builder (if present under common Gradle output paths) # Note: outputs can vary; keep all build outputs within the project tree for inspection COPY --from=builder /workspace /workspace # Default command; keep container around for inspection CMD ["bash"]
Summary of tool output (concise, actionable info preserved) - VerifyBuild status: build_failed - Concerns - Final image copies /workspace, which could bloat the image and leak sources. - Smoke tests expect an artifact in app/build/outputs (aar/apk/jar); tests may fail if structure differs. - Build error (key details) - Base image: docker.io/circleci/android:api-30@sha256:a1143ca351628b7e5f329c5c60b4d6f32140447b6d3cd9ae00acdc718b757691 - Dockerfile warning: FromAsCasing: 'as' and 'FROM' keywords' casing do not match (line 2) - Dockerfile, line 10: RUN mkdir -p /workspace/app/build/generated/source/buildConfig/debug - Error: mkdir: cannot create directory ‘/workspace/app/build’: Permission denied - Build failure message: failed to solve: process "/bin/sh -c mkdir -p /workspace/app/build/generated/source/buildConfig/debug" did not complete successfully: exit code: 1 - Dockerfile reference: Dockerfile:10 - Context steps mention /workspace and COPY . /workspace; builder steps executed (e.g., 1/5, 4/5), but the failing command is the RUN mkdir -p ... - Relevant lines/files - Command causing failure: RUN mkdir -p /workspace/app/build/generated/source/buildConfig/debug - Path involved: /workspace/app/build (permission denied) - Artifact notes - Expected artifacts location for tests: app/build/outputs (aar/apk/jar) - Current failure prevents generation of build output, impacting tests and final image content
# Multi-stage build using CircleCI's Android images FROM circleci/android:api-30 as builder USER root WORKDIR /workspace # Copy source and build COPY . /workspace # Ensure build directories exist to avoid permission issues RUN mkdir -p app/build/generated/source/buildConfig/debug # Build the project using Gradle wrapper RUN chmod +x ./gradlew RUN ./gradlew --no-daemon clean assemble # Final runtime image (same base as builder for simplicity) FROM circleci/android:api-30 USER root WORKDIR /workspace # Copy built artifacts and sources from builder COPY --from=builder /workspace /workspace # Default command; keep container around for inspection CMD ["bash"]
# Multi-stage Dockerfile to build an Android project from source and package artifacts
# Stage 1: Builder with Android SDK and JDK
FROM circleci/android:api-30 AS builder
ENV DEBIAN_FRONTEND=noninteractive
WORKDIR /workspace
# Install additional tooling if not present
RUN apt-get update && \
apt-get install -y --no-install-recommends \
ca-certificates \
curl \
unzip \
git \
&& rm -rf /var/lib/apt/lists/*
# Copy the repository
COPY . .
# Ensure Gradle wrapper is executable
RUN chmod +x gradlew
# Build the project (assemble a release APK and libraries). Skip tests for speed.
RUN ./gradlew clean assembleRelease -x test
# Collect build artifacts for the final image
RUN mkdir -p /artifacts/app
RUN mkdir -p /artifacts/easypermissions
# APK produced by the app module (path depends on AGP version)
RUN bash -lc 'test -f app/build/outputs/apk/release/app-release.apk && cp app/build/outputs/apk/release/app-release.apk /artifacts/app/ || true'
# AAR produced by the library module
RUN bash -lc 'test -d easypermissions/build/outputs/aar && cp -R easypermissions/build/outputs/aar /artifacts/easypermissions/ || true'
# Optional: show what artifacts exist (for debugging)
RUN ls -la /artifacts || true
# Stage 2: Runtime image with Java runtime and the built artifacts
FROM eclipse-temurin:8-jre-slim AS runtime
WORKDIR /app
# Copy artifacts from the builder stage
COPY --from=builder /artifacts /artifacts
# Expose nothing specific; this image simply holds the build outputs
# Keep the container alive so users can inspect artifacts if needed
CMD ["/bin/bash", "-lc", "echo Build artifacts available in /artifacts; ls -la /artifacts; tail -f /dev/null"]
# Multi-stage Dockerfile to build an Android project from source and package artifacts
# Stage 1: Builder with Android SDK and JDK
FROM circleci/android:api-30 AS builder
ENV DEBIAN_FRONTEND=noninteractive
WORKDIR /workspace
# Install additional tooling if not present
RUN apt-get update && \
apt-get install -y --no-install-recommends \
ca-certificates \
curl \
unzip \
git \
&& rm -rf /var/lib/apt/lists/*
# Copy the repository
COPY . .
# Ensure Gradle wrapper is executable
RUN chmod +x gradlew
# Build the project (assemble a release APK and libraries). Skip tests for speed.
RUN ./gradlew clean assembleRelease -x test
# Collect build artifacts for the final image
RUN mkdir -p /artifacts/app
RUN mkdir -p /artifacts/easypermissions
# APK produced by the app module (path depends on AGP version)
RUN bash -lc 'test -f app/build/outputs/apk/release/app-release.apk && cp app/build/outputs/apk/release/app-release.apk /artifacts/app/ || true'
# AAR produced by the library module
RUN bash -lc 'test -d easypermissions/build/outputs/aar && cp -R easypermissions/build/outputs/aar /artifacts/easypermissions/ || true'
# Optional: show what artifacts exist (for debugging)
RUN ls -la /artifacts || true
# Stage 2: Runtime image with Java runtime and the built artifacts
FROM eclipse-temurin:8-jre AS runtime
WORKDIR /app
# Copy artifacts from the builder stage
COPY --from=builder /artifacts /artifacts
# Expose nothing specific; this image simply holds the build outputs
# Keep the container alive so users can inspect artifacts if needed
CMD ["bash", "-lc", "echo Build artifacts available in /artifacts; ls -la /artifacts; tail -f /dev/null"]
- Exact error message and exit code - E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission denied) - The failing command did not complete successfully: exit code: 100 - Failing command/step - [builder 3/11] RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates curl unzip git && rm -rf /var/lib/apt/lists/* - Context: Dockerfile step attempting to update apt and install packages - Missing packages or files mentioned - Packages intended for installation: ca-certificates, curl, unzip, git - Missing/misaccessible file: /var/lib/apt/lists/partial (permission denied) - Version mismatch info - Not present in the log. Base images involved (for context) include eclipse-temurin:8-jre and circleci/android:api-30, but no version mismatch is reported.
# Multi-stage Dockerfile to build an Android project from source and package artifacts
# Stage 1: Builder with Android SDK and JDK (provided by CircleCI's Android image)
FROM circleci/android:api-30 AS builder
ENV DEBIAN_FRONTEND=noninteractive
WORKDIR /workspace
# Copy the repository
COPY . .
# Ensure Gradle wrapper is executable
RUN chmod +x gradlew
# Build the project (assemble a release APK and libraries). Skip tests for speed.
RUN ./gradlew clean assembleRelease -x test
# Collect build artifacts for the final image
RUN mkdir -p /artifacts/app
RUN mkdir -p /artifacts/easypermissions
# APK produced by the app module (path depends on AGP version)
RUN bash -lc 'shopt -s nullglob; apk_paths=(app/build/outputs/apk/release/*.apk); if [ -f "${apk_paths[0]}" ]; then cp "${apk_paths[0]}" /artifacts/app/; fi'
# AAR produced by the library module
RUN bash -lc 'shopt -s nullglob; aar_dirs=(easypermissions/build/outputs/aar/*.aar); if [ -d easypermissions/build/outputs/aar ]; then cp -R easypermissions/build/outputs/aar /artifacts/easypermissions/; fi'
# Optional: show what artifacts exist (for debugging)
RUN ls -la /artifacts || true
# Stage 2: Runtime image with Java runtime and the built artifacts
FROM eclipse-temurin:8-jre AS runtime
WORKDIR /app
# Copy artifacts from the builder stage
COPY --from=builder /artifacts /artifacts
# Expose nothing specific; this image simply holds the build outputs
# Keep the container alive so users can inspect artifacts if needed
CMD ["bash", "-lc", "echo Build artifacts available in /artifacts; ls -la /artifacts; tail -f /dev/null"]
- Exact error message and exit code - chmod: changing permissions of 'gradlew': Operation not permitted - Exit code: 1 - Failing command/step - [builder 4/10] RUN chmod +x gradlew (Dockerfile:12) - Missing packages or files mentioned - None reported. The issue is a permission error on the gradlew file, not a missing file. - Version mismatch info - No version mismatch reported. Build uses builder image circleci/android:api-30 and runtime image eclipse-temurin:8-jre.
# Multi-stage Dockerfile to build an Android project from source and package artifacts
# Stage 1: Builder with Android SDK and JDK (provided by CircleCI's Android image)
FROM circleci/android:api-30 AS builder
ENV DEBIAN_FRONTEND=noninteractive
WORKDIR /workspace
# Copy the repository
COPY . .
# Build the project (assemble a release APK and libraries). Skip tests for speed.
RUN sh gradlew clean assembleRelease -x test
# Collect build artifacts for the final image
RUN mkdir -p /artifacts/app
RUN mkdir -p /artifacts/easypermissions
# APK produced by the app module (path depends on AGP version)
RUN bash -lc 'shopt -s nullglob; apk_paths=(app/build/outputs/apk/release/*.apk); if [ -f "${apk_paths[0]}" ]; then cp "${apk_paths[0]}" /artifacts/app/; fi'
# AAR produced by the library module
RUN bash -lc 'shopt -s nullglob; aar_dirs=(easypermissions/build/outputs/aar/*.aar); if [ -d easypermissions/build/outputs/aar ]; then cp -R easypermissions/build/outputs/aar /artifacts/easypermissions/; fi'
# Optional: show what artifacts exist (for debugging)
RUN ls -la /artifacts || true
# Stage 2: Runtime image with Java runtime and the built artifacts
FROM eclipse-temurin:8-jre AS runtime
WORKDIR /app
# Copy artifacts from the builder stage
COPY --from=builder /artifacts /artifacts
# Expose nothing specific; this image simply holds the build outputs
# Keep the container alive so users can inspect artifacts if needed
CMD ["bash", "-lc", "echo Build artifacts available in /artifacts; ls -la /artifacts; tail -f /dev/null"]
Summary: - Failing command/step: - [builder 4/9] RUN sh gradlew clean assembleRelease -x test - Exit code: 1 - Exact error message (preserve): Execution failed for task ':app:extractProguardFiles'. > Failed to create parent directory '/workspace/app/build' when creating directory '/workspace/app/build/intermediates/proguard-files' - Context / paths involved: - Target directories: /workspace/app/build and /workspace/app/build/intermediates/proguard-files - Missing packages or files mentioned: - None explicitly mentioned - Version/mismatch information: - Gradle version: 6.8.3 (Gradle 6.8.3, via Gradle wrapper) - Build uses: builder image circleci/android:api-30 and runtime image eclipse-temurin:8-jre - Additional notes: - The error suggests a filesystem issue: inability to create the required directory, which could be due to a missing directory or write permissions in /workspace/app. No specific missing packages/files were reported.
# Multi-stage Dockerfile to build an Android project from source and package artifacts
# Stage 1: Builder with Android SDK and JDK (provided by CircleCI's Android image)
FROM circleci/android:api-30 AS builder
ENV DEBIAN_FRONTEND=noninteractive
WORKDIR /workspace
# Ensure we are root for build steps
USER root
# Copy the repository (best done after creating workspace, but copy all and let Gradle decide)
COPY . .
# Prepare executable Gradle wrapper and build
RUN chmod +x gradlew
# Create build directory in advance to avoid permission issues in some environments
RUN mkdir -p /workspace/app/build
# Build the project (assemble a release APK and libraries). Skip tests for speed.
RUN ./gradlew clean assembleRelease -x test
# Collect build artifacts for the final image
RUN mkdir -p /artifacts/app
RUN mkdir -p /artifacts/easypermissions
# APK produced by the app module (path depends on AGP version)
RUN bash -lc 'shopt -s nullglob; apk_paths=(app/build/outputs/apk/release/*.apk); if [ -f "${apk_paths[0]}" ]; then cp "${apk_paths[0]}" /artifacts/app/; fi'
# AAR produced by the library module
RUN bash -lc 'shopt -s nullglob; if [ -d easypermissions/build/outputs/aar ]; then cp -R easypermissions/build/outputs/aar /artifacts/easypermissions/; fi'
# Optional: show what artifacts exist (for debugging)
RUN ls -la /artifacts || true
# Stage 2: Runtime image with Java runtime and the built artifacts
FROM eclipse-temurin:8-jre AS runtime
WORKDIR /app
# Copy artifacts from the builder stage
COPY --from=builder /artifacts /artifacts
# Expose nothing specific; this image simply holds the build outputs
# Keep the container alive so users can inspect artifacts if needed
CMD ["/bin/sh", "-lc", "echo Build artifacts available in /artifacts; ls -la /artifacts; tail -f /dev/null"]
Concerns: Copy of APK picks only the first APK; if multiple APKs exist (for multiple ABIs or build flavors), others are ignored., No validation of APK/AAR content (only presence is checked)., The runtime image is a JRE; artifact container is not a runnable image, it's for artifact storage. Smoke [PASS]: test -d /artifacts && ls -la /artifacts Smoke [PASS]: test -d /artifacts/app && ls -la /artifacts/app Smoke [PASS]: apk_file=$(ls /artifacts/app/*.apk 2>/dev/null | head -n1); if [ -n \"$apk_file\" ]; then echo APK_FOUND: $apk_file; else echo APK_NOT_FOUND; fi