From 3c7b2b518bf1745f4c39133bec0292c0e5a4e06b Mon Sep 17 00:00:00 2001 From: IKSEONGKU <127182222+IKSEONGKU@users.noreply.github.com> Date: Sat, 9 Aug 2025 01:00:52 +0900 Subject: [PATCH 1/6] =?UTF-8?q?[feat]:=20debug=20signingConfig=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + app/build.gradle.kts | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/.gitignore b/.gitignore index b7197f62..ab468b1e 100644 --- a/.gitignore +++ b/.gitignore @@ -168,3 +168,4 @@ fabric.properties ### AndroidStudio Patch ### !/gradle/wrapper/gradle-wrapper.jar +/app/debug/output-metadata.json diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 59256179..a547e230 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -32,6 +32,15 @@ android { } + signingConfigs { + getByName("debug") { + keyAlias = properties["SIGNED_KEY_ALIAS"] as String? + keyPassword = properties["SIGNED_KEY_PASSWORD"] as String? + storeFile = properties["SIGNED_STORE_FILE"]?.let { file(it) } + storePassword = properties["SIGNED_STORE_PASSWORD"] as String? + } + } + buildTypes { release { isMinifyEnabled = false From ce4af6571341fce82aa33958e9b38b05402c0d76 Mon Sep 17 00:00:00 2001 From: IKSEONGKU <127182222+IKSEONGKU@users.noreply.github.com> Date: Sat, 9 Aug 2025 01:01:37 +0900 Subject: [PATCH 2/6] =?UTF-8?q?[ci]:=20Firebase=20App=20Distribution=20yml?= =?UTF-8?q?=20=ED=8C=8C=EC=9D=BC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../firebase-app-distribution-debug.yml | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/firebase-app-distribution-debug.yml diff --git a/.github/workflows/firebase-app-distribution-debug.yml b/.github/workflows/firebase-app-distribution-debug.yml new file mode 100644 index 00000000..24436368 --- /dev/null +++ b/.github/workflows/firebase-app-distribution-debug.yml @@ -0,0 +1,49 @@ +name: Build & upload to Firebase App Distribution + +on: + push: + branches: [ develop ] # dev 브런치에 push가 올 때 이벤트 트리거 + workflow_dispatch: # 수동 실행 옵션 (생략가능) + +jobs: + build: + runs-on: ubuntu-latest # 이후의 jobs들은 ubuntu의 최신버전에서 실행한다. + + env: + LOCAL_PROPERTIES_CONTENTS: ${{ secrets.LOCAL_PROPERTIES_CONTENTS }} # scerets에서 로컬 프로퍼티 값 변수(LOCAL_PROPERTIES_CONTENTS)로 설정 + GOOGLE_SERVICES_JSON: ${{ secrets.GOOGLE_SERVICES_JSON }} # scerets에서 구글 제이슨 값 변수(GOOGLE_SERVICES_JSON)로 설정 + + steps: + - uses: actions/checkout@v1 + + - name: set up JDK 17 # 깃허브 runner에서 돌아가는 환경은 java 17버전으로 설정한다. + uses: actions/setup-java@v1 + with: + java-version: 17 + + - name: Grant Permission for gradlew # gradlew 에 대한 퍼미션을 허용한다. + run: chmod +x ./gradlew + shell: bash + + - name: Decode And Save Keystore Base64 # app.keystoer.jks 키 값을 디코드 해서 app/ksystore.jks로 저장한다. (생략 가능) + run: | + echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 --decode > app/keystore.jks + + - name: Create google-services.json # 환경변수(GOOGLE_SERVICES_JSON) 값의 내용을 기반으로 `app/google-services.json`를 만든다. + run: echo "$GOOGLE_SERVICES_JSON" > app/google-services.json + + - name: Create local.properties # (LOCAL_PROPERTIES_CONTENTS)를 기반으로 local.properties를 만들고 keystore.jks 위치를 추가해 준다. + run: | + echo "$LOCAL_PROPERTIES_CONTENTS" > local.properties + echo "SIGNED_STORE_FILE=keystore.jks" >> local.properties # 생략가능 + + - name: Build debug # APK를 빌드한다. (디버그용) + run: ./gradlew assembleDebug + + - name: Upload to Firebase App Distribution # 파이어베이스에 앱 디스트리 뷰션에 배포한다. + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{secrets.FIREBASE_APP_ID}} + serviceCredentialsFileContent: ${{ secrets.CREDENTIAL_FILE_CONTENT }} + groups: ourmenu-tester + file: app/build/outputs/apk/debug/app-debug.apk \ No newline at end of file From c7e8b74cfa332b50bf714bb8104b61d91497b57e Mon Sep 17 00:00:00 2001 From: ikseong00 <127182222+ikseong00@users.noreply.github.com> Date: Wed, 13 Aug 2025 15:02:08 +0900 Subject: [PATCH 3/6] =?UTF-8?q?docs:=20Android=20Ci=20=EB=AC=B8=EC=84=9C?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1=20#74?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/android-ci.yml | 47 ++++++++++++++++++++++++++++++++ app/build.gradle.kts | 8 +++--- 2 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/android-ci.yml diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml new file mode 100644 index 00000000..ad85a55d --- /dev/null +++ b/.github/workflows/android-ci.yml @@ -0,0 +1,47 @@ +name: Android CI + +on: + push: # 코드 푸시 이벤트에 대한 설정 + branches: [ "develop" ] # "develop" 브랜치에 푸시될 때만 트리거된다. + pull_request: # 풀 리퀘스트 이벤트에 대한 설정 + branches: [ "develop" ] # "develop" 브랜치로의 풀 리퀘스트가 생성될 때만 트리거된다. + +jobs: # CI에서 수행할 작업을 정의한다. + ci-build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + cache: gradle + + - name: Cache Gradle packages + uses: actions/cache@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', '**/buildSrc/**/*.kt') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Generate local.properties + run: | + echo '${{ secrets.LOCAL_PROPERTIES }}' >> ./local.properties + + - name: Generate google-services.json + run: | + echo '${{ secrets.GOOGLE_SERVICES }}' >> ./app/google-services.json + +# - name: Code style checks +# run: | +# ./gradlew detekt + + - name: Run build + run: ./gradlew buildDebug --stacktrace + diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a547e230..36fdaffb 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -34,10 +34,10 @@ android { signingConfigs { getByName("debug") { - keyAlias = properties["SIGNED_KEY_ALIAS"] as String? - keyPassword = properties["SIGNED_KEY_PASSWORD"] as String? - storeFile = properties["SIGNED_STORE_FILE"]?.let { file(it) } - storePassword = properties["SIGNED_STORE_PASSWORD"] as String? + storeFile = file("$rootDir/debug.keystore") + storePassword = "android" + keyAlias = "androiddebugkey" + keyPassword = "android" } } From df17e8c691c4c44659e074513dfa116e49d39efb Mon Sep 17 00:00:00 2001 From: ikseong00 <127182222+ikseong00@users.noreply.github.com> Date: Wed, 13 Aug 2025 15:02:14 +0900 Subject: [PATCH 4/6] =?UTF-8?q?docs:=20Android=20CD=20=EB=AC=B8=EC=84=9C?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1=20#74?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../firebase-app-distribution-debug.yml | 68 +++++++++++-------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/.github/workflows/firebase-app-distribution-debug.yml b/.github/workflows/firebase-app-distribution-debug.yml index 24436368..3e93757b 100644 --- a/.github/workflows/firebase-app-distribution-debug.yml +++ b/.github/workflows/firebase-app-distribution-debug.yml @@ -2,48 +2,62 @@ name: Build & upload to Firebase App Distribution on: push: - branches: [ develop ] # dev 브런치에 push가 올 때 이벤트 트리거 - workflow_dispatch: # 수동 실행 옵션 (생략가능) + branches: + - main jobs: - build: - runs-on: ubuntu-latest # 이후의 jobs들은 ubuntu의 최신버전에서 실행한다. - - env: - LOCAL_PROPERTIES_CONTENTS: ${{ secrets.LOCAL_PROPERTIES_CONTENTS }} # scerets에서 로컬 프로퍼티 값 변수(LOCAL_PROPERTIES_CONTENTS)로 설정 - GOOGLE_SERVICES_JSON: ${{ secrets.GOOGLE_SERVICES_JSON }} # scerets에서 구글 제이슨 값 변수(GOOGLE_SERVICES_JSON)로 설정 + cd-build: + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 + + - name: set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' - - name: set up JDK 17 # 깃허브 runner에서 돌아가는 환경은 java 17버전으로 설정한다. - uses: actions/setup-java@v1 + - name: Cache Gradle packages + uses: actions/cache@v4 with: - java-version: 17 + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', '**/buildSrc/**/*.kt') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Grant execute permission for gradlew + run: chmod +x gradlew - - name: Grant Permission for gradlew # gradlew 에 대한 퍼미션을 허용한다. - run: chmod +x ./gradlew - shell: bash + - name: Prepare keystore dir + run: mkdir -p keystore - - name: Decode And Save Keystore Base64 # app.keystoer.jks 키 값을 디코드 해서 app/ksystore.jks로 저장한다. (생략 가능) + - name: Decode And Save Keystore Base64 run: | - echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 --decode > app/keystore.jks + echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > keystore/keystore.jks - - name: Create google-services.json # 환경변수(GOOGLE_SERVICES_JSON) 값의 내용을 기반으로 `app/google-services.json`를 만든다. - run: echo "$GOOGLE_SERVICES_JSON" > app/google-services.json + - name: Decode And Save Debug Keystore Base64 + run: | + echo "${{ secrets.DEBUG_KEYSTORE_BASE64 }}" | base64 -d > debug.keystore + + - name: Generate local.properties + run: | + echo '${{ secrets.LOCAL_PROPERTIES }}' >> ./local.properties - - name: Create local.properties # (LOCAL_PROPERTIES_CONTENTS)를 기반으로 local.properties를 만들고 keystore.jks 위치를 추가해 준다. + - name: Generate google-services.json run: | - echo "$LOCAL_PROPERTIES_CONTENTS" > local.properties - echo "SIGNED_STORE_FILE=keystore.jks" >> local.properties # 생략가능 + echo '${{ secrets.GOOGLE_SERVICES }}' >> ./app/google-services.json - - name: Build debug # APK를 빌드한다. (디버그용) + - name: Build debug APK run: ./gradlew assembleDebug - - name: Upload to Firebase App Distribution # 파이어베이스에 앱 디스트리 뷰션에 배포한다. + - name: Upload artifact to Firebase App Distribution uses: wzieba/Firebase-Distribution-Github-Action@v1 with: - appId: ${{secrets.FIREBASE_APP_ID}} + appId: ${{ secrets.FIREBASE_APP_ID }} serviceCredentialsFileContent: ${{ secrets.CREDENTIAL_FILE_CONTENT }} - groups: ourmenu-tester - file: app/build/outputs/apk/debug/app-debug.apk \ No newline at end of file + groups: testers + file: app/build/outputs/apk/debug/app-debug.apk +# releaseNotes: ${{ steps.firebase_release_note.outputs.notes }} \ No newline at end of file From fdf33a8506fad283b61d1810226f21f550f3158c Mon Sep 17 00:00:00 2001 From: ikseong00 <127182222+ikseong00@users.noreply.github.com> Date: Wed, 13 Aug 2025 15:08:09 +0900 Subject: [PATCH 5/6] =?UTF-8?q?feat:=20firebase=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=B6=94=EA=B0=80=20#74?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 6 ++++++ build.gradle.kts | 1 + gradle/libs.versions.toml | 6 ++++++ 3 files changed, 13 insertions(+) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 36fdaffb..2972c65b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -5,6 +5,7 @@ plugins { alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.compose) alias(libs.plugins.kotlin.serialization) + alias(libs.plugins.firebase.crashlytics) id("com.google.dagger.hilt.android") // Hilt 플러그인 추가 kotlin("kapt") // Hilt를 위한 kapt 추가 } @@ -113,6 +114,11 @@ dependencies { implementation(libs.coil.compose) implementation(libs.coil.network.okhttp) implementation(libs.coil.svg) + + // Firebase + implementation(platform(libs.firebase.bom)) + implementation(libs.firebase.crashlytics.ndk) + implementation(libs.firebase.analytics) } // Hilt를 사용할 때 필요한 Annotation Processor diff --git a/build.gradle.kts b/build.gradle.kts index 493c6f6f..464702a5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,4 +4,5 @@ plugins { alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.compose) apply false alias(libs.plugins.dagger.hilt) apply false + alias(libs.plugins.firebase.crashlytics) apply false } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7e37a3be..27d5355e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,6 +2,7 @@ agp = "8.7.3" coilCompose = "3.1.0" converterGson = "2.11.0" +firebaseBom = "34.1.0" hiltAndroid = "2.52" hiltNavigationCompose = "1.2.0" kotlin = "2.0.0" @@ -23,6 +24,7 @@ okhttp = "4.11.0" retrofitKotlinSerializationConverter = "1.0.0" datastorePreferences = "1.1.3" playServicesLocation = "21.3.0" +firebaseCrashlytics = "3.0.6" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -31,6 +33,9 @@ coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coilCo coil-svg = { module = "io.coil-kt.coil3:coil-svg", version.ref = "coilCompose" } coil-network-okhttp = { module = "io.coil-kt.coil3:coil-network-okhttp", version.ref = "coilCompose" } converter-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "converterGson" } +firebase-analytics = { module = "com.google.firebase:firebase-analytics" } +firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebaseBom" } +firebase-crashlytics-ndk = { module = "com.google.firebase:firebase-crashlytics-ndk" } hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hiltAndroid" } hilt-compiler = { module = "com.google.dagger:hilt-compiler", version.ref = "hiltAndroid" } junit = { group = "junit", name = "junit", version.ref = "junit" } @@ -66,3 +71,4 @@ kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", versi kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } dagger-hilt = { id = "com.google.dagger.hilt.android", version.ref = "hiltAndroid" } +firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebaseCrashlytics" } \ No newline at end of file From d9aa0076e663597414767cc3e4908bc9936e05f5 Mon Sep 17 00:00:00 2001 From: ikseong00 <127182222+ikseong00@users.noreply.github.com> Date: Wed, 13 Aug 2025 15:20:42 +0900 Subject: [PATCH 6/6] =?UTF-8?q?chore:=20=EC=BD=94=EB=93=9C=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EB=B0=98=EC=98=81=20#74?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/android-ci.yml | 2 +- .gitignore | 1 + app/build.gradle.kts | 11 ++++++++++- gradle/libs.versions.toml | 4 +++- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index ad85a55d..328bf5a0 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -43,5 +43,5 @@ jobs: # CI에서 수행할 작업을 정의한다. # ./gradlew detekt - name: Run build - run: ./gradlew buildDebug --stacktrace + run: ./gradlew assembleDebug --stacktrace diff --git a/.gitignore b/.gitignore index ab468b1e..4a5682ef 100644 --- a/.gitignore +++ b/.gitignore @@ -169,3 +169,4 @@ fabric.properties !/gradle/wrapper/gradle-wrapper.jar /app/debug/output-metadata.json +/app/build/outputs/**/output-metadata.json diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2972c65b..5d566441 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -34,6 +34,15 @@ android { } signingConfigs { + val debugKeystore = rootProject.file("debug.keystore") + if (debugKeystore.exists()) { + getByName("debug") { + storeFile = debugKeystore + storePassword = "android" + keyAlias = "androiddebugkey" + keyPassword = "android" + } + } getByName("debug") { storeFile = file("$rootDir/debug.keystore") storePassword = "android" @@ -108,7 +117,7 @@ dependencies { // Kakao SDK implementation("com.kakao.sdk:v2-all:2.20.6") implementation("com.kakao.sdk:v2-user:2.20.6") // 카카오 로그인 API 모듈 - implementation ("com.kakao.maps.open:android:2.12.8") // 카카오 맵 API + implementation("com.kakao.maps.open:android:2.12.8") // 카카오 맵 API // coil implementation(libs.coil.compose) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 27d5355e..82cbe271 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -25,6 +25,7 @@ retrofitKotlinSerializationConverter = "1.0.0" datastorePreferences = "1.1.3" playServicesLocation = "21.3.0" firebaseCrashlytics = "3.0.6" +googleServices = "4.4.3" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -71,4 +72,5 @@ kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", versi kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } dagger-hilt = { id = "com.google.dagger.hilt.android", version.ref = "hiltAndroid" } -firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebaseCrashlytics" } \ No newline at end of file +firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebaseCrashlytics" } +google-services = { id = "com.google.gms.google-services", version.ref = "googleServices" } \ No newline at end of file