Android ํ๋ซํผ์ฉ ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐํ ๋ ๊ฐ์ฅ ์์ ํ๋ก์ ํธ๋ผ๋ ์กฐ๋ง๊ฐ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. Android SDK ์ธ์๋ ์ต์ ๋ฒ์ ์ Kotlin, Gradle, platform-tools, build-tools๊ฐ ํ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์์ ์ปดํจํฐ์์ Android Studio IDE๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๋ชจ๋ ์ข
์์ฑ์ ๋ ๋ง์ด ํด๊ฒฐํ๋ฉด CI / CD ์๋ฒ์์ ๊ฐ ์
๋ฐ์ดํธ๊ฐ ๊ณจ์นซ๊ฑฐ๋ฆฌ๊ฐ ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์น ๊ฐ๋ฐ์์ Docker๊ฐ ํ๊ฒฝ ๋ฌธ์ ์ ๋ํ ํ์ค ์๋ฃจ์
์ด ๋์๋ค๋ฉด Android ๊ฐ๋ฐ์์ ์ ์ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ์๋ํ์ง ์๊ฒ ์ต๋๊น?
Docker๊ฐ ๋ฌด์์ธ์ง ๋ชจ๋ฅด๋ ์ฌ๋๋ค์ ์ํด-๋งค์ฐ ๊ฐ๋จํ๋ค๋ฉด ์ด๊ฒ์ ์์ ๋ง๋๋ ๋๊ตฌ์
๋๋ค. ํ๊ฒฝ์ ์ ์งํ๋ฉด์ ์ํ๋ ๊ณณ์ ๋ฐฐ์นํ ์ ์๋ ์ต์ OS ์ปค๋๊ณผ ํ์ํ ์ํํธ์จ์ด ์ธํธ๋ฅผ ํฌํจํ๋ "์ปจํ
์ด๋". ์ฐ๋ฆฌ ์ปจํ
์ด๋์ ์ ํํ ๋ฌด์์ด ์์์ง๋ Dockerfile์์ ๊ฒฐ์ ๋๋ฉฐ, ๊ทธ๋ฐ ๋ค์ ์ด๋์์๋ ์์ํ ์ ์๊ณ ๋ฉฑ๋ฑ์ฑ ์์ฑ์ด ์๋ ์ด๋ฏธ์ง๋ก ์ด์
๋ธ๋ฉ๋๋ค.
Docker์ ์ค์น ํ๋ก์ธ์ค์ ๊ธฐ๋ณธ ์ฌํญ์ ๊ทธ์ ๋ฌธ์์ ์๋ฆ๋ต๊ฒ ์ค๋ช
๋์ด ์์ต๋๋ค.
# ะข.ะบ. ะพัะฝะพะฒะฝัะผ ะธะฝััััะผะตะฝัะพะผ ะดะปั ัะฑะพัะบะธ 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