1

I have CI on Gitlab for creating of my android application. This is example of my .gitlab-ci.yml:

image: openjdk:8-jdk

variables:
  ANDROID_COMPILE_SDK: "28"
  ANDROID_BUILD_TOOLS: "28.0.2"
  ANDROID_SDK_TOOLS:   "4333796"

before_script:
  - apt-get --quiet update --yes
  - apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
  - wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_TOOLS}.zip
  - unzip -d android-sdk-linux android-sdk.zip
  - echo y | android-sdk-linux/tools/bin/sdkmanager "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null
  - echo y | android-sdk-linux/tools/bin/sdkmanager "platform-tools" >/dev/null
  - echo y | android-sdk-linux/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null
  - export ANDROID_HOME=$PWD/android-sdk-linux
  - export PATH=$PATH:$PWD/android-sdk-linux/platform-tools/
  - chmod +x ./gradlew
  # temporarily disable checking for EPIPE error and use yes to accept all licenses
  - set +o pipefail
  - yes | android-sdk-linux/tools/bin/sdkmanager --licenses
  - set -o pipefail

stages:
  - build
  - test

lintDebug:
  stage: build
  script:
    - ./gradlew -Pci --console=plain :app:lintDebug -PbuildDir=lint

assembleDebug:
  stage: build
  script:
    - ./gradlew assembleDebug
  artifacts:
    paths:
    - app/build/outputs/

debugTests:
  stage: test
  script:
    - ./gradlew -Pci --console=plain :app:testDebug

But each time we have a commit, this job downloads SDK, etc ... How can I capture this container with this SDK ? Should i make commit for docker container ? docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name

My runner /etc/gitlab-runner/config.toml:

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "MYAPP-CI-ANDROID"
  url = "https://gitlab.com/"
  token = "vNcmGuDwWwz9ZwwFOz-z"
  executor = "docker"
  [runners.docker]
    tls_verify = false
    image = "openjdk:8-jdk"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    shm_size = 0
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]

Should I publish my docker image on docker hub or we can do it in other way ? Thanks for your help.

saviour123
  • 170
  • 5
Piduna
  • 501
  • 3
  • 10
  • 23

1 Answers1

1

Just went through this, too, because it seemed silly to download the SDK every time. It's quite simple to build a custom docker image for that.

FROM openjdk:8-jdk

ARG ANDROID_COMPILE_SDK="29"
ARG ANDROID_BUILD_TOOLS="29.0.1"
ARG ANDROID_SDK_TOOLS="4333796"

# Update and Install some packages
RUN apt-get --quiet update --yes && \
    apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1

# Install Android SDK
RUN wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_TOOLS}.zip && \
    unzip -d android-sdk-linux android-sdk.zip

RUN echo y | android-sdk-linux/tools/bin/sdkmanager "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null && \
    echo y | android-sdk-linux/tools/bin/sdkmanager "platform-tools" >/dev/null && \
    echo y | android-sdk-linux/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null

ENV ANDROID_HOME=$PWD/android-sdk-linux

#RUN chmod +x ./gradlew

RUN yes | android-sdk-linux/tools/bin/sdkmanager --licenses

CMD ["jshell"]
  1. Build

    docker build -t image_name \
    --build-arg ANDROID_COMPILE_SDK="29" \
    --build-arg ANDROID_BUILD_TOOLS="29.0.1" \
    --build-arg ANDROID_SDK_TOOLS="4333796" .
    
  2. Tag and push

    docker tag image_name YOUR_DOCKER_REPO/YOUR_DOCKER_IMAGE:latest
    docker login docker.io
    docker push YOUR_DOCKER_REPO/YOUR_DOCKER_IMAGE:latest
    

Then you would use that image instead of openjdk8. It works. It's quite simple and shaves roughly 6 minutes of my pipeline. You still need to run chmod +x ./gradlew in your before_script. Theoretically, you could make sure that the gradlew is executable in git. But that might not be very reliable when you have people working on it (at all) and when using Windows especially.

RalfFriedl
  • 3,008
  • 4
  • 12
  • 17
Max
  • 111
  • 1