ื‘ื ื™ื™ืช ืคืจื•ื™ืงื˜ ืื ื“ืจื•ืื™ื“ ื‘ืงื•ื ื˜ื™ื™ื ืจ Docker

ื›ืืฉืจ ืžืคืชื—ื™ื ืคืจื•ื™ืงื˜ ืœืคืœื˜ืคื•ืจืžืช ืื ื“ืจื•ืื™ื“, ืืคื™ืœื• ื”ืงื˜ืŸ ื‘ื™ื•ืชืจ, ื‘ืžื•ืงื“ื ืื• ื‘ืžืื•ื—ืจ ืฆืจื™ืš ืœื”ืชืžื•ื“ื“ ืขื ืกื‘ื™ื‘ืช ื”ืคื™ืชื•ื—. ื‘ื ื•ืกืฃ ืœ-Android SDK, ื™ืฉ ืฆื•ืจืš ื‘ื’ืจืกื” ื”ืขื“ื›ื ื™ืช ื‘ื™ื•ืชืจ ืฉืœ Kotlin, Gradle, platform-tools, build-tools. ื•ืื ื‘ืžื—ืฉื‘ ืฉืœ ื”ืžืคืชื— ื›ืœ ื”ืชืœื•ืช ื”ืœืœื• ื ืคืชืจื•ืช ื‘ืžื™ื“ื” ืจื‘ื” ื™ื•ืชืจ ื‘ืืžืฆืขื•ืช Android Studio IDE, ืื– ื‘ืฉืจืช ื”-CI/CD ื›ืœ ืขื“ื›ื•ืŸ ื™ื›ื•ืœ ืœื”ืคื•ืš ืœื›ืื‘ ืจืืฉ. ื•ืื ื‘ืคื™ืชื•ื— ืืชืจื™ื Docker ื”ืคืš ืœืคืชืจื•ืŸ ื”ืกื˜ื ื“ืจื˜ื™ ืœื‘ืขื™ื™ืช ื”ืกื‘ื™ื‘ื”, ืื– ืœืžื” ืœื ืœื ืกื•ืช ืœืคืชื•ืจ ื‘ืขื™ื” ื“ื•ืžื” ื‘ืคื™ืชื•ื— ืื ื“ืจื•ืื™ื“ ื‘ืืžืฆืขื•ืชื•...

ืœืžื™ ืฉืœื ื™ื•ื“ืข ืžื” ื–ื” 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"

ืื ื—ื ื• ืฉื•ืžืจื™ื ืืช ื–ื” ื‘ืชื™ืงื™ื™ื” ืขื ืคืจื•ื™ืงื˜ ื”ืื ื“ืจื•ืื™ื“ ืฉืœื ื• ื•ืžืชื—ื™ืœื™ื ืœื‘ื ื•ืช ืืช ื”ืงื•ื ื˜ื™ื™ื ืจ ืขื ื”ืคืงื•ื“ื”

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

ืคืจืžื˜ืจ -t ืžืฆื™ื™ืŸ ืืช ื”ืชื’ ืื• ื”ืฉื ืฉืœ ื”ืžื™ื›ืœ ืฉืœื ื•, ืฉื‘ื“ืจืš ื›ืœืœ ืžื•ืจื›ื‘ ืžื”ืฉื ื•ื”ื’ืจืกื” ืฉืœื•. ื‘ืžืงืจื” ืฉืœื ื•, ืงืจืื ื• ืœื–ื” android-build ื•ื‘ื’ืจืกื” ืฆื™ื™ื ื• ืงื‘ื•ืฆื” ืฉืœ ื’ืจืกืื•ืช ืฉืœ gradle, android-sdk ื•-platform-tools. ื‘ืขืชื™ื“, ื™ื”ื™ื” ืœื ื• ืงืœ ื™ื•ืชืจ ืœื—ืคืฉ ืืช ื”ืชืžื•ื ื” ืฉืื ื• ืฆืจื™ื›ื™ื ืœืคื™ ื”ืฉื ื‘ืืžืฆืขื•ืช "ื’ืจืกื” ื–ื•".

ืœืื—ืจ ืกื™ื•ื ื”ื”ืจื›ื‘ื”, ื ื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘ืชืžื•ื ื” ืฉืœื ื• ื‘ืื•ืคืŸ ืžืงื•ืžื™, ื ื•ื›ืœ ืœื”ื•ืจื™ื“ ืื•ืชื” ืขื ื”ืคืงื•ื“ื” ืœื“ื—ื•ืฃ ื“ื•ืงืจ ืœืžืื’ืจ ืชืžื•ื ื•ืช ืฆื™ื‘ื•ืจื™ ืื• ืคืจื˜ื™ ื›ื“ื™ ืœื”ื•ืจื™ื“ ืื•ืชื• ืœืžื›ื•ื ื•ืช ืื—ืจื•ืช.

