Π‘Π±ΠΎΡ€ΠΊΠ° Android-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² Docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅

Разрабатывая ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠΎΠ΄ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ Android, Π΄Π°ΠΆΠ΅ самый нСбольшой, Ρ€Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ приходится ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ с ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. ΠšΡ€ΠΎΠΌΠ΅ Android SDK, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»Π° послСдняя вСрсия Kotlin, Gradle, platform-tools, build-tools. И Ссли Π½Π° машинС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° всС эти зависимости Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ Π² большСй ΠΌΠ΅Ρ€Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Android Studio IDE, Ρ‚ΠΎ Π½Π° сСрвСрС CI/CD ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π² Π³ΠΎΠ»ΠΎΠ²Π½ΡƒΡŽ боль. И Ссли Π² web-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ окруТСния стандартом стал Docker, Ρ‚ΠΎ ΠΏΠΎΡ‡Π΅ΠΌΡƒ-Π±Ρ‹ Π½Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅Π³ΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΈ Π² Android-разработкС…

Для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Docker β€” Ссли совсСм просто, Ρ‚ΠΎ это инструмСнт создания Ρ‚.Π½. Β«ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ²Β» Π³Π΄Π΅ содСрТится минимальноС ядро ОБ ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ Π½Π°Π±ΠΎΡ€ ПО, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Π³Π΄Π΅ Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ, сохраняя ΠΏΡ€ΠΈ этом ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅. Π§Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π² нашСм ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ опрСдСляСтся Π² Dockerfile, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΌ собираСтся Π² ΠΎΠ±Ρ€Π°Π· запускаСмый Π³Π΄Π΅ ΡƒΠ³ΠΎΠ΄Π½ΠΎ ΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΠΉ свойства идСмпотСнтности.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ установки ΠΈ основы Docker прСкрасно описаны Π½Π° Π΅Π³ΠΎ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ сайтС. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, забСгая Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΠΏΠ΅Ρ€Π΅Π΄, Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ Dockerfile Ρƒ нас получился

# Π’.ΠΊ. основным инструмСнтом для сборки Android-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² являСтся Gradle, 
# ΠΈ ΠΏΠΎ счастливому ΡΡ‚Π΅Ρ‡Π΅Π½ΠΈΡŽ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π² Π΅ΡΡ‚ΡŒ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Docker-ΠΎΠ±Ρ€Π°Π· 
# ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π·Π° основу Π²Π·ΡΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΅Π³ΠΎ с Π½ΡƒΠΆΠ½ΠΎΠΉ Π½Π°ΠΌ вСрсиСй Gradle
FROM gradle:5.4.1-jdk8

# Π—Π°Π΄Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ с локальной ΠΏΠ°ΠΏΠΊΠΎΠΉ для Android SDK ΠΈ 
# вСрсиями ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈ инструмСнтария
ENV SDK_URL="https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip" 
    ANDROID_HOME="/usr/local/android-sdk" 
    ANDROID_VERSION=28 
    ANDROID_BUILD_TOOLS_VERSION=28.0.3

# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΠ°ΠΏΠΊΡƒ, скачиваСм Ρ‚ΡƒΠ΄Π° SDK ΠΈ распаковываСм Π°Ρ€Ρ…ΠΈΠ²,
# ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ послС сборки удаляСм
RUN mkdir "$ANDROID_HOME" .android 
    && cd "$ANDROID_HOME" 
    && curl -o sdk.zip $SDK_URL 
    && unzip sdk.zip 
    && rm sdk.zip 
# Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… строчках ΠΌΡ‹ создаСм ΠΏΠ°ΠΏΠΊΡƒ ΠΈ тСкстовыС Ρ„Π°ΠΉΠ»Ρ‹ 
# с лицСнзиями. На ΠΎΡ„. сайтС Android написано Ρ‡Ρ‚ΠΎ ΠΌΡ‹ 
# ΠΌΠΎΠΆΠ΅ΠΌ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эти Ρ„Π°ΠΉΠ»Ρ‹ с машин Π³Π΄Π΅ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ эти 
# Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΠ»ΠΈ ΠΈ Ρ‡Ρ‚ΠΎ автоматичСски 
# ΠΈΡ… ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСльзя
    && mkdir "$ANDROID_HOME/licenses" || true 
    && echo "24333f8a63b6825ea9c5514f83c2829b004d1" > "$ANDROID_HOME/licenses/android-sdk-license" 
    && echo "84831b9409646a918e30573bab4c9c91346d8" > "$ANDROID_HOME/licenses/android-sdk-preview-license"    

# ЗапускаСм ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ SDK ΠΈ установку build-tools, platform-tools
RUN $ANDROID_HOME/tools/bin/sdkmanager --update
RUN $ANDROID_HOME/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" 
    "platforms;android-${ANDROID_VERSION}" 
    "platform-tools"

БохраняСм Π΅Π³ΠΎ Π² ΠΏΠ°ΠΏΠΊΡƒ с нашим Android-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ ΠΈ запускаСм сборку ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ

docker build -t android-build:5.4-28-27 .

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -t Π·Π°Π΄Π°Π΅Ρ‚ tag ΠΈΠ»ΠΈ имя нашСго ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ состоит ΠΈΠ· Π΅Π³ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈ вСрсии. Π’ нашСм случаС ΠΌΡ‹ Π½Π°Π·Π²Π°Π»ΠΈ Π΅Π³ΠΎ android-build Π° Π² вСрсии ΡƒΠΊΠ°Π·Π°Π»ΠΈ ΡΠΎΠ²ΠΎΠΊΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ вСрсий gradle, android-sdk ΠΈ platform-tools. Π’ дальнСйшСм Π½Π°ΠΌ ΠΏΡ€ΠΎΡ‰Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π½Π°ΠΌ ΠΎΠ±Ρ€Π°Π· ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π°ΠΊΡƒΡŽ Β«Π²Π΅Ρ€ΡΠΈΡŽΒ».

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ сборка ΠΏΡ€ΠΎΡˆΠ»Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ наш ΠΎΠ±Ρ€Π°Π· локально, ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ docker push Π² ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΎΠ±Ρ€Π°Π·ΠΎΠ² Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠ°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ°ΡˆΠΈΠ½Ρ‹.

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° собСрСм локально ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Для этого Π² ΠΏΠ°ΠΏΠΊΠ΅ с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ

docker run --rm -v "$PWD":/home/gradle/ -w /home/gradle android-build:5.4.1-28-27 gradle assembleDebug

Π Π°Π·Π±Π΅Ρ€Π΅ΠΌ Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚:

docker run β€” сама ΠΊΠΎΠΌΠ°Π½Π΄Π° запуска ΠΎΠ±Ρ€Π°Π·Π°
-rm β€” ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ послС остановки ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΎΠ½ удаляСт Π·Π° собой всС Ρ‡Ρ‚ΠΎ создавалось Π² процСссС Π΅Π³ΠΎ ΠΆΠΈΠ·Π½ΠΈ
-v «$PWD»:/home/gradle/ β€” ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ с нашим Android-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ ΠΏΠ°ΠΏΠΊΡƒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° /home/gradle/
-w /home/gradle β€” Π·Π°Π΄Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°
android-build:5.4.1-28-27 β€” имя нашСго ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ собрали
gradle assembleDebug β€” собствСнно ΠΊΠΎΠΌΠ°Π½Π΄Π° сборки, которая собираСт наш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

