如何通过GitLab-CI.yml在Docker容器运行测试?SDK路径问题求助
Android SDK 配置问题导致GitLab CI无法运行测试
问题现象
无法通过gitlab-ci.yml在Docker容器中运行Android测试,GitLab任务执行时提示SDK位置未找到,尽管Dockerfile中已配置Android SDK和Appium环境。
任务执行报错日志
Running with gitlab-runner 16.4.1 (d89a789a) on android-runner -2rWdQd8s, system ID: r_kZDI04JzEX1l Resolving secrets 00:00 Preparing the "docker" executor Using Docker executor with image gradle:8.1.1 ... Pulling docker image gradle:8.1.1 ... Using docker image sha256:abd476693274518a7798ba621f009bf9e03b77c5199a285d38c0e1e251cb9f34 for gradle:8.1.1 with digest gradle@sha256:e7a4bc8f4ee27feae2eac4de61ca64406b7137e6f6b107052accd24bf0806043 ... Preparing environment 00:00 Running on runner--2rwdqd8s-project-50949840-concurrent-0 via b14526a57e4f... Getting source from Git repository 00:02 Fetching changes with git depth set to 20... Reinitialized existing Git repository in /builds/autotest2832040/AndroidTest/.git/ Checking out d6da12ec as detached HEAD (ref is master)... Skipping Git submodules setup Executing "step_script" stage of the job script 00:47 Using docker image sha256:abd476693274518a7798ba621f009bf9e03b77c5199a285d38c0e1e251cb9f34 for gradle:8.1.1 with digest gradle@sha256:e7a4bc8f4ee27feae2eac4de61ca64406b7137e6f6b107052accd24bf0806043 ... $ export ANDROID_HOME="/opt/android-sdk" $ export JAVA_HOME="/opt/java/openjdk" $ chmod +x gradlew $ ./gradlew clean test Downloading https://services.gradle.org/distributions/gradle-8.0-bin.zip ...........10%............20%............30%............40%............50%............60%...........70%............80%............90%............100% Welcome to Gradle 8.0! For more details see https://docs.gradle.org/8.0/release-notes.html Starting a Gradle Daemon (subsequent builds will be faster) FAILURE: Build failed with an exception. * What went wrong: Could not determine the dependencies of task ':app:testDebugUnitTest'. > SDK位置未找到。请通过ANDROID_HOME环境变量或在项目的local.properties文件中设置sdk.dir路径指定有效的SDK位置,文件路径为'/builds/autotest2832040/AndroidTest/local.properties'. * Try: > 使用--stacktrace选项获取堆栈跟踪信息。 > 使用--info或--debug选项获取更多日志输出。 > 使用--scan选项获取完整分析信息。 * Get more help at https://help.gradle.org BUILD FAILED in 45s Cleaning up project directory and file based variables 00:01 ERROR: Job failed: exit code 1
gitlab-ci.yml 文件内容
image: gradle:8.1.1 default: tags: - android-test stages: - test Integration test with Allure: stage: test before_script: - export ANDROID_HOME="/opt/android-sdk" - export JAVA_HOME="/opt/java/openjdk" - chmod +x gradlew script: - ./gradlew clean test - ./gradlew allureReport artifacts: paths: - build\reports\allure-report\allureReport\*
Dockerfile 文件内容
From gradle:8.1.1 #===================== # 安装Android SDK #===================== ARG ANDROID_SDK_VERSION=4333796 ENV ANDROID_SDK_VERSION=$ANDROID_SDK_VERSION ARG ANDROID_COMMAND_LINE=10406996 ENV ANDROID_COMMAND_LINE=$ANDROID_COMMAND_LINE ARG ANDROID_PLATFORM="android-33" ARG BUILD_TOOLS="33.0.1" ENV ANDROID_PLATFORM=$ANDROID_PLATFORM ENV BUILD_TOOLS=$BUILD_TOOLS # 安装Android SDK RUN mkdir -p /opt/android_sdk \ && wget -q https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_COMMAND_LINE}_latest.zip \ && unzip commandlinetools-linux-${ANDROID_COMMAND_LINE}_latest.zip -d /opt/android_sdk \ && rm commandlinetools-linux-${ANDROID_COMMAND_LINE}_latest.zip \ && cd /opt/android_sdk/cmdline-tools/latest/bin/sdkmanager \ && sdkmanager "platform-tools" "platforms;android-33" \ && sdkmanager "emulator" "platforms;${ANDROID_PLATFORM}" "build-tools;${BUILD_TOOLS}" " system-images;${ANDROID_PLATFORM};google_apis;armeabi-v7a" \ && yes | /opt/android_sdk/cmdline-tools/latest/bin/sdkmanager --licenses ENV ANDROID_HOME "/opt/android_sdk" #==================================== # 安装最新Node.js、npm、Appium测试环境 #==================================== ARG NODE_VERSION=v18.18.0 ENV NODE_VERSION=$NODE_VERSION ARG APPIUM_VERSION=1.22.3 ENV APPIUM_VERSION=$APPIUM_VERSION # 安装Appium RUN wget -q https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}.tar.xz \ && tar -xJf node-${NODE_VERSION}.tar.xz -C /opt/ \ && ln -s /opt/node-${NODE_VERSION}-linux-x64/bin/npm /usr/bin/ \ && ln -s /opt/node-${NODE_VERSION}-linux-x64/bin/node /usr/bin/ \ && ln -s /opt/node-${NODE_VERSION}-linux-x64/bin/npx /usr/bin/ \ && npm install -g appium@${APPIUM_VERSION} --allow-root --unsafe-perm=true \ && ln -s /opt/node-${NODE_VERSION}-linux-x64/bin/appium /usr/bin/ EXPOSE 4723 CMD ["docker-entrypoint"]
问题原因与解决方法
核心问题
- 镜像不匹配:
gitlab-ci.yml中使用的是官方gradle:8.1.1镜像,而非自定义的包含Android SDK的镜像,容器内根本没有SDK环境。 - 路径不一致:Dockerfile中设置的
ANDROID_HOME是/opt/android_sdk,但gitlab-ci.yml中导出的是/opt/android-sdk(下划线与短横线差异),即使镜像正确也会找不到SDK。
解决步骤
构建并推送自定义镜像
在本地或CI环境中执行以下命令,将自定义镜像推送到镜像仓库(如GitLab Container Registry):docker build -t your-registry/android-gradle-appium:8.1.1 . docker push your-registry/android-gradle-appium:8.1.1替换
your-registry为你的实际镜像仓库地址。修改gitlab-ci.yml
- 替换镜像为自定义镜像地址;
- 移除重复的环境变量导出(镜像中已配置);
- 修复artifacts路径的Windows风格反斜杠为Linux正斜杠。
修改后的示例:
image: your-registry/android-gradle-appium:8.1.1 default: tags: - android-test stages: - test Integration test with Allure: stage: test before_script: - chmod +x gradlew script: - ./gradlew clean test - ./gradlew allureReport artifacts: paths: - build/reports/allure-report/allureReport/*
- 可选:补充local.properties配置
如果仍存在SDK识别问题,可在before_script中生成local.properties文件:- echo "sdk.dir=${ANDROID_HOME}" > local.properties
内容的提问来源于stack exchange,提问作者Дмитрий Малигон
相关产品推荐
相关产品推荐

