Как сделать собственный образ докера для Gitlab CI

Я имею CI на Gitlab для создания моего приложения для Android. Это пример моего .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

Но каждый раз, когда у нас есть commitэта загрузка загрузок SDKи т.д... Как я могу захватить этот контейнер с этим SDK? Должен ли я сделать commit для докера контейнера?docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name

Мой бегун /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]

Должен ли я опубликовать свой образ докера на док-станции или мы можем сделать это другим способом? Спасибо за вашу помощь.

0 ответов

Просто прошел через это, потому что казалось, глупо загружать SDK каждый раз. Для этого довольно просто создать собственный образ докера.

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. строить

    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. Отметить и нажать

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

Тогда вы бы использовали это изображение вместо openjdk8. Оно работает. Это довольно просто и бреет примерно 6 минут моего конвейера. Вам все еще нужно бежать chmod +x ./gradlew в вашей before_script, Теоретически вы можете убедиться, что gradlew исполняется в git. Но это может быть не очень надежно, когда над вами работают люди (вообще) и особенно при использовании Windows.

Другие вопросы по тегам