From 6c880a1f14b1ecd24e0be1d3844ca964a025c303 Mon Sep 17 00:00:00 2001 From: SuHyeon00 Date: Sun, 25 Jan 2026 17:09:25 +0900 Subject: [PATCH 01/18] :sparkles: Feature: Add Bitrise CI configuration for Android builds --- bitrise.yml | 329 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 329 insertions(+) create mode 100644 bitrise.yml diff --git a/bitrise.yml b/bitrise.yml new file mode 100644 index 000000000..67782fe27 --- /dev/null +++ b/bitrise.yml @@ -0,0 +1,329 @@ +format_version: '11' +default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git + +workflows: + primary: + steps: + - activate-ssh-key@4: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + + - git-clone@7: + inputs: + - clone_depth: 1 + + - install-missing-android-tools@3: + inputs: + - gradlew_path: "$PROJECT_LOCATION/gradlew" + + - cache-pull@2: {} + + - script@1: + title: Set environment variables + inputs: + - content: | + #!/bin/bash + set -e + + if [ -z "$ENVIRONMENT" ] || [ "$ENVIRONMENT" = "auto" ]; then + if [ "$BITRISE_GIT_BRANCH" = "main" ] || [ "$BITRISE_GIT_BRANCH" = "master" ]; then + ENVIRONMENT="production" + else + ENVIRONMENT="development" + fi + fi + + if [ -z "$BUILD_TYPE" ]; then + if [ "$ENVIRONMENT" = "production" ]; then + BUILD_TYPE="release" + else + BUILD_TYPE="qa" + fi + fi + + if [ "$ENVIRONMENT" = "production" ]; then + export BASE_URL="$PRODUCTION_BASE_URL" + export BRANCH_KEY="$PRODUCTION_BRANCH_KEY" + else + export BASE_URL="$DEVELOPMENT_BASE_URL" + export BRANCH_KEY="$DEVELOPMENT_BRANCH_KEY" + fi + + echo "export BUILD_TYPE=$BUILD_TYPE" >> $BITRISE_ENV + + echo "Environment: $ENVIRONMENT" + echo "Build Type: $BUILD_TYPE" + if [ -n "$BASE_URL" ]; then + MASKED_URL=$(echo "$BASE_URL" | sed 's/\(https\?:\/\/[^\/]*\).*/\1\/***/') + echo "BASE_URL: $MASKED_URL (masked)" + else + echo "BASE_URL: (not set)" + fi + + echo "sdk.dir=$ANDROID_HOME" > local.properties + echo "base_url=$BASE_URL" >> local.properties + echo "branch_key=$BRANCH_KEY" >> local.properties + + - script@1: + title: Build APK with correct build type + inputs: + - content: | + #!/bin/bash + set -e + + case "$BUILD_TYPE" in + debug) + GRADLE_TASK="assembleDebug" + ;; + qa) + GRADLE_TASK="assembleQa" + ;; + release) + GRADLE_TASK="assembleRelease" + ;; + *) + echo "Unknown BUILD_TYPE: $BUILD_TYPE, defaulting to debug" + GRADLE_TASK="assembleDebug" + ;; + esac + + echo "Gradle Task: $GRADLE_TASK" + echo "export GRADLE_TASK=$GRADLE_TASK" >> $BITRISE_ENV + + - gradle-runner@1: + inputs: + - gradle_file: "$PROJECT_LOCATION/build.gradle.kts" + - gradle_task: $GRADLE_TASK + - gradle_options: "--stacktrace" + + - cache-push@2: {} + + - deploy-to-bitrise-io@2: + inputs: + - deploy_path: "$BITRISE_APK_PATH" + - notify_user_groups: none + - is_enable_public_page: "true" + + - script@1: + title: Send Discord notification + run_if: '{{getenv "DISCORD_WEBHOOK_URL" | ne ""}}' + inputs: + - content: | + #!/bin/bash + set -e + + if [ "$BITRISE_BUILD_STATUS" = "0" ]; then + EMOJI="✅" + STATUS="Build Success" + COLOR=3066993 + else + EMOJI="❌" + STATUS="Build Failed" + COLOR=15158332 + fi + + jq -n \ + --arg username "Android Build Bot" \ + --arg avatar_url "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png" \ + --arg content "${EMOJI} **${STATUS}**" \ + --arg branch "$BITRISE_GIT_BRANCH" \ + --arg build_type "$BUILD_TYPE" \ + --arg version "$BITRISE_APP_VERSION" \ + --arg download_url "$BITRISE_APP_URL" \ + --argjson color "$COLOR" \ + '{ + username: $username, + avatar_url: $avatar_url, + content: $content, + embeds: [{ + title: "📱 Edison Android Build Success", + color: $color, + fields: [ + { + name: "🌿 Branch", + value: $branch, + inline: true + }, + { + name: "🔨 Build Type", + value: $build_type, + inline: true + }, + { + name: "📦 Version", + value: $version, + inline: true + }, + { + name: "📥 Download", + value: $download_url, + inline: false + } + ], + url: $download_url, + footer: { + text: "Bitrise" + }, + timestamp: (now | todateiso8601) + }] + }' > payload.json + + curl -H "Content-Type: application/json" \ + -X POST \ + -d @payload.json \ + "$DISCORD_WEBHOOK_URL" || echo "Discord notification failed" + + release: + steps: + - activate-ssh-key@4: + run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' + + - git-clone@7: + inputs: + - clone_depth: 1 + + - install-missing-android-tools@3: + inputs: + - gradlew_path: "$PROJECT_LOCATION/gradlew" + + - cache-pull@2: {} + + - script@1: + title: Set production environment variables + inputs: + - content: | + #!/bin/bash + set -e + + BUILD_TYPE="${BUILD_TYPE:-release}" + ENVIRONMENT="production" + + export BASE_URL="$PRODUCTION_BASE_URL" + export BRANCH_KEY="$PRODUCTION_BRANCH_KEY" + export ENVIRONMENT + + echo "export BUILD_TYPE=$BUILD_TYPE" >> $BITRISE_ENV + + echo "Environment: Production" + echo "Build Type: $BUILD_TYPE" + if [ -n "$BASE_URL" ]; then + MASKED_URL=$(echo "$BASE_URL" | sed 's/\(https\?:\/\/[^\/]*\).*/\1\/***/') + echo "BASE_URL: $MASKED_URL (masked)" + else + echo "BASE_URL: (not set)" + fi + + echo "sdk.dir=$ANDROID_HOME" > local.properties + echo "base_url=$BASE_URL" >> local.properties + echo "branch_key=$BRANCH_KEY" >> local.properties + + - script@1: + title: Build APK with correct build type + inputs: + - content: | + #!/bin/bash + set -e + + case "$BUILD_TYPE" in + debug) + GRADLE_TASK="assembleDebug" + ;; + qa) + GRADLE_TASK="assembleQa" + ;; + release) + GRADLE_TASK="assembleRelease" + ;; + *) + echo "Unknown BUILD_TYPE: $BUILD_TYPE, defaulting to release" + GRADLE_TASK="assembleRelease" + ;; + esac + + echo "Gradle Task: $GRADLE_TASK" + echo "export GRADLE_TASK=$GRADLE_TASK" >> $BITRISE_ENV + + - gradle-runner@1: + inputs: + - gradle_file: "$PROJECT_LOCATION/build.gradle.kts" + - gradle_task: $GRADLE_TASK + - gradle_options: "--stacktrace" + + - cache-push@2: {} + + - deploy-to-bitrise-io@2: + inputs: + - deploy_path: "$BITRISE_APK_PATH" + - notify_user_groups: none + - is_enable_public_page: "true" + + - script@1: + title: Send Discord notification + run_if: '{{getenv "DISCORD_WEBHOOK_URL" | ne ""}}' + inputs: + - content: | + #!/bin/bash + set -e + + if [ "$BITRISE_BUILD_STATUS" = "0" ]; then + EMOJI="✅" + STATUS="Build Success" + COLOR=3066993 + else + EMOJI="❌" + STATUS="Build Failed" + COLOR=15158332 + fi + + jq -n \ + --arg username "Android Build Bot" \ + --arg content "${EMOJI} **${STATUS}**" \ + --arg branch "$BITRISE_GIT_BRANCH" \ + --arg build_type "release" \ + --arg version "$BITRISE_APP_VERSION" \ + --arg download_url "$BITRISE_APP_URL" \ + --argjson color "$COLOR" \ + '{ + username: $username, + content: $content, + embeds: [{ + title: "📱 Edison Android Release Build Success", + color: $color, + fields: [ + { + name: "🌿 Branch", + value: $branch, + inline: true + }, + { + name: "🔨 Build Type", + value: $build_type, + inline: true + }, + { + name: "📦 Version", + value: $version, + inline: true + }, + { + name: "📥 Download", + value: $download_url, + inline: false + } + ], + url: $download_url, + footer: { + text: "Bitrise" + }, + timestamp: (now | todateiso8601) + }] + }' > payload.json + + curl -H "Content-Type: application/json" \ + -X POST \ + -d @payload.json \ + "$DISCORD_WEBHOOK_URL" || echo "Discord notification failed" + +app: + envs: + - PROJECT_LOCATION: "." + - MODULE: "app" From e95186edd4e7b298e692128a44acbabf2e7f796a Mon Sep 17 00:00:00 2001 From: SuHyeon00 Date: Sun, 25 Jan 2026 17:32:54 +0900 Subject: [PATCH 02/18] :sparkles: Feature: Upgrade Bitrise step versions for git-clone and gradle-runner --- bitrise.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bitrise.yml b/bitrise.yml index 67782fe27..46b6e04b9 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -7,7 +7,7 @@ workflows: - activate-ssh-key@4: run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' - - git-clone@7: + - git-clone@8.4.0: inputs: - clone_depth: 1 @@ -89,7 +89,7 @@ workflows: echo "Gradle Task: $GRADLE_TASK" echo "export GRADLE_TASK=$GRADLE_TASK" >> $BITRISE_ENV - - gradle-runner@1: + - gradle-runner@4.0.2: inputs: - gradle_file: "$PROJECT_LOCATION/build.gradle.kts" - gradle_task: $GRADLE_TASK @@ -177,7 +177,7 @@ workflows: - activate-ssh-key@4: run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' - - git-clone@7: + - git-clone@8.4.0: inputs: - clone_depth: 1 @@ -242,7 +242,7 @@ workflows: echo "Gradle Task: $GRADLE_TASK" echo "export GRADLE_TASK=$GRADLE_TASK" >> $BITRISE_ENV - - gradle-runner@1: + - gradle-runner@4.0.2: inputs: - gradle_file: "$PROJECT_LOCATION/build.gradle.kts" - gradle_task: $GRADLE_TASK From bb336af10e9aa57a01df005cfd2094d3280de174 Mon Sep 17 00:00:00 2001 From: SuHyeon00 Date: Sun, 25 Jan 2026 17:36:41 +0900 Subject: [PATCH 03/18] :sparkles: Feature: Update Bitrise workflows to rename primary and release to build-qa and build-release --- bitrise.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bitrise.yml b/bitrise.yml index 46b6e04b9..e8a1a963f 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -2,7 +2,7 @@ format_version: '11' default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git workflows: - primary: + build-qa: steps: - activate-ssh-key@4: run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' @@ -172,7 +172,7 @@ workflows: -d @payload.json \ "$DISCORD_WEBHOOK_URL" || echo "Discord notification failed" - release: + build-release: steps: - activate-ssh-key@4: run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' From 3b586665613153932c7ca5853065fa6e9179d7cc Mon Sep 17 00:00:00 2001 From: SuHyeon00 Date: Sun, 25 Jan 2026 17:39:17 +0900 Subject: [PATCH 04/18] :sparkles: Feature: Replace echo commands with envman for setting environment variables in Bitrise workflows --- bitrise.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bitrise.yml b/bitrise.yml index e8a1a963f..f8b86396a 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -48,7 +48,7 @@ workflows: export BRANCH_KEY="$DEVELOPMENT_BRANCH_KEY" fi - echo "export BUILD_TYPE=$BUILD_TYPE" >> $BITRISE_ENV + envman add --key BUILD_TYPE --value "$BUILD_TYPE" echo "Environment: $ENVIRONMENT" echo "Build Type: $BUILD_TYPE" @@ -87,7 +87,7 @@ workflows: esac echo "Gradle Task: $GRADLE_TASK" - echo "export GRADLE_TASK=$GRADLE_TASK" >> $BITRISE_ENV + envman add --key GRADLE_TASK --value "$GRADLE_TASK" - gradle-runner@4.0.2: inputs: @@ -201,7 +201,7 @@ workflows: export BRANCH_KEY="$PRODUCTION_BRANCH_KEY" export ENVIRONMENT - echo "export BUILD_TYPE=$BUILD_TYPE" >> $BITRISE_ENV + envman add --key BUILD_TYPE --value "$BUILD_TYPE" echo "Environment: Production" echo "Build Type: $BUILD_TYPE" @@ -240,7 +240,7 @@ workflows: esac echo "Gradle Task: $GRADLE_TASK" - echo "export GRADLE_TASK=$GRADLE_TASK" >> $BITRISE_ENV + envman add --key GRADLE_TASK --value "$GRADLE_TASK" - gradle-runner@4.0.2: inputs: From 9b920124890e6712379bd7ddbac22fd1ee5951c0 Mon Sep 17 00:00:00 2001 From: SuHyeon00 Date: Sun, 25 Jan 2026 17:47:54 +0900 Subject: [PATCH 05/18] :sparkles: Feature: Update cache steps --- bitrise.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bitrise.yml b/bitrise.yml index f8b86396a..e0e7ec717 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -15,7 +15,7 @@ workflows: inputs: - gradlew_path: "$PROJECT_LOCATION/gradlew" - - cache-pull@2: {} + - restore-gradle-cache@1: {} - script@1: title: Set environment variables @@ -95,7 +95,7 @@ workflows: - gradle_task: $GRADLE_TASK - gradle_options: "--stacktrace" - - cache-push@2: {} + - save-gradle-cache@1: {} - deploy-to-bitrise-io@2: inputs: @@ -185,7 +185,7 @@ workflows: inputs: - gradlew_path: "$PROJECT_LOCATION/gradlew" - - cache-pull@2: {} + - restore-gradle-cache@1: {} - script@1: title: Set production environment variables @@ -248,7 +248,7 @@ workflows: - gradle_task: $GRADLE_TASK - gradle_options: "--stacktrace" - - cache-push@2: {} + - save-gradle-cache@1: {} - deploy-to-bitrise-io@2: inputs: From d14a90b8f71c8cd87bc293c7bf1a6929de46017e Mon Sep 17 00:00:00 2001 From: SuHyeon00 Date: Sun, 25 Jan 2026 17:50:06 +0900 Subject: [PATCH 06/18] :sparkles: Feature: Add script to setup google-services.json files for different build types in Bitrise workflows --- bitrise.yml | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/bitrise.yml b/bitrise.yml index e0e7ec717..2679582b5 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -17,6 +17,47 @@ workflows: - restore-gradle-cache@1: {} + - script@1: + title: Setup google-services.json files + inputs: + - content: | + #!/bin/bash + set -e + + if [ -z "$BUILD_TYPE" ]; then + if [ "$BITRISE_GIT_BRANCH" = "main" ] || [ "$BITRISE_GIT_BRANCH" = "master" ]; then + BUILD_TYPE="release" + else + BUILD_TYPE="qa" + fi + fi + + if [ -n "$GOOGLE_SERVICES_JSON_DEBUG" ]; then + mkdir -p app/src/debug + echo "$GOOGLE_SERVICES_JSON_DEBUG" | base64 -d > app/src/debug/google-services.json + echo "✓ Created app/src/debug/google-services.json" + else + echo "⚠ Warning: GOOGLE_SERVICES_JSON_DEBUG not set" + fi + + if [ -n "$GOOGLE_SERVICES_JSON_QA" ]; then + mkdir -p app/src/qa + echo "$GOOGLE_SERVICES_JSON_QA" | base64 -d > app/src/qa/google-services.json + echo "✓ Created app/src/qa/google-services.json" + else + echo "⚠ Warning: GOOGLE_SERVICES_JSON_QA not set" + fi + + if [ -n "$GOOGLE_SERVICES_JSON_RELEASE" ]; then + mkdir -p app/src/release + echo "$GOOGLE_SERVICES_JSON_RELEASE" | base64 -d > app/src/release/google-services.json + echo "✓ Created app/src/release/google-services.json" + else + echo "⚠ Warning: GOOGLE_SERVICES_JSON_RELEASE not set" + fi + + echo "Google Services JSON files setup completed for build type: $BUILD_TYPE" + - script@1: title: Set environment variables inputs: @@ -187,6 +228,39 @@ workflows: - restore-gradle-cache@1: {} + - script@1: + title: Setup google-services.json files + inputs: + - content: | + #!/bin/bash + set -e + + if [ -n "$GOOGLE_SERVICES_JSON_DEBUG" ]; then + mkdir -p app/src/debug + echo "$GOOGLE_SERVICES_JSON_DEBUG" | base64 -d > app/src/debug/google-services.json + echo "✓ Created app/src/debug/google-services.json" + else + echo "⚠ Warning: GOOGLE_SERVICES_JSON_DEBUG not set" + fi + + if [ -n "$GOOGLE_SERVICES_JSON_QA" ]; then + mkdir -p app/src/qa + echo "$GOOGLE_SERVICES_JSON_QA" | base64 -d > app/src/qa/google-services.json + echo "✓ Created app/src/qa/google-services.json" + else + echo "⚠ Warning: GOOGLE_SERVICES_JSON_QA not set" + fi + + if [ -n "$GOOGLE_SERVICES_JSON_RELEASE" ]; then + mkdir -p app/src/release + echo "$GOOGLE_SERVICES_JSON_RELEASE" | base64 -d > app/src/release/google-services.json + echo "✓ Created app/src/release/google-services.json" + else + echo "⚠ Warning: GOOGLE_SERVICES_JSON_RELEASE not set" + fi + + echo "Google Services JSON files setup completed" + - script@1: title: Set production environment variables inputs: From e231f75cfc89e246d9d987fc07268b72a7fa794c Mon Sep 17 00:00:00 2001 From: SuHyeon00 Date: Sun, 25 Jan 2026 17:53:24 +0900 Subject: [PATCH 07/18] :sparkles: Feature: Upgrade restore and save gradle cache steps to version 2.2.4 in Bitrise workflows --- bitrise.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bitrise.yml b/bitrise.yml index 2679582b5..f66be3ea5 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -15,7 +15,7 @@ workflows: inputs: - gradlew_path: "$PROJECT_LOCATION/gradlew" - - restore-gradle-cache@1: {} + - restore-gradle-cache@2.2.4: {} - script@1: title: Setup google-services.json files @@ -136,7 +136,7 @@ workflows: - gradle_task: $GRADLE_TASK - gradle_options: "--stacktrace" - - save-gradle-cache@1: {} + - save-gradle-cache@2.2.4: {} - deploy-to-bitrise-io@2: inputs: @@ -226,7 +226,7 @@ workflows: inputs: - gradlew_path: "$PROJECT_LOCATION/gradlew" - - restore-gradle-cache@1: {} + - restore-gradle-cache@2.2.4: {} - script@1: title: Setup google-services.json files @@ -322,7 +322,7 @@ workflows: - gradle_task: $GRADLE_TASK - gradle_options: "--stacktrace" - - save-gradle-cache@1: {} + - save-gradle-cache@2.2.4: {} - deploy-to-bitrise-io@2: inputs: From 9534567197924d1832e1dfe26b356a019727aedf Mon Sep 17 00:00:00 2001 From: SuHyeon00 Date: Sun, 25 Jan 2026 17:54:50 +0900 Subject: [PATCH 08/18] :sparkles: Feature: Downgrade save-gradle-cache step to version 1 in Bitrise workflows --- bitrise.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bitrise.yml b/bitrise.yml index f66be3ea5..4cfc9ad7d 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -136,7 +136,7 @@ workflows: - gradle_task: $GRADLE_TASK - gradle_options: "--stacktrace" - - save-gradle-cache@2.2.4: {} + - save-gradle-cache@1: {} - deploy-to-bitrise-io@2: inputs: @@ -322,7 +322,7 @@ workflows: - gradle_task: $GRADLE_TASK - gradle_options: "--stacktrace" - - save-gradle-cache@2.2.4: {} + - save-gradle-cache@1: {} - deploy-to-bitrise-io@2: inputs: From 230f62ca1ba2917249f07d20bb0c4d50b8142421 Mon Sep 17 00:00:00 2001 From: SuHyeon00 Date: Sun, 8 Feb 2026 17:14:56 +0900 Subject: [PATCH 09/18] :sparkles: Feature: Add conditional android-sign step in Bitrise workflows --- bitrise.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bitrise.yml b/bitrise.yml index 4cfc9ad7d..fd8724bd5 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -135,6 +135,9 @@ workflows: - gradle_file: "$PROJECT_LOCATION/build.gradle.kts" - gradle_task: $GRADLE_TASK - gradle_options: "--stacktrace" + + - android-sign@1: + run_if: '{{getenv "BITRISEIO_ANDROID_KEYSTORE_URL" | ne ""}}' - save-gradle-cache@1: {} @@ -321,6 +324,9 @@ workflows: - gradle_file: "$PROJECT_LOCATION/build.gradle.kts" - gradle_task: $GRADLE_TASK - gradle_options: "--stacktrace" + + - android-sign@1: + run_if: '{{getenv "BITRISEIO_ANDROID_KEYSTORE_URL" | ne ""}}' - save-gradle-cache@1: {} From 33f228cceee8627224f1110e82416c9d05c7a26e Mon Sep 17 00:00:00 2001 From: SuHyeon00 Date: Sun, 8 Feb 2026 17:41:45 +0900 Subject: [PATCH 10/18] :sparkles: Feature: Rename android-sign step to sign-apk in Bitrise workflows --- bitrise.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bitrise.yml b/bitrise.yml index fd8724bd5..857f638f9 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -136,7 +136,7 @@ workflows: - gradle_task: $GRADLE_TASK - gradle_options: "--stacktrace" - - android-sign@1: + - sign-apk@1: run_if: '{{getenv "BITRISEIO_ANDROID_KEYSTORE_URL" | ne ""}}' - save-gradle-cache@1: {} @@ -325,7 +325,7 @@ workflows: - gradle_task: $GRADLE_TASK - gradle_options: "--stacktrace" - - android-sign@1: + - sign-apk@1: run_if: '{{getenv "BITRISEIO_ANDROID_KEYSTORE_URL" | ne ""}}' - save-gradle-cache@1: {} From 463c220e08d11709b2c1e92e3703027bf6e8f8d2 Mon Sep 17 00:00:00 2001 From: SuHyeon00 Date: Sun, 8 Feb 2026 20:50:37 +0900 Subject: [PATCH 11/18] :sparkles: Feature: Enable APK signing in Bitrise workflows --- bitrise.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bitrise.yml b/bitrise.yml index 857f638f9..6ea037491 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -138,6 +138,8 @@ workflows: - sign-apk@1: run_if: '{{getenv "BITRISEIO_ANDROID_KEYSTORE_URL" | ne ""}}' + inputs: + - use_apk_signer: "true" - save-gradle-cache@1: {} @@ -327,6 +329,8 @@ workflows: - sign-apk@1: run_if: '{{getenv "BITRISEIO_ANDROID_KEYSTORE_URL" | ne ""}}' + inputs: + - use_apk_signer: "true" - save-gradle-cache@1: {} From 98a8a39c370c1961d320049f0c23c00f9b5d7429 Mon Sep 17 00:00:00 2001 From: SuHyeon00 Date: Sun, 8 Feb 2026 21:44:42 +0900 Subject: [PATCH 12/18] :sparkles: Feature: Enhance GoogleLoginHelper with error logging --- .../presentation/login/GoogleLoginHelper.kt | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/umc/edison/presentation/login/GoogleLoginHelper.kt b/app/src/main/java/com/umc/edison/presentation/login/GoogleLoginHelper.kt index 6ff6ed07e..b453d104e 100644 --- a/app/src/main/java/com/umc/edison/presentation/login/GoogleLoginHelper.kt +++ b/app/src/main/java/com/umc/edison/presentation/login/GoogleLoginHelper.kt @@ -8,8 +8,10 @@ import androidx.credentials.GetCredentialResponse import androidx.credentials.exceptions.GetCredentialException import com.google.android.libraries.identity.googleid.GetGoogleIdOption import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential +import com.google.firebase.crashlytics.ktx.crashlytics import com.umc.edison.BuildConfig import com.umc.edison.R +import com.google.firebase.ktx.Firebase import com.umc.edison.common.logging.AppLogger import com.umc.edison.common.logging.UserContext import com.umc.edison.domain.DataResource @@ -59,8 +61,17 @@ class GoogleLoginHelper @Inject constructor( is androidx.credentials.exceptions.GetCredentialCancellationException -> GoogleLoginState.ERROR_MESSAGE_CANCELLED - else -> + else -> { + AppLogger.e( + "Google SignIn", + "GetCredentialException: ${e.javaClass.simpleName} - ${e.message}", + e + ) + Firebase.crashlytics.setCustomKey("google_signin_phase", "get_credential") + Firebase.crashlytics.setCustomKey("google_signin_error_type", e.javaClass.simpleName) + Firebase.crashlytics.setCustomKey("google_signin_error_message", e.message ?: "") GoogleLoginState.ERROR_MESSAGE_UNKNOWN + } } onResult(GoogleLoginState.Failure(errorMessage)) } @@ -98,11 +109,13 @@ class GoogleLoginHelper @Inject constructor( onResult(GoogleLoginState.Failure(GoogleLoginState.ERROR_MESSAGE_INVALID_TOKEN)) } } else { + AppLogger.w("Google SignIn", "CustomCredential type mismatch: ${credential.type}") onResult(GoogleLoginState.Failure()) } } else -> { + AppLogger.w("Google SignIn", "Unknown credential type: ${credential.javaClass.simpleName}") onResult(GoogleLoginState.Failure()) } } From 05202ec64f13feed542c3b98d0502323a1f9362f Mon Sep 17 00:00:00 2001 From: SuHyeon00 Date: Sun, 8 Feb 2026 21:44:53 +0900 Subject: [PATCH 13/18] :sparkles: Feature: Upgrade gradle-runner and sign-apk steps to latest versions in Bitrise workflows --- bitrise.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bitrise.yml b/bitrise.yml index 6ea037491..6240ab68c 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -130,13 +130,13 @@ workflows: echo "Gradle Task: $GRADLE_TASK" envman add --key GRADLE_TASK --value "$GRADLE_TASK" - - gradle-runner@4.0.2: + - gradle-runner@5.0.0: inputs: - gradle_file: "$PROJECT_LOCATION/build.gradle.kts" - gradle_task: $GRADLE_TASK - gradle_options: "--stacktrace" - - sign-apk@1: + - sign-apk@2.0.1: run_if: '{{getenv "BITRISEIO_ANDROID_KEYSTORE_URL" | ne ""}}' inputs: - use_apk_signer: "true" @@ -321,13 +321,13 @@ workflows: echo "Gradle Task: $GRADLE_TASK" envman add --key GRADLE_TASK --value "$GRADLE_TASK" - - gradle-runner@4.0.2: + - gradle-runner@5.0.0: inputs: - gradle_file: "$PROJECT_LOCATION/build.gradle.kts" - gradle_task: $GRADLE_TASK - gradle_options: "--stacktrace" - - sign-apk@1: + - sign-apk@2.0.1: run_if: '{{getenv "BITRISEIO_ANDROID_KEYSTORE_URL" | ne ""}}' inputs: - use_apk_signer: "true" From cb8a4312d255861752cc9ed2a3970422facbf2ab Mon Sep 17 00:00:00 2001 From: SuHyeon00 Date: Sun, 8 Feb 2026 22:00:02 +0900 Subject: [PATCH 14/18] :sparkles: Refactor: Remove debug checks from logging methods in AppLogger --- app/src/main/java/com/umc/edison/common/logging/AppLogger.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/umc/edison/common/logging/AppLogger.kt b/app/src/main/java/com/umc/edison/common/logging/AppLogger.kt index 560c59239..c54ee7cf6 100644 --- a/app/src/main/java/com/umc/edison/common/logging/AppLogger.kt +++ b/app/src/main/java/com/umc/edison/common/logging/AppLogger.kt @@ -23,13 +23,13 @@ object AppLogger { } fun w(tag: String, message: String, throwable: Throwable? = null) { - if (isDebug) Log.w(tag, message, throwable) + Log.w(tag, message, throwable) Firebase.crashlytics.log("$PREFIX_WARN$tag: $message") throwable?.let { Firebase.crashlytics.recordException(it) } } fun e(tag: String, message: String, throwable: Throwable? = null) { - if (isDebug) Log.e(tag, message, throwable) + Log.e(tag, message, throwable) Firebase.crashlytics.log("$PREFIX_ERROR$tag: $message") throwable?.let { Firebase.crashlytics.recordException(it) } } From 89e14d6baebf6e79d52a82bfc1a980310987f142 Mon Sep 17 00:00:00 2001 From: SuHyeon00 Date: Sun, 8 Feb 2026 23:39:19 +0900 Subject: [PATCH 15/18] Revert ":sparkles: Refactor: Remove debug checks from logging methods in AppLogger" This reverts commit c194f42811af4f75e4369bca69c87861441cc9e6. --- app/src/main/java/com/umc/edison/common/logging/AppLogger.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/umc/edison/common/logging/AppLogger.kt b/app/src/main/java/com/umc/edison/common/logging/AppLogger.kt index c54ee7cf6..560c59239 100644 --- a/app/src/main/java/com/umc/edison/common/logging/AppLogger.kt +++ b/app/src/main/java/com/umc/edison/common/logging/AppLogger.kt @@ -23,13 +23,13 @@ object AppLogger { } fun w(tag: String, message: String, throwable: Throwable? = null) { - Log.w(tag, message, throwable) + if (isDebug) Log.w(tag, message, throwable) Firebase.crashlytics.log("$PREFIX_WARN$tag: $message") throwable?.let { Firebase.crashlytics.recordException(it) } } fun e(tag: String, message: String, throwable: Throwable? = null) { - Log.e(tag, message, throwable) + if (isDebug) Log.e(tag, message, throwable) Firebase.crashlytics.log("$PREFIX_ERROR$tag: $message") throwable?.let { Firebase.crashlytics.recordException(it) } } From 68fe8dd2576f5dc37001c5a27beed8f030e226b3 Mon Sep 17 00:00:00 2001 From: SuHyeon00 Date: Thu, 26 Feb 2026 01:35:11 +0900 Subject: [PATCH 16/18] :sparkles: Feature: use generic Crashlytics message for credential errors --- .../java/com/umc/edison/presentation/login/GoogleLoginHelper.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/umc/edison/presentation/login/GoogleLoginHelper.kt b/app/src/main/java/com/umc/edison/presentation/login/GoogleLoginHelper.kt index b453d104e..4a8ceadc8 100644 --- a/app/src/main/java/com/umc/edison/presentation/login/GoogleLoginHelper.kt +++ b/app/src/main/java/com/umc/edison/presentation/login/GoogleLoginHelper.kt @@ -69,7 +69,7 @@ class GoogleLoginHelper @Inject constructor( ) Firebase.crashlytics.setCustomKey("google_signin_phase", "get_credential") Firebase.crashlytics.setCustomKey("google_signin_error_type", e.javaClass.simpleName) - Firebase.crashlytics.setCustomKey("google_signin_error_message", e.message ?: "") + Firebase.crashlytics.setCustomKey("google_signin_error_message", "A credential error occurred.") GoogleLoginState.ERROR_MESSAGE_UNKNOWN } } From 78ba473dd5a24ee6739a98d41dd631b72d876b57 Mon Sep 17 00:00:00 2001 From: SuHyeon00 Date: Thu, 26 Feb 2026 01:35:45 +0900 Subject: [PATCH 17/18] :recycle: Refactor: loop for google-services, dynamic Discord title, default qa --- bitrise.yml | 88 +++++++++++++++++++++++------------------------------ 1 file changed, 38 insertions(+), 50 deletions(-) diff --git a/bitrise.yml b/bitrise.yml index 6240ab68c..f4cefdd88 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -32,29 +32,19 @@ workflows: fi fi - if [ -n "$GOOGLE_SERVICES_JSON_DEBUG" ]; then - mkdir -p app/src/debug - echo "$GOOGLE_SERVICES_JSON_DEBUG" | base64 -d > app/src/debug/google-services.json - echo "✓ Created app/src/debug/google-services.json" - else - echo "⚠ Warning: GOOGLE_SERVICES_JSON_DEBUG not set" - fi - - if [ -n "$GOOGLE_SERVICES_JSON_QA" ]; then - mkdir -p app/src/qa - echo "$GOOGLE_SERVICES_JSON_QA" | base64 -d > app/src/qa/google-services.json - echo "✓ Created app/src/qa/google-services.json" - else - echo "⚠ Warning: GOOGLE_SERVICES_JSON_QA not set" - fi - - if [ -n "$GOOGLE_SERVICES_JSON_RELEASE" ]; then - mkdir -p app/src/release - echo "$GOOGLE_SERVICES_JSON_RELEASE" | base64 -d > app/src/release/google-services.json - echo "✓ Created app/src/release/google-services.json" - else - echo "⚠ Warning: GOOGLE_SERVICES_JSON_RELEASE not set" - fi + for type in DEBUG QA RELEASE; do + env_var_name="GOOGLE_SERVICES_JSON_${type}" + lowercase_type=$(echo "$type" | tr '[:upper:]' '[:lower:]') + file_path="app/src/${lowercase_type}/google-services.json" + + if [ -n "${!env_var_name}" ]; then + mkdir -p "app/src/${lowercase_type}" + echo "${!env_var_name}" | base64 -d > "$file_path" + echo "✓ Created $file_path" + else + echo "⚠ Warning: ${env_var_name} not set" + fi + done echo "Google Services JSON files setup completed for build type: $BUILD_TYPE" @@ -122,8 +112,8 @@ workflows: GRADLE_TASK="assembleRelease" ;; *) - echo "Unknown BUILD_TYPE: $BUILD_TYPE, defaulting to debug" - GRADLE_TASK="assembleDebug" + echo "Unknown BUILD_TYPE: $BUILD_TYPE, defaulting to qa" + GRADLE_TASK="assembleQa" ;; esac @@ -161,10 +151,12 @@ workflows: EMOJI="✅" STATUS="Build Success" COLOR=3066993 + TITLE="📱 Edison Android Build Success" else EMOJI="❌" STATUS="Build Failed" COLOR=15158332 + TITLE="📱 Edison Android Build Failed" fi jq -n \ @@ -176,12 +168,13 @@ workflows: --arg version "$BITRISE_APP_VERSION" \ --arg download_url "$BITRISE_APP_URL" \ --argjson color "$COLOR" \ + --arg title "$TITLE" \ '{ username: $username, avatar_url: $avatar_url, content: $content, embeds: [{ - title: "📱 Edison Android Build Success", + title: $title, color: $color, fields: [ { @@ -240,29 +233,19 @@ workflows: #!/bin/bash set -e - if [ -n "$GOOGLE_SERVICES_JSON_DEBUG" ]; then - mkdir -p app/src/debug - echo "$GOOGLE_SERVICES_JSON_DEBUG" | base64 -d > app/src/debug/google-services.json - echo "✓ Created app/src/debug/google-services.json" - else - echo "⚠ Warning: GOOGLE_SERVICES_JSON_DEBUG not set" - fi - - if [ -n "$GOOGLE_SERVICES_JSON_QA" ]; then - mkdir -p app/src/qa - echo "$GOOGLE_SERVICES_JSON_QA" | base64 -d > app/src/qa/google-services.json - echo "✓ Created app/src/qa/google-services.json" - else - echo "⚠ Warning: GOOGLE_SERVICES_JSON_QA not set" - fi - - if [ -n "$GOOGLE_SERVICES_JSON_RELEASE" ]; then - mkdir -p app/src/release - echo "$GOOGLE_SERVICES_JSON_RELEASE" | base64 -d > app/src/release/google-services.json - echo "✓ Created app/src/release/google-services.json" - else - echo "⚠ Warning: GOOGLE_SERVICES_JSON_RELEASE not set" - fi + for type in DEBUG QA RELEASE; do + env_var_name="GOOGLE_SERVICES_JSON_${type}" + lowercase_type=$(echo "$type" | tr '[:upper:]' '[:lower:]') + file_path="app/src/${lowercase_type}/google-services.json" + + if [ -n "${!env_var_name}" ]; then + mkdir -p "app/src/${lowercase_type}" + echo "${!env_var_name}" | base64 -d > "$file_path" + echo "✓ Created $file_path" + else + echo "⚠ Warning: ${env_var_name} not set" + fi + done echo "Google Services JSON files setup completed" @@ -352,25 +335,30 @@ workflows: EMOJI="✅" STATUS="Build Success" COLOR=3066993 + TITLE="📱 Edison Android Release Build Success" else EMOJI="❌" STATUS="Build Failed" COLOR=15158332 + TITLE="📱 Edison Android Release Build Failed" fi jq -n \ --arg username "Android Build Bot" \ + --arg avatar_url "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png" \ --arg content "${EMOJI} **${STATUS}**" \ --arg branch "$BITRISE_GIT_BRANCH" \ --arg build_type "release" \ --arg version "$BITRISE_APP_VERSION" \ --arg download_url "$BITRISE_APP_URL" \ --argjson color "$COLOR" \ + --arg title "$TITLE" \ '{ username: $username, + avatar_url: $avatar_url, content: $content, embeds: [{ - title: "📱 Edison Android Release Build Success", + title: $title, color: $color, fields: [ { From f3af95432f78c117e03d4f8d67227fdb9ff3f10f Mon Sep 17 00:00:00 2001 From: SuHyeon00 Date: Thu, 26 Feb 2026 01:49:12 +0900 Subject: [PATCH 18/18] :sparkles: Feature: add triggers --- bitrise.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/bitrise.yml b/bitrise.yml index f4cefdd88..18b61bd7d 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -3,6 +3,9 @@ default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git workflows: build-qa: + triggers: + push: + - branch: "develop" steps: - activate-ssh-key@4: run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' @@ -212,6 +215,10 @@ workflows: "$DISCORD_WEBHOOK_URL" || echo "Discord notification failed" build-release: + triggers: + push: + - branch: "main" + - branch: "develop" steps: - activate-ssh-key@4: run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}'