Андроидная среда с использованием докеров и битбакетных трубопроводов

Я очень новичок в конвейерах Bitbucket (Beta) и докеров. Нет предыдущего опыта интеграции CI

Я последовал этому вопросу, но нет четкого описания для новичков

Я пытаюсь настроить Continuous Integration (CI) в Bitbucket Pipelines для Android Project с помощью контейнера докеров

Я хочу использовать мой предыдущий проект Android с этим контейнером

Шаги, которые я последовал

Шаг 1 . Установленные инструменты Docker Software. Успешно установлен.

Шаг 2 . Успешно создана виртуальная машина

Шаг 3 . Созданный контейнер от Kitematic (Beta) Uber / Android-Build-Environment

Успешно Докер

Шаг 4 . Успешно использовать проект

$ eval "$(docker-machine env default)" $ docker build -t uber/android-build-environment . 

Введите описание изображения здесь

Шаг 5 . Изменение работы непосредственно в проекте Android

Шаг 6. Проблема заключается в этом шаге при выполнении этой команды

 docker run -i -v $PWD:/project -t uber/android-build-environment /bin/bash /project/ci/build.sh 

Ошибка :

/bin/bash: /project/ci/build.sh: No such file or directory

Изображение ошибки

Детали докерной машины

 docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS default - virtualbox Running tcp://192.168.99.100:2376 v1.12.1 

Докеры

 docker service ls 

Докерная машина ENV

 export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://192.168.XX.XXX:XXXX" export DOCKER_CERT_PATH="/Users/gaurav/.docker/machine/machines/default" export DOCKER_MACHINE_NAME="default" # Run this command to configure your shell: # eval $(docker-machine env) 

    Если я правильно понял ваш вопрос: вам технически даже не нужно устанавливать Docker на вашу локальную машину, чтобы использовать его в своих потоках Bitbucket (хотя это может быть весьма полезно для отладки).

    Трубопроводы Bitbucket можно настроить для использования Docker из Docker Hub , и тот, который вы упомянули ( uber / android-build-environment ), работал хорошо для меня.

    Просто добавьте bitbucket-pipelines.yml в корень вашего проекта, например:

     image: uber/android-build-environment:latest pipelines: default: - step: script: - build.sh 

    Мне нравится организовывать мой процесс сборки в собственном файле сценария ash ( build.sh ), но это необязательно (вместо этого вы могли бы поместить несколько маркеров в файл yaml в соответствии с директивой script ). Примеры (и более подробная информация) о bitbucket-pipelines.yml можно найти на странице « Руководства по языкам» на странице « Битбакетные трубопроводы» .

    Мой скрипт build.sh (также в корневом build.sh проекта, но может быть помещен в подкаталог, если вы ссылаетесь на него как таковой в вашем bitbucket-pipelines.yml , например scripts/build.sh ):

     #!/bin/sh mkdir "${ANDROID_HOME}/licenses" || true echo "8933bad161af4178b1185d1a37fbf41ea5269c55" > "${ANDROID_HOME}/licenses/android-sdk-license" ./gradlew assembleDebug 

    Часть лицензий позволяет процессу Android Gradle автоматически загружать Android-зависимости для вас, как указано в этом ответе .

    Для хорошей меры установите соответствующие разрешения для скрипта сборки :

     git update-index --chmod=+x build.sh 

    Убедитесь, что вы включили Bitbucket Pipelines (со страницы вашего репо: Settings -> Pipelines: Settings -> Enable Pipelines ).

    Затем просто bitbucket-pipelines.yml и build.sh и нажмите на ваш ретранслятор BitBucket. Построение Bitbucket Pipelines для вашего проекта должно начаться вскоре после вашего нажатия. Bitbucket Pipelines загрузит Docker uber/android-build-environment из Docker Hub и проверит ваш проект и запустит скрипт build.sh в Docker.


    Процесс, который вы описывали при настройке Docker на вашей локальной машине, может быть действительно полезен, если ваша сборка Bitbucket Pipelines завершится неудачно и вы хотите, чтобы на вашей локальной машине работала одна и та же среда, чтобы вы могли экспериментировать с ней и тестировать изменения в build.sh прежде чем на самом деле совершить и нажать на свое репо.

    Может также оказаться полезным, если вы запустили (локально):

     docker run -it uber/android-build-environment 

    Что запустит Docker (на вашем локальном компьютере) и поместит вас в интерактивную оболочку, чтобы вы могли просматривать и лучше понимать среду Docker.

    Также обратите внимание, что Bitbucket Pipelines клонирует ваше репо в Docker как часть процесса сборки (насколько я могу судить), которое вы не делали на Docker, запущенном на вашей локальной машине, что, возможно, привело к некоторой путанице в отношении Ваш скрипт build.sh не присутствует.

    Если вы хотите, чтобы каталог на вашем локальном компьютере существовал в Docker (который вы используете на вашем локальном компьютере, возможно, для тестирования создания проекта на локальном компьютере в докере, который вы хотите использовать), вы можете использовать следующую команду для монтирования Ваш текущий рабочий каталог в /project внутри локально запущенного Docker:

     docker run -v `pwd`:/project -it uber/android-build-environment 

    Более подробную информацию можно найти в разделе «Установить главную папку» в качестве тома данных .

    Как отметил в своем ответе @ ming-c, в Docker Hub есть много других изображений Docker ; Это, безусловно, стоит посмотреть, чтобы увидеть, можете ли вы найти изображение, наиболее подходящее для ваших нужд.

    Изображение uber построено для среды CI, я создал типичное изображение докеров, которое включает только Android build env . В него вошли последние версии SDK и NDK. Вы можете просто использовать следующий пример как ваш битбакет-pipelines.yml

     image: mingc/android-build-box:latest pipelines: default: - step: script: - chmod +x gradlew - ./gradlew assemble 

    Он включает следующие компоненты:

    • Ubuntu 16.04
    • Android SDK 16 17 18 19 20 21 22 23 24 25
    • Инструменты для создания Android 21.1.2 22.0.1 23.0.1 23.0.2 23.0.3 24 24.0.1 24.0.2 24.0.3 25 25.0.1 25.0.2 25.2.3
    • Android NDK r13b
    • экстра-андроид-m2repository
    • экстра-Google-google_play_services
    • экстра-Google-m2repository

    Вы также можете использовать это изображение докеров для создания своего проекта Android с помощью одной команды запуска докеров:

     cd <android project directory> # change working directory to your project root directory. docker run --rm -v `pwd`:/project mingc/android-build-box bash -c 'cd /project; ./gradlew build' 

    docker run -i -v $PWD:/project -t uber/android-build-environment /bin/bash /project/ci/build.sh команды docker run -i -v $PWD:/project -t uber/android-build-environment /bin/bash /project/ci/build.sh предполагает, что файл /project/ci/build.sh находится в контейнере. Вы уверены, что используете эту команду docker из каталога, который ее содержит?

    Если вы не уверены, что я попробую (из вашего каталога проектов)

    docker run -it -v $PWD:/project uber/android-build-environment /bin/bash

    А затем проверьте результаты проекта ls -a /project когда вы вошли в контейнер.

    Еще одна вещь, чтобы убедиться в том, что build.sh разрешено выполнять, убедитесь в этом, запустив chmod +x build.sh .