You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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"]

问题原因与解决方法

核心问题

  1. 镜像不匹配:gitlab-ci.yml中使用的是官方gradle:8.1.1镜像,而非自定义的包含Android SDK的镜像,容器内根本没有SDK环境。
  2. 路径不一致:Dockerfile中设置的ANDROID_HOME是/opt/android_sdk,但gitlab-ci.yml中导出的是/opt/android-sdk(下划线与短横线差异),即使镜像正确也会找不到SDK。

解决步骤

  1. 构建并推送自定义镜像
    在本地或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为你的实际镜像仓库地址。

  2. 修改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/*
  1. 可选:补充local.properties配置
    如果仍存在SDK识别问题,可在before_script中生成local.properties文件:
    - echo "sdk.dir=${ANDROID_HOME}" > local.properties
    

内容的提问来源于stack exchange,提问作者Дмитрий Малигон

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:44:54