ื›ื“ื•ื’ืžื”, ื‘ื•ืื• ื ื‘ื ื” ืคืจื•ื™ืงื˜ ืžืงื•ืžื™. ืœืฉื ื›ืš, ื‘ืชื™ืงื™ื™ื” ืขื ื”ืคืจื•ื™ื™ืงื˜, ื”ืคืขืœ ืืช ื”ืคืงื•ื“ื”

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

ื‘ื•ืื• ื ื‘ื™ืŸ ืžื” ื–ื” ืื•ืžืจ:

ืžืขื’ืŸ ืœืจื•ืฅ - ืคืงื•ื“ืช ื”ืฉืงืช ื”ืชืžื•ื ื” ืขืฆืžื”
-ืจื โ€” ืคื™ืจื•ืฉื• ืฉืœืื—ืจ ืฉื”ืžื™ื›ืœ ื ืขืฆืจ, ื”ื•ื ืžื•ื—ืง ืืช ื›ืœ ืžื” ืฉื ื•ืฆืจ ื‘ืžื”ืœืš ื—ื™ื™ื•
-v "$PWD":/home/gradle/ - ืžืขืœื” ืืช ื”ืชื™ืงื™ื” ื”ื ื•ื›ื—ื™ืช ืขื ืคืจื•ื™ืงื˜ ื”ืื ื“ืจื•ืื™ื“ ืฉืœื ื• ืœืชื™ืงื™ื™ืช ื”ืžื›ื•ืœื” ื”ืคื ื™ืžื™ืช /home/gradle/
-w /home/gradle - ืžืฆื™ื™ืŸ ืืช ืกืคืจื™ื™ืช ื”ืขื‘ื•ื“ื” ืฉืœ ื”ืžื™ื›ืœ
android-build:5.4.1-28-27 - ืฉื ื”ืžื™ื›ืœ ืฉืœื ื• ืฉืืกืคื ื•
gradle assembleDebug - ืฆื•ื•ืช ื”ื”ืจื›ื‘ื” ื‘ืคื•ืขืœ ืฉืžืจื›ื™ื‘ ืืช ื”ืคืจื•ื™ืงื˜ ืฉืœื ื•

ืื ื”ื›ืœ ื™ืœืš ื›ืฉื•ืจื”, ืชื•ืš ื›ืžื” ืฉื ื™ื•ืช/ื“ืงื•ืช ืชืจืื” ืขืœ ื”ืžืกืš ืžืฉื”ื• ื›ืžื• ื‘ื ื™ื™ื” ืžื•ืฆืœื—ืช ื‘-8 ืžื˜ืจ 3 ืฉื ื™ื•ืช! ื•ื”ืชื™ืงื™ื” app/build/output/apk ืชื›ื™ืœ ืืช ื”ืืคืœื™ืงืฆื™ื” ื”ืžื•ืจื›ื‘ืช.

ื ื™ืชืŸ ืœื‘ืฆืข ืžืฉื™ืžื•ืช ืžื“ื•ืจื’ื•ืช ืื—ืจื•ืช ื‘ืฆื•ืจื” ื“ื•ืžื” - ืœื‘ื“ื•ืง ืืช ื”ืคืจื•ื™ืงื˜, ืœื”ืคืขื™ืœ ื‘ื“ื™ืงื•ืช ื•ื›ื•'. ื”ื™ืชืจื•ืŸ ื”ืขื™ืงืจื™ ื”ื•ื ืฉืื ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื‘ื ื•ืช ืืช ื”ืคืจื•ื™ืงื˜ ืขืœ ื›ืœ ืžื›ื•ื ื” ืื—ืจืช, ืื ื—ื ื• ืœื ืฆืจื™ื›ื™ื ืœื“ืื•ื’ ืœื”ืชืงื ืช ื”ืกื‘ื™ื‘ื” ื›ื•ืœื” ื•ื–ื” ื™ืกืคื™ืง ืœื”ื•ืจื™ื“ ืืช ื”ืชืžื•ื ื” ื”ื“ืจื•ืฉื” ื•ืœื”ืคืขื™ืœ ื‘ื” ืืช ื”-build.

