Назад | Перейти на главную страницу

Как создать собственный образ докеры для 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]

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

Просто прошел через это, потому что загружать 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.