์์๋ํ๊ต ๋์๋ฆฌ ์ฐํฉํ ๊ณต์ ํ๋ซํผ
๋๊ตฌ๋ผ๋ฏธ๋ ์์๋ํ๊ต ๋์๋ฆฌ ์ฐํฉํ์ ๊ณต์ ํ๋ซํผ์ผ๋ก, ๋ชจ๋ ๋์๋ฆฌ ์ ๋ณด๋ฅผ ์ ์ฐํํ์ฌ ํจ์จ์ ์ธ ๊ด๋ฆฌ์ ํ๋ณด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ํ์๋ค์ ์์ฝ๊ฒ ๋์๋ฆฌ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๊ณ , ๋์๋ฆฌ๋ ๋ณ๋ ํ๋ณด ์์ด๋ ์ ์ ํ์์ ๋ชจ์งํ ์ ์์ต๋๋ค.
์ด ํ๋ซํผ์ Flutter๋ก ๊ฐ๋ฐ๋ ํฌ๋ก์ค ํ๋ซํผ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก, ์น, iOS, Android ํ๊ฒฝ์์ ๋์ํฉ๋๋ค. ์ฌ์ฉ์๋ ๋์๋ฆฌ๋ฅผ ํ์ํ๊ณ , ์ง์์๋ฅผ ์์ฑ ๋ฐ ์ ์ถํ๋ฉฐ, ์ง์ ํํฉ์ ์ค์๊ฐ์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค. ๋ํ, ์๋ฆผ ์๋น์ค๋ฅผ ํตํด ๋์๋ฆฌ ํฉ๊ฒฉ ์ฌ๋ถ ๋ฐ ์ค์ํ ์ ๋ณด๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
๐ ๋ ์์ธํ ํ๋ก์ ํธ ์ค๋ช ์ ํ๋ก์ ํธ ๊ฐ์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
| ์๋น์ค | ๋งํฌ | ์ค๋ช |
|---|---|---|
| ์ฌ์ฉ์ ์๋น์ค | donggurami.net | ๋์๋ฆฌ ํ์, ์ง์์ ์์ฑ/์ ์ถ |
| ๊ด๋ฆฌ์ ํ์ด์ง | admin.donggurami.net | ๋์๋ฆฌ ๊ด๋ฆฌ์์ฉ ๋์๋ณด๋ |
| ํ๋ซํผ | ๋ค์ด๋ก๋ | ์ํ |
|---|---|---|
| iOS | App Store | ์ด์ ์ค |
| Android | Google Play | ์ด์ ์ค |
๐ก ์น๊ณผ ์ฑ ๋ชจ๋ ๋์ผํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์น์ ์ค์น ์์ด ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ์ฑ์ ํธ์ ์๋ฆผ ๋ฑ ๋ค์ดํฐ๋ธ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์์ต๋๋ค.
| ๊ธฐ๋ฅ | ์ค๋ช | ์น | iOS | Android |
|---|---|---|---|---|
| ๋์๋ฆฌ ํ์ | ๋ค์ํ ๋์๋ฆฌ๋ฅผ ํ์ํ๊ณ ์์ธ ์ ๋ณด ํ์ธ | O | O | O |
| ์ง์์ ์์ฑ/์ ์ถ | ์ ํํ ๋์๋ฆฌ์ ์ง์์ ์์ฑ ๋ฐ ์ ์ถ | O | O | O |
| ์ง์ ํํฉ ํ์ธ | ์ง์ํ ๋์๋ฆฌ์ ์ํ๋ฅผ ์ค์๊ฐ ํ์ธ | O | O | O |
| ํธ์ ์๋ฆผ | ํฉ๊ฒฉ ์ฌ๋ถ ๋ฐ ์ค์ ์๋ฆผ ์์ | - | O | O |
| ํ๋กํ ๊ด๋ฆฌ | ํ๋กํ ์ ๋ฐ์ดํธ ๋ฐ ๊ด๋ฆฌ | O | O | O |
์น ๋ฒ์
- ์ค์น ์์ด ๋ธ๋ผ์ฐ์ ์์ ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
- ๋ชจ๋ฐ์ผ/๋ฐ์คํฌํ ๋ฐ์ํ ์ง์
- ์ต์ ๊ธฐ๋ฅ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์
๋ชจ๋ฐ์ผ ์ฑ
- ๋ค์ดํฐ๋ธ ํธ์ ์๋ฆผ ์ง์
- ์คํ๋ผ์ธ ์บ์ ์ง์
- ์ฑ ์์ด์ฝ์ผ๋ก ๋น ๋ฅธ ์ ๊ทผ
- Flutter SDK (3.24.1 ์ด์)
- Dart SDK (3.5.1 ์ด์)
- IDE: VS Code ๋๋ Android Studio
ํ๋ก์ ํธ๋ฅผ ์คํํ๊ธฐ ์ ์ ์๋ ํ์ผ๋ค์ ์ค์ ํด์ผ ํฉ๋๋ค.
| ํ์ผ ๊ฒฝ๋ก | ์ค๋ช | ํ๋ ๋ฐฉ๋ฒ |
|---|---|---|
android/app/key.properties |
Android ์๋ช ํค ์ค์ | key.example.properties ๋ณต์ฌ ํ ์์ |
android/app/google-services.json |
Firebase Android ์ค์ | Firebase Console์์ ๋ค์ด๋ก๋ |
ios/Runner/GoogleService-Info.plist |
Firebase iOS ์ค์ | Firebase Console์์ ๋ค์ด๋ก๋ |
| ํ์ผ ๊ฒฝ๋ก | ์ค๋ช | ํ๋ ๋ฐฉ๋ฒ |
|---|---|---|
ios/fastlane/Appfile |
iOS ์ฑ ์ ๋ณด | ํ ๊ด๋ฆฌ์์๊ฒ ์์ฒญ |
ios/fastlane/Fastfile |
iOS ๋ฐฐํฌ ๋ ์ธ | ํ ๊ด๋ฆฌ์์๊ฒ ์์ฒญ |
ios/fastlane/Matchfile |
Match ์ธ์ฆ์ ์ค์ | ์ ์ฅ์์ ํฌํจ๋จ |
android/fastlane/Appfile |
Android ์ฑ ์ ๋ณด | ํ ๊ด๋ฆฌ์์๊ฒ ์์ฒญ |
android/fastlane/Fastfile |
Android ๋ฐฐํฌ ๋ ์ธ | ํ ๊ด๋ฆฌ์์๊ฒ ์์ฒญ |
android/app/service-account.json |
Play Store ์๋น์ค ๊ณ์ | Google Cloud Console์์ ์์ฑ |
# 1. ์์ ํ์ผ ๋ณต์ฌ
cp android/app/key.example.properties android/app/key.properties
# 2. key.properties ํ์ผ ํธ์ง
# storePassword, keyPassword, keyAlias, storeFile ๊ฐ์ ์
๋ ฅkey.properties ํ์:
storePassword=your_store_password
keyPassword=your_key_password
keyAlias=your_key_alias
storeFile=/absolute/path/to/keystore.jks- Firebase Console์์ ํ๋ก์ ํธ ์ ํ
- ํ๋ก์ ํธ ์ค์ โ ์ฑ ์ถ๊ฐ์์ ๊ฐ ํ๋ซํผ ์ค์ ํ์ผ ๋ค์ด๋ก๋
- ํด๋น ๊ฒฝ๋ก์ ํ์ผ ๋ฐฐ์น:
- Android:
android/app/google-services.json - iOS:
ios/Runner/GoogleService-Info.plist
- Android:
# 1. ์ ์ฅ์ ํด๋ก
git clone https://github.com/USW-Circle-Link/USW-Circle-Link-APP.git
cd USW-Circle-Link-APP
# 2. ์์กด์ฑ ์ค์น
flutter pub get
# 3. ์ฝ๋ ์์ฑ (Freezed, Retrofit ๋ฑ)
flutter pub run build_runner build# ๊ฐ๋ฐ ์๋ฒ ์คํ
flutter run -d chrome
# ํ๋ก๋์
๋น๋
flutter build web --release# iOS ์๋ฎฌ๋ ์ดํฐ์์ ์คํ
flutter run -d ios
# ํ๋ก๋์
๋น๋ (Xcode ํ์)
flutter build ios --release# Android ์๋ฎฌ๋ ์ดํฐ/๋๋ฐ์ด์ค์์ ์คํ
flutter run -d android
# APK ๋น๋
flutter build apk --release
# App Bundle ๋น๋ (Play Store ๋ฐฐํฌ์ฉ)
flutter build appbundle --release# ํ
์คํธ ์คํ
flutter test
# ์ฝ๋ ๋ถ์
flutter analyzeFastlane์ ์ด์ฉํ์ฌ iOS์ Android ์ฑ์ ์๋์ผ๋ก ๋ฐฐํฌํฉ๋๋ค.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๋ฐฐํฌ ํ๋ซํผ โ
โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ ์น โ iOS โ Android โ
โโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ GitHub Pages โ TestFlight โ Play Store Internal โ
โ (GitHub Actions)โ (Fastlane) โ (Fastlane) โ
โโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
iOS/Android ์ฑ ๋ฐฐํฌ(deploy_prod)๋ฅผ ์ํด์๋ Self-hosted macOS Runner๊ฐ ํ์ํฉ๋๋ค.
| ์ํฌํ๋ก์ฐ | Runner | ์ค๋ช |
|---|---|---|
| ์น ๋ฐฐํฌ | ubuntu-latest |
GitHub ์ ๊ณต Runner ์ฌ์ฉ |
| iOS/Android ๋ฐฐํฌ | self-hosted, macOS |
Self-hosted Runner ํ์ |
- GitHub ์ ์ฅ์ โ Settings โ Actions โ Runners
- "New self-hosted runner" ํด๋ฆญ
- macOS ์ ํ ํ ์๋ด์ ๋ฐ๋ผ ์ค์น
- Runner์ ๋ค์ ํ๊ฒฝ ๊ตฌ์ฑ:
- Xcode (์ต์ ๋ฒ์ )
- Flutter SDK
- Ruby & Bundler (Fastlane์ฉ)
- CocoaPods
# ์ํฌํ๋ก์ฐ ์์
jobs:
deploy_prod:
runs-on: [self-hosted, macOS]
steps:
- uses: actions/checkout@v4
# ...Fastlane Match๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฆ์์ ํ๋ก๋น์ ๋ ํ๋กํ์ผ์ ๊ด๋ฆฌํฉ๋๋ค.
cd ios
# TestFlight ๋ฐฐํฌ
fastlane release๋ฐฐํฌ ํ๋ก์ธ์ค:
- Match๋ก App Store ์ธ์ฆ์ ๊ฐ์ ธ์ค๊ธฐ
- CocoaPods ์์กด์ฑ ์ค์น
- Flutter iOS ๋น๋ (
flutter build ios --release) - Xcode ์ฝ๋ ์๋ช ์ค์
- IPA ๋น๋
- TestFlight ์ ๋ก๋
cd android
# Play Store Internal Track ๋ฐฐํฌ
fastlane deploy๋ฐฐํฌ ํ๋ก์ธ์ค:
- Flutter App Bundle ๋น๋ (
flutter build appbundle --release) - Play Store Internal Track ์ ๋ก๋
main ๋ธ๋์น์ ํธ์ํ๋ฉด GitHub Actions๊ฐ ์๋์ผ๋ก ๋ฐฐํฌํฉ๋๋ค.
# ์๋ ๋น๋
flutter build web --release --source-maps
# ๋ฐฐํฌ๋ GitHub Actions์์ ์๋ ์ํ
git push origin main๋ฐฐํฌ ํ๋ก์ธ์ค:
- Flutter ์น ๋น๋
- Sentry ์์ค๋งต ์ ๋ก๋
- GitHub Pages ๋ฐฐํฌ
| ๋ณ์๋ช | ์ค๋ช |
|---|---|
MATCH_PASSWORD |
Match ์ธ์ฆ์ ์ํธํ ๋น๋ฐ๋ฒํธ |
FASTLANE_TEAM_ID |
Apple Developer Team ID |
FASTLANE_USER |
Apple ID |
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD |
์ฑ ์ ์ฉ ๋น๋ฐ๋ฒํธ |
| ๋ณ์๋ช | ์ค๋ช |
|---|---|
PLAY_STORE_JSON_KEY |
Google Play Console ์๋น์ค ๊ณ์ JSON |
ANDROID_KEYSTORE_BASE64 |
์๋ช ํค์คํ ์ด (Base64 ์ธ์ฝ๋ฉ) |
ANDROID_KEY_ALIAS |
ํค ๋ณ์นญ |
ANDROID_KEY_PASSWORD |
ํค ๋น๋ฐ๋ฒํธ |
ANDROID_STORE_PASSWORD |
ํค์คํ ์ด ๋น๋ฐ๋ฒํธ |