์๋๋ก์ด๋ ์ธ๋ถ ํ๊ฒฝ๊ณผ ์ฐ๋ํ๋ ํ๋ก์ ํธ๋ฅผ ์งํํ๊ณ ์๋ค. ์๋๋ก์ด๋์ ์ฐ๊ณ๋ ๋ถ๋ถ์ ํ ์คํธ๋ฅผ ํ๋ ค๋ฉด ๋งค๋ฒ ์๋ก ๋น๋ ๋ฐ์ ํ ์คํธ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์ ์ค์นํด์ผ ํ๋๋ฐ ๋งค๋ฒ ์ค์น๋ฅผ ์์ฒญํ๋ ๊ฒ๋, ๋งค๋ฒ ์ฐ๊ฒฐํด์ ์ค์นํ๋ ๊ฒ๋ ์๋นํ ๋นํจ์จ์ ์ด๋ผ๋ ์๊ฐ์ด ๋ค์๋ค. Github Actions๋ก buildํ์ฌ artifacts๋ก ๋ฝ์๋ณธ ๊ฒฝํ์ด ์์๊ธฐ์, gitlab์ ๋น์ทํ ๊ธฐ๋ฅ์ธ gitlab pipeline์ ์ฌ์ฉํ๋ฉด ๋์ง์์๊น? ๋ผ๋ ์๊ฐ์ผ๋ก ์ด๋ฒ์ ๋์ ํด๋ดค๋ค.
์ด๋ฒ์ ํด๋ณผ ๊ฒ์ gitlab-pipeline์ผ๋ก ์๋๋ก์ด๋ ํ๋ก์ ํธ๋ฅผ build ํด์, artifacts๋ก debug apk๋ฅผ ์ถ์ถํ๋ ๊ฒ์ด๋ค.
Windows์์ ๋ก์ปฌ ํ๊ฒฝ Gitlab-Runner ์ด๊ธฐ ์ธํ ํ๊ธฐ
์ฌ์ฉํ๊ธฐ ์ฌ์ด ํ๊ฒฝ์ ์ํด์ Docker์ Docker-Compose๋ฅผ ์ฌ์ฉํด gitlab-runner๋ฅผ ์ค์นํ ๊ฒ์ด๋ค. docker-desktop์ ๋จผ์ ์ค์นํ๋ฉด ๋๋ค.
docker์ ์๋ terminal์ ์ฌ์ฉํ ๊ฑด๋ฐ, ๋ฆฌ๋ ์ค ๋ช ๋ น์ด๊ฐ ๋์ํ๋ mingw64๋ฅผ ์ฐ๊ฑฐ๋, wsl2 ํ๊ฒฝ์์ ์งํํ๋ฉด ๋๋ค.
# ๋ก์ปฌ ํ๊ฒฝ์ ๋๋ ํ ๋ฆฌ ๋ง๋ค๊ธฐ
๋จผ์ C๋๋ผ์ด๋ธ๋, ์ ๊ทผํ๊ธฐ ์ฌ์ด ์์น์ gitlab runner ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ค๋ค.
mkdir gitlab-runner
cd gitlab-runner
์ด์ ์ฌ๊ธฐ๊ฐ gitlab-runner ์๋น์ค๊ฐ ์์นํ ๊ณณ์ด๋ค.
vscode๋ ๋ค๋ฅธ ์๋ํฐ๋ก ํด๋น ๋๋ ํ ๋ฆฌ์์ docker-compose.yml์ ๋ง๋ค์ด์ค๋ค. ๋ด์ฉ์ ์๋์ ๊ฐ์ด ํ๋ฉด ๋๋ค.
version: "3"
services:
gitlab-runner:
container_name: gitlab-runner
image: 'gitlab/gitlab-runner:latest'
restart: always
volumes:
- './config:/etc/gitlab-runner'
- '/var/run/docker.sock:/var/run/docker.sock'
์ต์ ๋ฒ์ ์ gitlab-runner๊ฐ ์ค์น๋๋ compose ํ์ผ์ ๋ง๋ ๋ค. ์์์ ๋ถํฐ ์ญ ๋ณด์.
Docker Compose ๋ฒ์ ์ 3์ผ๋ก ์ง์ ํ๊ณ , gitlab-runner๋ผ๋ ์ด๋ฆ์ ์ปจํ
์ด๋๋ฅผ ๋ง๋ค์ด์ ์๋น์ค๋ก ๋ฑ๋กํ๋ค. ์ปจํ
์ด๋์ ์ฌ์ฉ๋ ์ด๋ฏธ์ง๋ gitlab-runner ์ต์ ๋ฒ์ ์ด๊ณ , ์ปจํ
์ด๋๊ฐ ์ค์ง๋ ๋(PC ์ข
๋ฃ์ ๊ฐ์ ๊ฒฝ์ฐ) ์ฌ์์ ์ต์
์ ๊ฑธ๊ณ ์ปจํ
์ด๋์ ๋ณผ๋ฅจ๋ง์ดํธ ๊น์ง ์ ์ํด์คฌ๋ค. ๋ณผ๋ฅจ๋ง์ดํธ ์๋ฏธ๋ ์๋์ ๊ฐ๋ค.
`./config:/etc/gitlab-runner`: ํ์ฌ ๋๋ ํ ๋ฆฌ์ config ํด๋๋ฅผ ์ปจํ
์ด๋์ /etc/gitlab-runner์ ๋ง์ดํธํ๋ค.
`/var/run/docker.sock:/var/run/docker.sock`: ํธ์คํธ์ Docker ์์ผ์ ์ปจํ
์ด๋ ๋ด๋ถ๋ก ๋ง์ดํธํ๋ค. ์ด๋ฌ๋ฉด gitlab runnner๊ฐ ํธ์คํธ docker-daemon์ ์จ์ docker in docker ํ๊ฒฝ์ด ๊ตฌ์ฑ๋๋๋ฐ, ์ด๋ฌ๋ฉด ์ปจํ
์ด๋ ๋ด๋ถ์์ ํธ์คํธ์ ๋์ปค ์์ง์ ์ฌ์ฉํ ์ ์๊ณ ํธ์คํธ์ ์ด๋ฏธ์ง ์บ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฏ๋ก ์ข ๋ ํจ์จ์ ์ธ ๊ตฌ์ฑ์ด ๊ฐ๋ฅํด์ง๋ค.
์ปดํฌ์ฆ ํ์ผ์ ์คํ์์ผ์ ์ปจํ ์ด๋๋ฅผ ๋ง๋ค๋ฉด ๋๋ค.
docker compose up -d
Gitlab-Runner ๋ฑ๋กํ๊ธฐ
gitlab ํ๋ก์ ํธ๋ก ๊ฐ์, runner๋ฅผ ๋ง๋ค์ด์ค์ผํ๋ค.
CI/CD์ธํ ์ผ๋ก ๊ฐ์ runner๋ฅผ ๋ง๋ค์ด์ค๋ค.
tag๋ฅผ ์ง์ ํด์ฃผ๊ณ , unstaged jobs๋ ์ฒดํฌํด์ ํ๊ทธ๊ฐ ์ง์ ์๋ ci ์์ ๋ ๋์๊ฐ๊ฒ ๋ง๋ค์๋ค.
๊ทธ๋ฌ๋ฉด gitlab-runner ๋ฑ๋ก ์ฝ๋๊ฐ ๋์ค๋๋ฐ, ์ด๊ฑธ ๋์ปค๋ก ๋ง๋ ์ปจํ ์ด๋์ ์ง์ ํด์ค ๊ฒ์ด๋ค.
docker-compose exec gitlab-runner bash
docker-compose exec๋ ์ด๋ฏธ ์คํ ์ค์ธ gitlab-runnner ์ปจํ ์ด๋ ๋ด๋ถ์์ ์ ๋ช ๋ น์ ์คํํ๋ผ๋ ์๋ฏธ์ด๋ค. bash ์ ธ์ ์ด๊ฒ ๋ค๋ ์๋ฏธ๋ก ์ฌ๊ธฐ์ ์ gitlab-runner register๋ฅผ ๋ฑ๋กํด์ผ ๋์ปค์ ์ฌ๋ผ๊ฐ ์ปจํ ์ด๋๊ฐ ๊น๋ฉ ์ปจํ ์ด๋์ ์ญํ ์ ์ํํ ์ ์๊ฒ๋๋ค.
# gitlab-runner ์ปจํ
์ด๋ ์์ shell์ด๋ค.
gitlab-runner register --url gitlab ์๋ฒ ์ฃผ์ --token ์๊น ์๋ ํ ํฐ ๊ฐ
์๊น ๋ช ๋ น์ด๋ฅผ ๋ณต์ฌํด์ ๊ทธ๋๋ก ๋ถ์ฌ ์คํํ๋ฉด ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ญ๋ผ๋ญ๋ผ ๋์ค๋๋ฐ, executer ๋ฅผ `docker`, docker image๋ฅผ `alpine:latest` ๋ก ์ค์ ํ๋ ์ด์ธ์๋ ๋ค enter ์ณ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ฃ์ด๋ ๋๋ค.
Android CI ํ์ผ ์์ฑํ๊ธฐ
์ฒ์์๋ ๊ตฌ๋ ์ค์ธ ํด๋ก๋๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ ๋๋ฌธ์๋ต๋ง ๋์์ ๊ทธ๋ฅ gitlab ๊ณต์ ์์ ๋ฅผ ์ฌ์ฉํ๋ค.
lib/gitlab/ci/templates/Android.latest.gitlab-ci.yml · master · GitLab.org / GitLab · GitLab
GitLab is an open source end-to-end software development platform with built-in version control, issue tracking, code review, CI/CD, and more. Self-host GitLab on your own servers, in a...
gitlab.com
์ด๊ฑฐ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ๊ณ , ์ต์ sdk์ธ 34์ ๋ง์ท๋ค.
๋จผ์ ํ๋ก์ ํธ์ ๋ฑ๋ก๋ `local.properties`๊ฐ๋ค์ Gitlab์๋ ์ธํ ํด์ค์ผํ๋ค.
CI/CD ํญ์ Variables์์ ์์ฑํ๋ฉด๋๋ค. ๋ค๋ง ๋์ ๊ฒฝ์ฐ์ฒ๋ผ Mask๋ฅผ ํ์ฑํ ํ ๊ฒฝ์ฐ, value์ ํฐ ๋ฐ์ดํ๋ฅผ ๋ฃ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฐ๊ฐ ymlํ์ผ ์์ฑํ ๋ ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผํ๋ค.
ํ์ดํ๋ผ์ธ ์ค์ ์ ๊ฐ์ ๋ชฉ์ ์ ๋ง๊ฒ ํด์ฃผ๋ฉด ๋๋ค. ๋๋ ๊ทธ๋ฅ root ๋๋ ํ ๋ฆฌ์ ์์น์์ผฐ๋ค.
์ด์ `.gitlab-ci.yml` ํ์ผ์ ์์ฑํ์. ํ์ดํ๋ผ์ธ ์๋ํฐ์์ ๋ฐ๋ก ํด๋ ๋๊ณ , ๋ก์ปฌPC์์ ์์ฑํด์ ์ฌ๋ ค๋ ๋๋ค.
image: eclipse-temurin:17-jdk-jammy
variables:
ANDROID_COMPILE_SDK: "34"
ANDROID_BUILD_TOOLS: "34.0.0"
ANDROID_SDK_TOOLS: "9477386"
SDK34๋ฅผ ์ฌ์ฉํ๊ณ , gradle ๋ฒ์ ์ด 8.7์ด๋ผ์ jdk๋ฒ์ ๋ 11์ด ์๋ 17๋ก ์ฌ๋ ค์ ์ฌ์ฉํ๋ค.
script๋ฅผ ์์ฑํ๊ธฐ ์ ์ ํ๋ก์ ํธ repository๋ฅผ ๋ณด๋ฉด, Android ํด๋๊ฐ ๋ฐ๋ก ์กด์ฌํ๋ค. ์ฆ build๋ฅผ ์ ํด๋๋ก ๋ค์ด๊ฐ์ ์งํํด์ผํ๋ค๋ ์๋ฏธ๊ฐ ๋๋ค. ๊ทธ๋์ before_script์ `cd Drtaa-Android`๊ฐ ์กด์ฌํ๋ค.
before_script:
- cd Drtaa-Android
- apt-get --quiet update --yes
- apt-get --quiet install --yes wget unzip
- export ANDROID_HOME="${PWD}/android-sdk-root"
- install -d $ANDROID_HOME
- wget --no-verbose --output-document=$ANDROID_HOME/cmdline-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS}_latest.zip
- unzip -q -d "$ANDROID_HOME/cmdline-tools" "$ANDROID_HOME/cmdline-tools.zip"
- mv -T "$ANDROID_HOME/cmdline-tools/cmdline-tools" "$ANDROID_HOME/cmdline-tools/tools"
- export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/cmdline-tools/tools/bin
- sdkmanager --version
- yes | sdkmanager --licenses > /dev/null || true
- sdkmanager "platforms;android-${ANDROID_COMPILE_SDK}"
- sdkmanager "platform-tools"
- sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}"
- chmod +x ./gradlew
๋๋จธ์ง๋ ์์์ ์ ํ ๋ด์ฉ๊ณผ ๋์ผํ๋ค. ์ด์ ๋ฌธ์ ๋ variable์ ์ ์ด๋ ๋ณ์๋ค์ ๊ฐ์ ธ์์ ๋ฃ์ด์ค์ผ ํ๋ค๋ ์ ์ด๋ค. ์๊ทธ๋ฌ๋ฉด BuildConfig๋ก ์ค์ ํด๋ ๊ฐ์ด ๋ค ์ค๋ฅ๋๋ค.
์ด๋ฒ ํ๋ก์ ํธ์์๋ keystore๋ฅผ ์ฌ์ฉํ์ง์๊ณ local.properties์์ ํค๋ค์ ๊ด๋ฆฌํ๊ณ ์๊ธฐ ๋๋ฌธ์ local.properties ํ์ผ์ ๋ง๋ค์ด์ ๊ฑฐ๊ธฐ์ ๊ฐ์ ์จ์ฃผ๋ ๋ฐฉ์์ ์ฑํํ๋ค.
- echo "sdk.dir=$ANDROID_SDK_ROOT" > local.properties
- echo "NAVER_MAP_CLIENT_ID=\"$NAVER_MAP_CLIENT_ID\"" >> local.properties
- echo "NAVER_MAP_CLIENT_ID_MANIFEST=$NAVER_MAP_CLIENT_ID_MANIFEST" >> local.properties
- echo "NAVER_MAP_CLIENT_SECRET=\"$NAVER_MAP_CLIENT_SECRET\"" >> local.properties
- echo "NAVER_CLIENT_ID=\"$NAVER_CLIENT_ID\"" >> local.properties
- echo "NAVER_CLIENT_SECRET=\"$NAVER_CLIENT_SECRET\"" >> local.properties
- echo "GOOGLE_LOGIN_CLIENT_ID=\"$GOOGLE_LOGIN_CLIENT_ID\"" >> local.properties
- echo "TOUR_API_KEY=\"$TOUR_API_KEY\"" >> local.properties
- echo "BASE_URL=\"$BASE_URL\"" >> local.properties
- echo "MQTT_URL=\"$MQTT_URL\"" >> local.properties
- echo "BOOTPAY_APP_ID=\"$BOOTPAY_APP_ID\"" >> local.properties
์ด์ค์ผ์ดํ ์ฒ๋ฆฌํด๋ ๊ฐ๋ค์ kotlin ์ฝ๋์์ ์ฌ์ฉ๋๋ ๊ฐ๋ค์ด๋ค. ๋ด ์ฝ๋์ ๊ฒฝ์ฐ buildConfig์ ์ฌ์ฉ๋๋ ๊ฐ๋ค์ด `" " `๋ก ๊ฐ์ธ์ ธ์์ง์์ผ๋ฉด gradle์์ ์ฝ์ด์ฌ ๋ ์๋ฌ๊ฐ ๋๋ค. ์๊น variable์ ๋ฃ์ด์ค๋ mask๋ฅผ ํ์ฑํ ํด๋ฌ์ ํฐ ๋ฐ์ดํ๋ฅผ ๋ชป์ฐ๊ธฐ ๋๋ฌธ์ด ์ด๋ ๊ฒ ์ฒ๋ฆฌํด์คฌ๋ค.
์ด ๊ณผ์ ์ ๊ฑฐ์น๋ฉด buildํ ๋๋ `local.properties`๋ฅผ ์์ฑํ ํจ๊ณผ๊ฐ ๋ํ๋๋ค.
์ด์ job์ ์ค์ ํ๋ฉด ๋๋ค. ๋ด๊ฐ ํ ์์ ์ด assembleDebug๋ผ์, ์ด๋ฆ๋ ๋๊ฐ์ด ๋ฃ์ด์คฌ๋ค.
assembleDebug:
interruptible: true
stage: build
script:
- ./gradlew assembleDebug
artifacts:
paths:
- Drtaa-Android/app/build/outputs/apk/debug/app-debug.apk
- Drtaa-Android/app/build/outputs/logs/
expire_in: 1 week
interruptible๋ฅผ true๋ก ์ผ์ ์๋ก์ด ์ปค๋ฐ์ด ๋ค์ด์ค๋ฉด ํ์ฌ ์คํ ์ค์ธ job์ ์ค๋จํ๊ณ ์ job์ ์์ํ๋๋กํ๋ค.
stage: build: ์ด job์ด 'build' ๋จ๊ณ์์ ์คํ๋จ์ ๋ํ๋
๋๋ค. CI/CD ํ์ดํ๋ผ์ธ์ ์ฌ๋ฌ ๋จ๊ณ ์ค ํ๋์
๋๋ค.
script์๋ before_script๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํ๋ ๋ช
๋ น์ด๋ฅผ ์ ์ํ๋ ๊ณณ์ด๋ค. ์ง๊ธ์ assembleDebug๋ง ์์ง๋ง, detekt๊ฐ์ ๊ฑธ ์๋ํ ์๋ ์๋ค.
artifacts์๋ ์ด job์ด ์๋ฃ๋ ํ ๋ณด์กดํ ํ์ผ๋ค์ ์ ์ํด์ฃผ๋๋ฐ, ์ paths ์ ์ ํ ๊ฒฝ๋ก์ ๋ค์ด๊ฐ์ ํ์ผ์ ๊ธ์ด์จ๋ค. ๋๋ ์๋๋ก์ด๋ ํ๋ก์ ํธ ์์ ๋ค์ด๊ฐ์ผ ๋๋ฏ๋ก `Drtaa-Android/`๋ฅผ ๋ฃ์ด์ ๊ฒฝ๋ก๋ฅผ ํ์คํ๊ฒ ์ง์ ํด์ผํ๋ค. ํ๋ก์ ํธ ์ ์ฒด artifacts ์ฉ๋์ด 1GB๋ผ์ ๋ณด์กด๊ธฐ๊ฐ์ ์ผ์ฃผ์ผ๋ก ๋ช
์ํด๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๊ธฐ์กด ๋ชฉ์ ์ด์๋ ์ํฐํฉํธ๋ฅผ ๋ฝ๋ ๊ณผ์ ์ด ์์ฑ๋๋ค. ๋ฌธ์ ๋ ๋ค๋ฅธ ํด๋์์ ์์ ํ์ฌ develop์ด ์ ๋ฐ์ดํธ ๋ ๋๋ ์ด pipeline์ด ๋์๊ฐ๋ค๋ ์ ์ด๋ค. github actions์์๋ workflow๋ฅผ ์ค์ ํด์ ์ด๊ฑธ ๋ง์ ์ ์์๋๋ฐ, ์ฌ๊ธฐ์๋ only ์ต์ ์ผ๋ก ๋๋ฆด ์ ์๋ค. gitlab์๋ workflow๊ฐ ์์ด์ stage๋ณ ์ ์ด์กฐ๊ฑด์ ๊ฑธ ์ ์๋๋ฐ ์ด๊ฑด ๋์ค์ ํ์ธํ์.
https://docs.gitlab.com/ee/ci/yaml/#workflow
CI/CD YAML syntax reference | GitLab
GitLab product documentation.
docs.gitlab.com
.android_changes: &android_changes
only:
changes:
- Drtaa-Android/**/*
assembleDebug:
<<: *android_changes
interruptible: true
stage: build
script:
- ./gradlew assembleDebug
artifacts:
paths:
- Drtaa-Android/app/build/outputs/apk/debug/app-debug.apk
- Drtaa-Android/app/build/outputs/logs/
expire_in: 1 week
์ต์ปค๋ฅผ ์์ฑํด์ฃผ๊ณ , ์๋๋ก์ด๋ ํด๋์์ ๋ณํ๊ฐ ์์ ๋๋ง assembleDebug Job์ ๋์๊ฐ๊ฒ ํ๋ค. ์ด๋ฌ๋ฉด ๋ค๋ฅธ ํด๋์์ ์์ ํ ๊ฑด assembleDebug Job์ ์คํ์ํค์ง์๋๋ค!
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์!
'Android ๐ฅ๏ธ > CI,CD๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Github Actions๋ก Android CI ์ ๋ฌธํ๊ธฐ - ๋น๋ ์๋ํ, apk ์ถ์ถ (0) | 2024.07.13 |
---|