From 14703f6056f8e9f9166b740f5511c30a2852cdfe Mon Sep 17 00:00:00 2001 From: Sk Niyaj Ali Date: Wed, 27 Nov 2024 15:19:31 +0530 Subject: [PATCH] chore: Fixed Fastlane & Firebase App Distribution Workflow (#1822) * Chore: Updated Fastlane and CI for release This commit adds Fastlane for automating the Android release process and configures CI for internal, beta, and production releases using GitHub Actions. The following changes were made: - Added Fastlane configuration files for building, testing, and deploying the app. - Added GitHub Actions workflows for triggering internal, beta, and production releases. - Updated .gitignore to exclude Fastlane report files. - Updated dependency versions in Gemfile.lock. - Added a README for Fastlane. - Updated the make_site workflow to trigger on released releases instead of published releases. --- .github/actions/inflate-secrets/action.yml | 8 +- .../workflows/internal_or_beta_release.yml | 95 ++++++++++++++++--- .github/workflows/make_site.yaml | 6 +- .github/workflows/release_to_production.yml | 21 +++- .gitignore | 7 +- .ruby-version | 1 + Gemfile | 2 + Gemfile.lock | 67 +++++++------ fastlane/FastFile | 36 ++++++- fastlane/PluginFile | 4 +- fastlane/README.md | 69 ++++++++++++++ fastlane/report.xml | 18 ++++ mifospay-android/build.gradle.kts | 12 +-- 13 files changed, 283 insertions(+), 63 deletions(-) create mode 100644 .ruby-version create mode 100644 fastlane/README.md create mode 100644 fastlane/report.xml diff --git a/.github/actions/inflate-secrets/action.yml b/.github/actions/inflate-secrets/action.yml index 617bd9dca..d3a6714af 100644 --- a/.github/actions/inflate-secrets/action.yml +++ b/.github/actions/inflate-secrets/action.yml @@ -25,7 +25,7 @@ runs: shell: bash env: KEYSTORE: ${{ inputs.keystore }} - run: | + run: | echo $KEYSTORE | base64 --decode > mifospay-android/release_keystore.keystore - name: Inflate google-services.json @@ -40,11 +40,13 @@ runs: env: CREDS: ${{ inputs.playstore-creds }} run: | + # Create the file with appropriate permissions + touch mifospay-android/playStorePublishServiceCredentialsFile.json echo $CREDS > mifospay-android/playStorePublishServiceCredentialsFile.json - name: Inflate firebaseAppDistributionServiceCredentialsFile.json shell: bash env: - CREDS: ${{ inputs.firebase-creds }} + FIREBASE_CREDS: ${{ inputs.firebase-creds }} run: | - echo $CREDS > mifospay-android/firebaseAppDistributionServiceCredentialsFile.json \ No newline at end of file + echo $FIREBASE_CREDS > mifospay-android/firebaseAppDistributionServiceCredentialsFile.json \ No newline at end of file diff --git a/.github/workflows/internal_or_beta_release.yml b/.github/workflows/internal_or_beta_release.yml index 2fcf1da91..efa249386 100644 --- a/.github/workflows/internal_or_beta_release.yml +++ b/.github/workflows/internal_or_beta_release.yml @@ -12,11 +12,23 @@ on: - internal - beta + publish_to_play_store: + required: false + default: false + description: Publish to Play Store? + type: boolean + + publish_ios: + required: false + default: false + description: Publish to Firebase iOS App Distribution? + type: boolean + env: SUPPLY_UPLOAD_MAX_RETRIES: 5 jobs: - build_desktop_app: + build_desktop_and_ios_app: strategy: matrix: os: @@ -41,9 +53,28 @@ jobs: NOTARIZATION_TEAM_ID: ${{ secrets.NOTARIZATION_TEAM_ID }} run: ./gradlew packageReleaseDistributionForCurrentOS - app_build: + - name: Configure Ruby + if: matrix.os == 'macos-latest' + uses: ruby/setup-ruby@a2bbe5b1b236842c1cb7dd11e8e3b51e0a616acc # v1.202.0 + with: + bundler-cache: true + + - name: Install Fastlane + if: matrix.os == 'macos-latest' + run: | + gem install bundler:2.2.27 + bundle install --jobs 4 --retry 3 + bundle exec fastlane add_plugin firebase_app_distribution + bundle exec fastlane add_plugin increment_build_number + + - name: Build iOS App + if: matrix.os == 'macos-latest' + continue-on-error: true + run: bundle exec fastlane ios build_ios + + distribute_android_app: name: Github, Firebase Release - needs: [ build_desktop_app ] + needs: [ build_desktop_and_ios_app ] runs-on: ubuntu-latest permissions: contents: write @@ -58,11 +89,6 @@ jobs: distribution: 'temurin' java-version: '17' - - uses: ruby/setup-ruby@v1 - with: - ruby-version: '3.2' - bundler-cache: true - - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 @@ -122,7 +148,7 @@ jobs: ./mifospay-desktop/build/compose/binaries/main-release/msi/*.msi ./mifospay-desktop/build/compose/binaries/main-release/deb/*.deb ./mifospay-desktop/build/compose/binaries/main-release/dmg/*.dmg - + - name: ☁️ Deploy to Firebase env: @@ -135,9 +161,47 @@ jobs: - name: Print `git status` run: git status + distribute_ios_app: + name: Build iOS App + if: ${{ github.event.inputs.release_type == 'beta' && github.event.inputs.publish_ios == true }} + needs: [ distribute_android_app ] + runs-on: macos-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4.2.2 + with: + distribution: 'temurin' + java-version: '17' + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Configure Ruby + uses: ruby/setup-ruby@a2bbe5b1b236842c1cb7dd11e8e3b51e0a616acc # v1.202.0 + with: + bundler-cache: true + + - name: Install Fastlane + run: | + gem install bundler:2.2.27 + bundle install --jobs 4 --retry 3 + bundle exec fastlane add_plugin firebase_app_distribution + bundle exec fastlane add_plugin increment_build_number + + - name: Upload iOS App to Firebase Distribution + run: bundle exec fastlane ios distribute_ios_app + + - name: Print `git status` + run: git status + play_publish: name: Play Publish - runs-on: ubuntu-latest + if: ${{ inputs.publish_to_play_store == true }} + runs-on: macos-latest concurrency: group: playstore_deploy permissions: @@ -153,11 +217,18 @@ jobs: distribution: 'temurin' java-version: '17' - - uses: ruby/setup-ruby@v1 + - name: Configure Ruby + uses: ruby/setup-ruby@a2bbe5b1b236842c1cb7dd11e8e3b51e0a616acc # v1.202.0 with: - ruby-version: '3.2' bundler-cache: true + - name: Install Fastlane + run: | + gem install bundler:2.2.27 + bundle install --jobs 4 --retry 3 + bundle exec fastlane add_plugin firebase_app_distribution + bundle exec fastlane add_plugin increment_build_number + - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 diff --git a/.github/workflows/make_site.yaml b/.github/workflows/make_site.yaml index c9fc0852f..44fc02037 100644 --- a/.github/workflows/make_site.yaml +++ b/.github/workflows/make_site.yaml @@ -1,12 +1,12 @@ name: Publish Web App on: - # Runs on pushes targeting the default branch - push: + pull_request: branches: [ "dev" ] + types: [ closed ] # Trigger on new releases release: - types: [ published ] + types: [ released ] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: diff --git a/.github/workflows/release_to_production.yml b/.github/workflows/release_to_production.yml index c9360d923..305f1d173 100644 --- a/.github/workflows/release_to_production.yml +++ b/.github/workflows/release_to_production.yml @@ -2,6 +2,12 @@ name: Production Deploy on: workflow_dispatch: + inputs: + publish_to_play_store: + required: false + default: false + description: Publish to Play Store? + type: boolean release: types: [ released ] @@ -11,15 +17,21 @@ env: jobs: play_promote_production: name: Play Publish Production - runs-on: ubuntu-latest + if: ${{ inputs.publish_to_play_store == true }} + runs-on: macos-latest steps: - uses: actions/checkout@v4 - - uses: ruby/setup-ruby@v1 + - name: Configure Ruby + uses: ruby/setup-ruby@a2bbe5b1b236842c1cb7dd11e8e3b51e0a616acc # v1.202.0 with: - ruby-version: '3.2' bundler-cache: true + - name: Install Bundler + run: | + gem install bundler:2.2.27 + bundle install --jobs 4 --retry 3 + - uses: ./.github/actions/inflate-secrets name: Inflate Secrets with: @@ -29,4 +41,5 @@ jobs: firebase-creds: ${{ secrets.FIREBASECREDS }} - name: Promote Beta to Production Play Store - run: bundle exec fastlane promote_to_production + run: | + bundle exec fastlane promote_to_production diff --git a/.gitignore b/.gitignore index 829a53440..1f814a674 100644 --- a/.gitignore +++ b/.gitignore @@ -48,9 +48,6 @@ mifospay-shared/mifospay-shared.podspec !/.idea/codeStyles/Project.xml !/.idea/codeStyles/codeStyleConfig.xml -# Gradle cache -.gradle - # Kotlin .kotlin @@ -62,12 +59,12 @@ app/app.iml app/manifest-merger-release-report.txt # Exclude Google services from prod flavour -mifospay/src/prod/google-services.json +mifospay-android/src/prod/google-services.json #*.keystore version.txt - +fastlane/report.xml firebaseAppDistributionServiceCredentialsFile.json playStorePublishServiceCredentialsFile.json diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 000000000..0163af7e8 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +3.3.5 \ No newline at end of file diff --git a/Gemfile b/Gemfile index 1e4d11c03..205f1c3a3 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,7 @@ source "https://rubygems.org" +ruby File.read(".ruby-version").strip + gem "fastlane" plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') diff --git a/Gemfile.lock b/Gemfile.lock index 965cf8985..b980c483d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -10,20 +10,20 @@ GEM artifactory (3.0.17) atomos (0.1.3) aws-eventstream (1.3.0) - aws-partitions (1.971.0) - aws-sdk-core (3.203.0) + aws-partitions (1.1013.0) + aws-sdk-core (3.214.0) aws-eventstream (~> 1, >= 1.3.0) - aws-partitions (~> 1, >= 1.651.0) + aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.89.0) - aws-sdk-core (~> 3, >= 3.203.0) + aws-sdk-kms (1.96.0) + aws-sdk-core (~> 3, >= 3.210.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.160.0) - aws-sdk-core (~> 3, >= 3.203.0) + aws-sdk-s3 (1.174.0) + aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) - aws-sigv4 (1.9.1) + aws-sigv4 (1.10.1) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) base64 (0.2.0) @@ -38,8 +38,8 @@ GEM domain_name (0.6.20240107) dotenv (2.8.1) emoji_regex (3.2.3) - excon (0.111.0) - faraday (1.10.3) + excon (0.112.0) + faraday (1.10.4) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) @@ -65,10 +65,10 @@ GEM faraday-patron (1.0.0) faraday-rack (1.0.0) faraday-retry (1.0.3) - faraday_middleware (1.2.0) + faraday_middleware (1.2.1) faraday (~> 1.0) fastimage (2.3.1) - fastlane (2.222.0) + fastlane (2.225.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -84,6 +84,7 @@ GEM faraday-cookie_jar (~> 0.0.6) faraday_middleware (~> 1.0) fastimage (>= 2.1.0, < 3.0.0) + fastlane-sirp (>= 1.0.0) gh_inspector (>= 1.1.2, < 2.0.0) google-apis-androidpublisher_v3 (~> 0.3) google-apis-playcustomapp_v1 (~> 0.1) @@ -109,7 +110,12 @@ GEM xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3, < 2.0.0) - fastlane-plugin-increment_version_code (0.4.3) + fastlane-plugin-firebase_app_distribution (0.9.1) + google-apis-firebaseappdistribution_v1 (~> 0.3.0) + google-apis-firebaseappdistribution_v1alpha (~> 0.2.0) + fastlane-plugin-increment_build_number (0.0.4) + fastlane-sirp (1.0.0) + sysrandom (~> 1.0) gh_inspector (1.1.3) google-apis-androidpublisher_v3 (0.54.0) google-apis-core (>= 0.11.0, < 2.a) @@ -121,6 +127,10 @@ GEM representable (~> 3.0) retriable (>= 2.0, < 4.a) rexml + google-apis-firebaseappdistribution_v1 (0.3.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-firebaseappdistribution_v1alpha (0.2.0) + google-apis-core (>= 0.11.0, < 2.a) google-apis-iamcredentials_v1 (0.17.0) google-apis-core (>= 0.11.0, < 2.a) google-apis-playcustomapp_v1 (0.13.0) @@ -152,17 +162,17 @@ GEM domain_name (~> 0.5) httpclient (2.8.3) jmespath (1.6.2) - json (2.7.2) - jwt (2.8.2) + json (2.8.2) + jwt (2.9.3) base64 mini_magick (4.13.2) mini_mime (1.1.5) multi_json (1.15.0) multipart-post (2.4.1) - nanaimo (0.3.0) + nanaimo (0.4.0) naturally (2.2.1) nkf (0.2.0) - optparse (0.5.0) + optparse (0.6.0) os (1.1.4) plist (3.7.1) public_suffix (6.0.1) @@ -172,7 +182,7 @@ GEM trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.3.7) + rexml (3.3.9) rouge (2.0.7) ruby2_keywords (0.0.5) rubyzip (2.3.2) @@ -185,6 +195,7 @@ GEM simctl (1.6.10) CFPropertyList naturally + sysrandom (1.0.5) terminal-notifier (2.0.0) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) @@ -194,29 +205,31 @@ GEM tty-spinner (0.9.3) tty-cursor (~> 0.7) uber (0.1.0) - unicode-display_width (2.5.0) + unicode-display_width (2.6.0) word_wrap (1.0.0) - xcodeproj (1.25.0) + xcodeproj (1.27.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) colored2 (~> 3.1) - nanaimo (~> 0.3.0) - rexml (>= 3.3.2, < 4.0) + nanaimo (~> 0.4.0) + rexml (>= 3.3.6, < 4.0) xcpretty (0.3.0) rouge (~> 2.0.7) xcpretty-travis-formatter (1.0.1) xcpretty (~> 0.2, >= 0.0.7) PLATFORMS - arm64-darwin-22 + ruby x64-mingw-ucrt - x86_64-linux - DEPENDENCIES fastlane - fastlane-plugin-increment_version_code + fastlane-plugin-firebase_app_distribution + fastlane-plugin-increment_build_number + +RUBY VERSION + ruby 3.3.5p100 BUNDLED WITH - 2.5.18 + 2.5.23 diff --git a/fastlane/FastFile b/fastlane/FastFile index 4dd5b1c91..b93ef81a3 100644 --- a/fastlane/FastFile +++ b/fastlane/FastFile @@ -34,4 +34,38 @@ platform :android do ) end -end \ No newline at end of file +end + + +platform :ios do + desc "Build iOS application" + lane :build_ios do + build_ios_app( + project: "mifospay-ios/iosApp.xcodeproj/project.pbxproj", + # Set configuration to debug for now + configuration: "Debug", + output_directory: "mifospay-ios/", + output_name: "mifospay-ios-app" + ) + end + + desc "Upload iOS application to Firebase App Distribution" + lane :distribute_ios_app do + increment_build_number( + xcodeproj: "mifospay-ios/iosApp.xcodeproj/project.pbxproj" + ) + + build_ios_app( + project: "mifospay-ios/iosApp.xcodeproj/project.pbxproj", + # Set configuration to debug for now + configuration: "Debug", + ) + release = firebase_app_distribution( + app: "1:728434912738:ios:86a7badfaed88b841a1dbb", + service_credentials_file: "mifospay-android/firebaseAppDistributionServiceCredentialsFile.json", + release_notes_file: "mifospay-android/build/outputs/changelogBeta", + groups: "mifos-wallet-testers" + ) + + end +end diff --git a/fastlane/PluginFile b/fastlane/PluginFile index 32ea0b1fb..c3f69f2b0 100644 --- a/fastlane/PluginFile +++ b/fastlane/PluginFile @@ -1,5 +1,5 @@ # Autogenerated by fastlane # # Ensure this file is checked in to source control! - -gem 'fastlane-plugin-increment_version_code' \ No newline at end of file +gem 'fastlane-plugin-firebase_app_distribution' +gem 'fastlane-plugin-increment_build_number' diff --git a/fastlane/README.md b/fastlane/README.md new file mode 100644 index 000000000..60dee619b --- /dev/null +++ b/fastlane/README.md @@ -0,0 +1,69 @@ +fastlane documentation +---- + +# Installation + +Make sure you have the latest version of the Xcode command line tools installed: + +```sh +xcode-select --install +``` + +For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane) + +# Available Actions + +## Android + +### android deploy_internal + +```sh +[bundle exec] fastlane android deploy_internal +``` + +Deploy internal tracks to Google Play + +### android promote_to_beta + +```sh +[bundle exec] fastlane android promote_to_beta +``` + +Promote internal tracks to beta on Google Play + +### android promote_to_production + +```sh +[bundle exec] fastlane android promote_to_production +``` + +Promote beta tracks to production on Google Play + +---- + + +## iOS + +### ios build_ios + +```sh +[bundle exec] fastlane ios build_ios +``` + +Build iOS application + +### ios distribute_ios_app + +```sh +[bundle exec] fastlane ios distribute_ios_app +``` + +Upload iOS application to Firebase App Distribution + +---- + +This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. + +More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools). + +The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools). diff --git a/fastlane/report.xml b/fastlane/report.xml new file mode 100644 index 000000000..b27157959 --- /dev/null +++ b/fastlane/report.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/mifospay-android/build.gradle.kts b/mifospay-android/build.gradle.kts index d89c9c714..440124dca 100644 --- a/mifospay-android/build.gradle.kts +++ b/mifospay-android/build.gradle.kts @@ -86,6 +86,12 @@ android { isIncludeAndroidResources = true } } + + firebaseAppDistribution { + serviceCredentialsFile = "mifospay-android/firebaseAppDistributionServiceCredentialsFile.json" + releaseNotesFile = "mifospay-android/build/outputs/changelogBeta" + groups = "mifos-wallet-testers" + } } dependencies { @@ -144,12 +150,6 @@ dependencyGuard { } } -firebaseAppDistribution { - serviceCredentialsFile = "mifospay-android/firebaseAppDistributionServiceCredentialsFile.json" - releaseNotesFile = "./mifospay-android/build/outputs/changelogBeta" - groups = "mifos-wallet-testers" -} - // Disable to fix memory leak and be compatible with the configuration cache. configure { disableVersionCheck = true