Docker ์ปจํ…Œ์ด๋„ˆ์—์„œ Android ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ

Android ํ”Œ๋žซํผ์šฉ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ๊ฐ€์žฅ ์ž‘์€ ํ”„๋กœ์ ํŠธ๋ผ๋„ ์กฐ๋งŒ๊ฐ„ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Android SDK ์™ธ์—๋„ ์ตœ์‹  ๋ฒ„์ „์˜ Kotlin, Gradle, platform-tools, build-tools๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ์ž์˜ ์ปดํ“จํ„ฐ์—์„œ Android Studio IDE๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ข…์†์„ฑ์„ ๋” ๋งŽ์ด ํ•ด๊ฒฐํ•˜๋ฉด CI / CD ์„œ๋ฒ„์—์„œ ๊ฐ ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ณจ์นซ๊ฑฐ๋ฆฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์›น ๊ฐœ๋ฐœ์—์„œ Docker๊ฐ€ ํ™˜๊ฒฝ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ‘œ์ค€ ์†”๋ฃจ์…˜์ด ๋˜์—ˆ๋‹ค๋ฉด Android ๊ฐœ๋ฐœ์—์„œ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ?

Docker๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด-๋งค์šฐ ๊ฐ„๋‹จํ•˜๋‹ค๋ฉด ์ด๊ฒƒ์€ ์†Œ์œ„ ๋งŒ๋“œ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ํ™˜๊ฒฝ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์›ํ•˜๋Š” ๊ณณ์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ OS ์ปค๋„๊ณผ ํ•„์š”ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์„ธํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” "์ปจํ…Œ์ด๋„ˆ". ์šฐ๋ฆฌ ์ปจํ…Œ์ด๋„ˆ์— ์ •ํ™•ํžˆ ๋ฌด์—‡์ด ์žˆ์„์ง€๋Š” 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 ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋ฆ„๊ณผ ๋ฒ„์ „์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ์˜ ํƒœ๊ทธ ๋˜๋Š” ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๊ฒƒ์„ 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

๊ทธ๊ฒƒ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์•Œ์•„ ๋ด…์‹œ๋‹ค :

๋„์ปค ์‹คํ–‰ - ์ด๋ฏธ์ง€ ์‹œ์ž‘ ๋ช…๋ น ์ž์ฒด
-rm - ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค‘์ง€ํ•œ ํ›„ ์ˆ˜๋ช… ๋™์•ˆ ์ƒ์„ฑ๋œ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
-v "$PWD":/ํ™ˆ/gradle/ - Android ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š” ํ˜„์žฌ ํด๋”๋ฅผ ์ปจํ…Œ์ด๋„ˆ์˜ ๋‚ด๋ถ€ ํด๋” /home/gradle/์— ๋งˆ์šดํŠธํ•ฉ๋‹ˆ๋‹ค.
-w /ํ™ˆ/๊ทธ๋ ˆ์ด๋“ค - ์ปจํ…Œ์ด๋„ˆ์˜ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
์•ˆ๋“œ๋กœ์ด๋“œ ๋นŒ๋“œ:5.4.1-28-27 - ์ˆ˜์ง‘ํ•œ ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„
Gradle ์–ด์…ˆ๋ธ”๋ฆฌ๋””๋ฒ„๊ทธ - ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋นŒ๋“œ ํŒ€ ์ž์ฒด

๋ชจ๋“  ๊ฒƒ์ด ์ž˜๋˜๋ฉด ๋ช‡ ์ดˆ/๋ถ„ ํ›„์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 8๋ถ„ 3์ดˆ ๋งŒ์— ์„ฑ๊ณต์ ์ธ ๊ตฌ์ถ•! ๊ทธ๋ฆฌ๊ณ  app/build/output/apk ํด๋”์—๋Š” ์–ด์…ˆ๋ธ”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹ค๋ฅธ Gradle ์ž‘์—…(ํ”„๋กœ์ ํŠธ ํ™•์ธ, ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๋“ฑ)์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ์ด์ ์€ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ „์ฒด ํ™˜๊ฒฝ ์„ค์น˜์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ํ•„์š”ํ•œ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ฐ ์–ด์…ˆ๋ธ”๋ฆฌ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ํ•œํŽธ์œผ๋กœ๋Š” ์‹œ์ž‘ ์œ„์น˜์— ๊ด€๊ณ„์—†์ด ์–ด์…ˆ๋ธ”๋ฆฌ์˜ ID๋ฅผ ๋ณด์žฅํ•˜๋Š” ๋ฐ˜๋ฉด, ๋ชจ๋“  ์ข…์†์„ฑ์„ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๋Š”๋ฐ, ๋•Œ๋•Œ๋กœ ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์ธ "์ฝœ๋“œ" ์‹œ์ž‘ ์™ธ์—๋„ ์†Œ์œ„ ์œ ์ง€ํ•˜๋ฉด์„œ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "cache", ์—ฌ๊ธฐ์„œ ~/.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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€