ื”ืงื•ื ื˜ื™ื™ื ืจ ืœื ืื•ื’ืจ ืฉื™ื ื•ื™ื™ื, ื•ื›ืœ ืืกืžื‘ืœื™ ืžื•ืคืขืœ ืžืืคืก, ืžื” ืฉืžืฆื“ ืื—ื“ ืžื‘ื˜ื™ื— ืืช ื–ื”ื•ืช ื”ื”ืจื›ื‘ื” ืœืœื ืงืฉืจ ืœืžืงื•ื ื”ืฉืงืชื•, ืžืฆื“ ืฉื ื™, ื‘ื›ืœ ืคืขื ืฆืจื™ืš ืœื”ื•ืจื™ื“ ืืช ื›ืœ ื”ืชืœื•ืช ื•ืœื”ืจื›ื™ื‘ ืืช ื›ืœ ื”ืงื•ื“ ืฉื•ื‘, ื•ืœืคืขืžื™ื ื–ื” ื™ื›ื•ืœ ืœืงื—ืช ื–ืžืŸ ืžืฉืžืขื•ืชื™. ืœื›ืŸ, ื‘ื ื•ืกืฃ ืœื”ืชื—ืœื” ื”"ืงืจื”" ื”ืจื’ื™ืœื”, ื™ืฉ ืœื ื• ืืคืฉืจื•ืช ืœื”ืชื—ื™ืœ ืืช ื”ื‘ื ื™ื™ื” ืชื•ืš ืฉืžื™ืจืช ืžื” ืฉื ืงืจื. "cache", ืฉื‘ื• ืื ื• ืฉื•ืžืจื™ื ืืช ื”ืชื™ืงื™ื” ~/.gradle ืคืฉื•ื˜ ืขืœ ื™ื“ื™ ื”ืขืชืงื” ืœืชื™ืงื™ื™ืช ื”ืขื‘ื•ื“ื” ืฉืœ ื”ืคืจื•ื™ืงื˜, ื•ื‘ืชื—ื™ืœืช ื”-build ื”ื‘ื ื ื—ื–ื™ืจ ืื•ืชื” ื‘ื—ื–ืจื”. ื”ืขื‘ืจื ื• ืืช ื›ืœ ื”ืœื™ื›ื™ ื”ื”ืขืชืงื” ืœืกืงืจื™ืคื˜ื™ื ื ืคืจื“ื™ื ื•ืคืงื•ื“ืช ื”ื”ืฉืงื” ืขืฆืžื” ื”ื—ืœื” ืœื”ื™ืจืื•ืช ื›ืš

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 ื“ืงื•ืช).

ื›ืœ ื–ื”, ื›ืžื•ื‘ืŸ, ื”ื’ื™ื•ื ื™ ืจืง ืื ื™ืฉ ืœืš ืฉืจืช CI/CD ืคื ื™ืžื™ ืžืฉืœืš, ืฉื‘ื• ืืชื” ืชื•ืžืš ื‘ืขืฆืžืš. ืื‘ืœ ืขื›ืฉื™ื• ื™ืฉ ื”ืจื‘ื” ืฉื™ืจื•ืชื™ ืขื ืŸ ืฉื‘ื”ื ื›ืœ ื”ื‘ืขื™ื•ืช ื”ืืœื” ื ืคืชืจื•ืช ื•ืืชื” ืœื ืฆืจื™ืš ืœื“ืื•ื’ ืœื’ื‘ื™ ื–ื”, ื•ื ื™ืชืŸ ืœืฆื™ื™ืŸ ืืช ืžืืคื™ื™ื ื™ ื”ื”ืจื›ื‘ื” ื”ื“ืจื•ืฉื™ื ื’ื ื‘ื”ื’ื“ืจื•ืช ื”ืคืจื•ื™ืงื˜.

ืจืง ืžืฉืชืžืฉื™ื ืจืฉื•ืžื™ื ื™ื›ื•ืœื™ื ืœื”ืฉืชืชืฃ ื‘ืกืงืจ. ืœื”ืชื—ื‘ืจื‘ื‘ืงืฉื”.

ื”ืื ืืชื” ืฉื•ืžืจ ืืช ืžืขืจื›ืช ื”-CI/CD ืฉืœืš ื‘ื‘ื™ืช ืื• ืžืฉืชืžืฉ ื‘ืฉื™ืจื•ืช ืฉืœ ืฆื“ ืฉืœื™ืฉื™?

  • ืื ื• ืžืฉืชืžืฉื™ื ื‘ืฉืจืช ืคื ื™ืžื™

  • ืื ื• ืžืฉืชืžืฉื™ื ื‘ืฉื™ืจื•ืช ื—ื™ืฆื•ื ื™

  • ืื ื—ื ื• ืœื ืžืฉืชืžืฉื™ื ื‘-CI/CD

  • ืื—ืจ

42 ืžืฉืชืžืฉื™ื ื”ืฆื‘ื™ืขื•. 16 ืžืฉืชืžืฉื™ื ื ืžื ืขื•.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”