diff --git a/.github/workflows/develop_PR_builder.yml b/.github/workflows/develop_PR_builder.yml index 7a0f33e71..cd5c18dfd 100644 --- a/.github/workflows/develop_PR_builder.yml +++ b/.github/workflows/develop_PR_builder.yml @@ -39,13 +39,29 @@ jobs: - name: Add Local Properties env: KAKAO_API_KEY: ${{ secrets.KAKAO_API_KEY }} - HMH_BASE_URL: ${{ secrets.HMH_BASE_URL }} + HMH_DEV_BASE_URL: ${{ secrets.HMH_DEV_BASE_URL }} + HMH_PROD_BASE_URL: ${{ secrets.HMH_PROD_BASE_URL }} + AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }} + KEY_ALIAS: ${{ secrets.KEY_ALIAS }} + KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} + STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }} run: | echo kakaoApiKey=$KAKAO_API_KEY >> ./local.properties - echo hmhBaseUrl=$HMH_BASE_URL >> ./local.properties + echo amplitudeApiKey=$AMPLITUDE_API_KEY >> ./local.properties + echo keyAlias=$KEY_ALIAS >> ./local.properties + echo keyPassword=$KEY_PASSWORD >> ./local.properties + echo storePassword=$STORE_PASSWORD >> ./local.properties + echo hmhDevBaseUrl=$HMH_DEV_BASE_URL >> ./local.properties + echo hmhProdBaseUrl=$HMH_PROD_BASE_URL >> ./local.properties - name: Access Firebase Service run: echo '${{ secrets.GOOGLE_SERVICES_JSON }}' > ./app/google-services.json + - name: Run Tests + run: ./gradlew test + + - name: Verify Lint + run: ./gradlew lint + - name: Build debug APK run: ./gradlew assembleDebug --stacktrace diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..5733c0181 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,74 @@ +name: Release Firebase Distribution Workflow + +on: + push: + branches: + - release/** + +jobs: + build-and-release: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup JDK + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '17' + + - name: Decode keystore + run: echo "${{ secrets.RELEASE_KEYSTORE_BASE64 }}" | base64 --decode > keystore/release.keystore.jks + + - name: Grant execute permission for gradlew + run: chmod +x ./gradlew + + - name: Add Local Properties + env: + KAKAO_API_KEY: ${{ secrets.KAKAO_API_KEY }} + HMH_DEV_BASE_URL: ${{ secrets.HMH_DEV_BASE_URL }} + HMH_PROD_BASE_URL: ${{ secrets.HMH_PROD_BASE_URL }} + AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }} + KEY_ALIAS: ${{ secrets.KEY_ALIAS }} + KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} + STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }} + run: | + echo kakaoApiKey=$KAKAO_API_KEY >> ./local.properties + echo amplitudeApiKey=$AMPLITUDE_API_KEY >> ./local.properties + echo keyAlias=$KEY_ALIAS >> ./local.properties + echo keyPassword=$KEY_PASSWORD >> ./local.properties + echo storePassword=$STORE_PASSWORD >> ./local.properties + echo hmhDevBaseUrl=$HMH_DEV_BASE_URL >> ./local.properties + echo hmhProdBaseUrl=$HMH_PROD_BASE_URL >> ./local.properties + + - name: Access Firebase Service + run: echo '${{ secrets.GOOGLE_SERVICES_JSON }}' > ./app/google-services.json + + - name: Cache Gradle dependencies + uses: actions/cache@v3 + with: + path: ~/.gradle/caches + key: gradle-cache-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + gradle-cache-${{ runner.os }}- + + - name: Build APK + run: ./gradlew assembleRelease + + - name: Verify APK Existence + run: test -f app/build/outputs/apk/release/app-release.apk + + - name: Generate Release Notes + id: release-notes + run: echo "RELEASE_NOTES=$(git log -1 --pretty=%B)" >> $GITHUB_ENV + + - 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: hmh-team + file: app/build/outputs/apk/release/app-release.apk + releaseNotes: ${{ env.RELEASE_NOTES }} diff --git a/.gitignore b/.gitignore index ae099a526..52d844f31 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ captures/ .cxx/ *.apk output.json +output-metadata.json # IntelliJ *.iml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 27d1c50f1..85f9bc507 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -52,6 +52,11 @@ android { signingConfig = signingConfigs.getByName("release") } } + + lint { + disable.add("Instantiatable") + baseline = file("lint-baseline.xml") + } } dependencies { diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml new file mode 100644 index 000000000..5d42fbbdd --- /dev/null +++ b/app/lint-baseline.xml @@ -0,0 +1,4 @@ + + + + diff --git a/core/common/src/main/AndroidManifest.xml b/core/common/src/main/AndroidManifest.xml index 10d53e8fd..75ff5d259 100644 --- a/core/common/src/main/AndroidManifest.xml +++ b/core/common/src/main/AndroidManifest.xml @@ -5,7 +5,7 @@ diff --git a/core/common/src/test/java/TimeTest.kt b/core/common/src/test/java/TimeTest.kt index 301bbc88c..8e2325471 100644 --- a/core/common/src/test/java/TimeTest.kt +++ b/core/common/src/test/java/TimeTest.kt @@ -133,8 +133,8 @@ class TimeUtilsTest { val expectedStartMillis = currentDate.toStartOfDayTime().toEpochMilliseconds(defaultTimeZone) val expectedEndMillis = getNowLocalDateTime().toEpochMilliseconds(defaultTimeZone) - assertEquals(expectedStartMillis, startMillis) - assertEquals(expectedEndMillis, endMillis) + assertTrue(expectedStartMillis - startMillis < 1000) + assertTrue(expectedEndMillis - endMillis < 1000) } // 타겟 날짜의 시작 시간과 종료 시간을 Epoch 밀리초로 반환하는 함수 테스트 @@ -144,8 +144,8 @@ class TimeUtilsTest { val (startMillis, endMillis) = getTargetDayStartEndEpochMillis(targetDate) val expectedStartMillis = targetDate.toStartOfDayTime().toEpochMilliseconds(defaultTimeZone) val expectedEndMillis = getNowLocalDateTime().toEpochMilliseconds(defaultTimeZone) - assertEquals(expectedStartMillis, startMillis) - assertEquals(expectedEndMillis, endMillis) + assertTrue(expectedStartMillis - startMillis < 1000) + assertTrue(expectedEndMillis - endMillis < 1000) } // 기본 타임존의 현재 날짜를 반환하는 함수 테스트