Добрый день, уважаемые читатели.  Я - Владимир, меня зовут девопс. Говорят, что девопс - это болезнь и я это вам сегодня докажу.  Ответа на вопрос "зачем?" вы тут не найдете, это кликбейт, я и сам не знаю. Все происходящее мотивируется девизом "бикоз ай кен".  Если без шуток, то можно прогонять процесс сборки, создавать изолированные тест-кейсы, прогонять через автотесты, SonarQube и прочие SAST-ы Итак. Дано. Один безумный девопс, один несчастный андроид-разработчик, собирающий апк локально. Ситуация, увы, распространенная.  Как решаем. Пишем Dockerfile для дела и Jenkinsfile для понтов, сегодня речь только про Dockerfile. Для успешного процесса нужно смазать вытащить из разработчика окружение, в котором вся эта радость собирается. Нас интересует версии gradle, jdk, android sdk Удобнее всего собирать готовым официальным образом https://hub.docker.com/_/gradle При выборе образа обратите внимание на версию gradle и java, gradle имеет debian корни, так что apt-get java на случай, если версии нет готовой. Создаем в корне репы Dockerfile и начинаем его заполнять: Сразу проверяем, сходятся ли версии gradle и java т..к. Dockerfile лежит в корне репозитория, копируем содержимое в контейнер Два из трех есть - gradle и jdk установлены, ставим androidsdk.  Есть один нюанс. Для andriodsdk нужно вытащить архивчик с оным. Можно скурлить последнюю версию, а можно ручками смотреть тут. Как девопс - я бы не хотел возвращаться к обновлению окружения руками, однако могут быть неприятные сюрпризы с новыми версиями androidsdk. Да и не всегда есть нужда в использовании latest. Так что просто укажем имя архива в переменной Скачиваем архив, распаковываем, чистим мусор То чувство, когда не успевал начать, а уже почти все готово.Указываем PATH для androidsdk, куда полезет gradle Обратите внимание на вторую строчку, где отдельно указаны пакеты androidsdkВ ранних версиях было достаточно установить androidsdk, сейчас же нужно отдельно ставить пакеты\платформы\самовары\блудниц. Никто не мешает поставить сразу весь фарш, нооо... Но чувство прекрасного говорит, что надо только то, что надо. Как определить какие пакеты собсна нужны? об этом ниже про нюансы Ну и последнее, творим магию Целиком прекрасный Dockerfile  1. Как определить пакеты sdkmanager, необходимые к установке?Можно посмотреть в студии\спросить разраба. скорее всего будет уйма ненужного, так что вариант корнями ведущий в беспощадный ру-девелоп. последовательно запускаем gradle build без пакетов sdkmanager-a, смотрим, на что ругается - ставим (т.е. добавляем пакеты в строчку 17), повторять до полного самоудовлетворения. 2. Как вытащить итоговый apk?Можно присобачить юзера и volume в Dockerfile, самое очевидное.Но на мой взгляд есть изящное решение в виде Jenkinsfile, т.к. он чуть более, чем полностью состоит из sh, можно делать то же самое, но руками: Смысл такой, что- создаем образ (!) из Dockerfiledocker build . - контейнер закончил работать и закрылсястатус = exited- запускаем контейнер с командой, которая сможет продолжить его работу.docker start build_apk sleep infinity- вытаскиваем всю эту радость докером и убираем хвостыdocker cp build_apk:/path/to/apk/in/docker/container/*.apk /path/to/home/dir && / docker stop build_apk && docker rm build_apk Кто то скажет "фу, костыль" и будет прав. Но это решение не претендует на истину в последней инстанции. Это простой и легкий в освоении вариант, который решает тактическую задачу 3. Что делать, если мы за прокси?для wget добавляем ключ "--no-check-certificate"для sdk manager добавляем ключи "--proxy=http --proxy_host=<ip> --proxy_port=<port>" Не забываем прописать прокси в gradle.properies Если тянем с либы корпоративного репо - то и не забываем указать его же в build.gradle в двух местах!! Мы ж тут про девопс, а потому мы хотим смузи и женщин автоматизацию.а потому хотим, чтобы после коммита в репу запускалась сборка и итоговая апк вываливалась в какой-никакой общий доступ.Как это сделать красиво - в следующей статье) про простейший nginx и JenkinsТам будет про вывалить версию в версию. Короче, интрига.