Если всС ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒΡΡ ΡƒΠ΄Π°Ρ‡Π½ΠΎ, Ρ‚ΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Ρƒ сСкунд/ΠΌΠΈΠ½ΡƒΡ‚ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Ρƒ сСбя Π½Π° экранС Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ BUILD SUCCESSFUL in 8m 3s! А Π² ΠΏΠ°ΠΏΠΊΠ΅ app/build/output/apk Π±ΡƒΠ΄Π΅Ρ‚ Π»Π΅ΠΆΠ°Ρ‚ΡŒ собранноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ gradle β€” ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ тСсты ΠΈ Ρ‚.Π΄. ОсновноС прСимущСство β€” ΠΏΡ€ΠΈ нСобходимости сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ машинС, Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎΠ± установкС всСго окруТСния ΠΈ достаточно Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΠΎΠ±Ρ€Π°Π· ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π² Π½Π΅ΠΌ сборку.

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π½Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΈ каТдая сборка запускаСтся с нуля, Ρ‡Ρ‚ΠΎ с ΠΎΠ΄Π½ΠΎΠΉ стороны Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ сборки нСзависимо ΠΎΡ‚ мСста Π΅Π΅ запуска, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΡΠΊΠ°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ всС зависимости ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ вСсь ΠΊΠΎΠ΄ Π·Π°Π½ΠΎΠ²ΠΎ, Π° это ΠΈΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ сущСствСнноС врСмя. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΊΡ€ΠΎΠΌΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Β«Ρ…ΠΎΠ»ΠΎΠ΄Π½ΠΎΠ³ΠΎΒ» запуска Ρƒ нас Π΅ΡΡ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ запуска сборки с сохранСниСм Ρ‚.Π½. «кэша», Π³Π΄Π΅ ΠΌΡ‹ сохраняСм ΠΏΠ°ΠΏΠΊΡƒ ~/.gradle просто копируя Π΅Π΅ Π² Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π° Π² Π½Π°Ρ‡Π°Π»Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ сборки Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π΅Π΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. ВсС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ копирования ΠΌΡ‹ вынСсли Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ скрипты ΠΈ сама ΠΊΠΎΠΌΠ°Π½Π΄Π° запуска Ρƒ нас стала Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ

docker run --rm -v "$PWD":/home/gradle/ -w /home/gradle android-build:5.4.1-28-27 /bin/bash -c "./pre.sh; gradle assembleDebug; ./post.sh"

Π’ ΠΈΡ‚ΠΎΠ³Π΅, срСднСС врСмя сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Ρƒ нас ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΠ»ΠΎΡΡŒ Π² нСсколько Ρ€Π°Π· (Π² зависимости ΠΎΡ‚ числа зависимостСй Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, Π½ΠΎ срСдний ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ стал ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Π·Π° 1 ΠΌΠΈΠ½ΡƒΡ‚Ρƒ вмСсто 5 ΠΌΠΈΠ½ΡƒΡ‚).

ВсС это само собой ΠΈΠΌΠ΅Π΅Ρ‚ смысл Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ собствСнный Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ CI/CD сСрвСр, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹ сами ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚Π΅ΡΡŒ. Но сСйчас Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ… сСрвисов Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… всС эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ΅Π½Ρ‹ ΠΈ Π²Π°ΠΌ Π½Π΅ Π½Π°Π΄ΠΎ ΠΎΠ± этом ΠΏΠ΅Ρ€Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Π½ΡƒΠΆΠ½Ρ‹Π΅ свойства сборки ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π² настройках ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Волько зарСгистрированныС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² опросС. Π’ΠΎΠΉΠ΄ΠΈΡ‚Π΅, поТалуйста.

Π”Π΅Ρ€ΠΆΠΈΡ‚Π΅ Π»ΠΈ Π²Ρ‹ систСму CI/CD Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ сторонним сСрвисом

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ сСрвСр

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ внСшний сСрвис

  • НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ CI/CD

  • Π”Ρ€ΡƒΠ³ΠΎΠ΅

ΠŸΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π»ΠΈ 42 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π’ΠΎΠ·Π΄Π΅Ρ€ΠΆΠ°Π»ΠΈΡΡŒ 16 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