From c8ee2bb59233f0cf6574339ae1e19e8f8e6ff53a Mon Sep 17 00:00:00 2001 From: hari-testpress Date: Mon, 28 Mar 2022 14:06:54 +0530 Subject: [PATCH 1/3] Setup Fastlane --- Gemfile | 6 + Gemfile.lock | 222 ++++++++++++++++++ app/src/main/assets/config.json | 18 +- fastlane/Appfile | 2 + fastlane/Fastfile | 66 ++++++ fastlane/Pluginfile | 7 + fastlane/README.md | 70 ++++++ .../actions/convert_base64_into_string.rb | 22 ++ fastlane/actions/get_app_config.rb | 14 ++ fastlane/actions/modify_config_json_file.rb | 39 +++ .../actions/replace_google_services_json.rb | 25 ++ 11 files changed, 482 insertions(+), 9 deletions(-) create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 fastlane/Appfile create mode 100644 fastlane/Fastfile create mode 100644 fastlane/Pluginfile create mode 100644 fastlane/README.md create mode 100644 fastlane/actions/convert_base64_into_string.rb create mode 100644 fastlane/actions/get_app_config.rb create mode 100644 fastlane/actions/modify_config_json_file.rb create mode 100644 fastlane/actions/replace_google_services_json.rb diff --git a/Gemfile b/Gemfile new file mode 100644 index 000000000..cdd3a6b34 --- /dev/null +++ b/Gemfile @@ -0,0 +1,6 @@ +source "https://rubygems.org" + +gem "fastlane" + +plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') +eval_gemfile(plugins_path) if File.exist?(plugins_path) diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 000000000..b2bdd9dde --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,222 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.5) + rexml + addressable (2.8.0) + public_suffix (>= 2.0.2, < 5.0) + artifactory (3.0.15) + atomos (0.1.3) + aws-eventstream (1.2.0) + aws-partitions (1.570.0) + aws-sdk-core (3.130.0) + aws-eventstream (~> 1, >= 1.0.2) + aws-partitions (~> 1, >= 1.525.0) + aws-sigv4 (~> 1.1) + jmespath (~> 1.0) + aws-sdk-kms (1.55.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.113.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.4) + aws-sigv4 (1.4.0) + aws-eventstream (~> 1, >= 1.0.2) + babosa (1.0.4) + claide (1.1.0) + colored (1.2) + colored2 (3.1.2) + commander (4.6.0) + highline (~> 2.0.0) + declarative (0.0.20) + digest-crc (0.6.4) + rake (>= 12.0.0, < 14.0.0) + domain_name (0.5.20190701) + unf (>= 0.0.5, < 1.0.0) + dotenv (2.7.6) + emoji_regex (3.2.3) + excon (0.92.1) + faraday (1.10.0) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) + faraday-excon (~> 1.1) + faraday-httpclient (~> 1.0) + faraday-multipart (~> 1.0) + faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.0) + faraday-patron (~> 1.0) + faraday-rack (~> 1.0) + faraday-retry (~> 1.0) + ruby2_keywords (>= 0.0.4) + faraday-cookie_jar (0.0.7) + faraday (>= 0.8.0) + http-cookie (~> 1.0.0) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) + faraday-excon (1.1.0) + faraday-httpclient (1.0.1) + faraday-multipart (1.0.3) + multipart-post (>= 1.2, < 3) + faraday-net_http (1.0.1) + faraday-net_http_persistent (1.2.0) + faraday-patron (1.0.0) + faraday-rack (1.0.0) + faraday-retry (1.0.3) + faraday_middleware (1.2.0) + faraday (~> 1.0) + fastimage (2.2.6) + fastlane (2.205.1) + CFPropertyList (>= 2.3, < 4.0.0) + addressable (>= 2.8, < 3.0.0) + artifactory (~> 3.0) + aws-sdk-s3 (~> 1.0) + babosa (>= 1.0.3, < 2.0.0) + bundler (>= 1.12.0, < 3.0.0) + colored + commander (~> 4.6) + dotenv (>= 2.1.1, < 3.0.0) + emoji_regex (>= 0.1, < 4.0) + excon (>= 0.71.0, < 1.0.0) + faraday (~> 1.0) + faraday-cookie_jar (~> 0.0.6) + faraday_middleware (~> 1.0) + fastimage (>= 2.1.0, < 3.0.0) + gh_inspector (>= 1.1.2, < 2.0.0) + google-apis-androidpublisher_v3 (~> 0.3) + google-apis-playcustomapp_v1 (~> 0.1) + google-cloud-storage (~> 1.31) + highline (~> 2.0) + json (< 3.0.0) + jwt (>= 2.1.0, < 3) + mini_magick (>= 4.9.4, < 5.0.0) + multipart-post (~> 2.0.0) + naturally (~> 2.2) + optparse (~> 0.1.1) + plist (>= 3.1.0, < 4.0.0) + rubyzip (>= 2.0.0, < 3.0.0) + security (= 0.1.3) + simctl (~> 1.6.3) + terminal-notifier (>= 2.0.0, < 3.0.0) + terminal-table (>= 1.4.5, < 2.0.0) + tty-screen (>= 0.6.3, < 1.0.0) + tty-spinner (>= 0.8.0, < 1.0.0) + word_wrap (~> 1.0.0) + xcodeproj (>= 1.13.0, < 2.0.0) + xcpretty (~> 0.3.0) + xcpretty-travis-formatter (>= 0.0.3) + fastlane-plugin-download_file (1.0.0) + fastlane-plugin-json (1.1.0) + gh_inspector (1.1.3) + google-apis-androidpublisher_v3 (0.16.0) + google-apis-core (>= 0.4, < 2.a) + google-apis-core (0.4.2) + addressable (~> 2.5, >= 2.5.1) + googleauth (>= 0.16.2, < 2.a) + httpclient (>= 2.8.1, < 3.a) + mini_mime (~> 1.0) + representable (~> 3.0) + retriable (>= 2.0, < 4.a) + rexml + webrick + google-apis-iamcredentials_v1 (0.10.0) + google-apis-core (>= 0.4, < 2.a) + google-apis-playcustomapp_v1 (0.7.0) + google-apis-core (>= 0.4, < 2.a) + google-apis-storage_v1 (0.11.0) + google-apis-core (>= 0.4, < 2.a) + google-cloud-core (1.6.0) + google-cloud-env (~> 1.0) + google-cloud-errors (~> 1.0) + google-cloud-env (1.6.0) + faraday (>= 0.17.3, < 3.0) + google-cloud-errors (1.2.0) + google-cloud-storage (1.36.1) + addressable (~> 2.8) + digest-crc (~> 0.4) + google-apis-iamcredentials_v1 (~> 0.1) + google-apis-storage_v1 (~> 0.1) + google-cloud-core (~> 1.6) + googleauth (>= 0.16.2, < 2.a) + mini_mime (~> 1.0) + googleauth (1.1.2) + faraday (>= 0.17.3, < 3.a) + jwt (>= 1.4, < 3.0) + memoist (~> 0.16) + multi_json (~> 1.11) + os (>= 0.9, < 2.0) + signet (>= 0.16, < 2.a) + highline (2.0.3) + http-cookie (1.0.4) + domain_name (~> 0.5) + httpclient (2.8.3) + jmespath (1.6.1) + json (2.6.1) + jwt (2.3.0) + memoist (0.16.2) + mini_magick (4.11.0) + mini_mime (1.1.2) + multi_json (1.15.0) + multipart-post (2.0.0) + nanaimo (0.3.0) + naturally (2.2.1) + optparse (0.1.1) + os (1.1.4) + plist (3.6.0) + public_suffix (4.0.6) + rake (13.0.6) + representable (3.1.1) + declarative (< 0.1.0) + trailblazer-option (>= 0.1.1, < 0.2.0) + uber (< 0.2.0) + retriable (3.1.2) + rexml (3.2.5) + rouge (2.0.7) + ruby2_keywords (0.0.5) + rubyzip (2.3.2) + security (0.1.3) + signet (0.16.1) + addressable (~> 2.8) + faraday (>= 0.17.5, < 3.0) + jwt (>= 1.5, < 3.0) + multi_json (~> 1.10) + simctl (1.6.8) + CFPropertyList + naturally + terminal-notifier (2.0.0) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + trailblazer-option (0.1.2) + tty-cursor (0.7.1) + tty-screen (0.8.1) + tty-spinner (0.9.3) + tty-cursor (~> 0.7) + uber (0.1.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.8.1) + unicode-display_width (1.8.0) + webrick (1.7.0) + word_wrap (1.0.0) + xcodeproj (1.21.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.2.4) + xcpretty (0.3.0) + rouge (~> 2.0.7) + xcpretty-travis-formatter (1.0.1) + xcpretty (~> 0.2, >= 0.0.7) + +PLATFORMS + x86_64-linux + +DEPENDENCIES + fastlane + fastlane-plugin-download_file + fastlane-plugin-json + +BUNDLED WITH + 2.3.10 diff --git a/app/src/main/assets/config.json b/app/src/main/assets/config.json index caedbe551..7bef9dd69 100644 --- a/app/src/main/assets/config.json +++ b/app/src/main/assets/config.json @@ -1,16 +1,16 @@ { - "version" : "1.1.7", - "version_code" : 9, - "testpress_site_subdomain" : "sandbox", - "package_name" : "in.testpress.sandbox", - "app_name" : "Testpress Sandbox", + "version": "1.1.8", + "version_code": 11, + "testpress_site_subdomain": "sandbox", + "package_name": "in.testpress.sandbox", + "app_name": "Testpress Sandbox", "share_message": "Good app to prepare for online exams.", "primary_color": "3598db", - "allow_anonymous_user" : false, - "facebook_app_id" : "733962776688753", - "server_client_id" : "1064046661341-itk3upke5nqs5mrcrflbhi9dia3vl2se.apps.googleusercontent.com", + "allow_anonymous_user": false, + "facebook_app_id": "733962776688753", + "server_client_id": "1064046661341-mjt8u4afj2qm33hriajm5sbrsrafcs4r.apps.googleusercontent.com", "display_username_on_video": true, "white_labeled_host_url": null, "is_growth_hacks_enabled": false, "show_pdf_vertically": true -} \ No newline at end of file +} diff --git a/fastlane/Appfile b/fastlane/Appfile new file mode 100644 index 000000000..e90a59a7a --- /dev/null +++ b/fastlane/Appfile @@ -0,0 +1,2 @@ +json_key_file("") +package_name("") diff --git a/fastlane/Fastfile b/fastlane/Fastfile new file mode 100644 index 000000000..625017c93 --- /dev/null +++ b/fastlane/Fastfile @@ -0,0 +1,66 @@ +desc "Generate Android App Bundle" +lane :generate_bundle do |signing_config| + sh("cd ..;echo '%s' | base64 --decode > $(pwd)/app/keystore.jks" %[signing_config[:keystore_file]]) + gradle( + task: "bundleRelease", + print_command: false, + properties: { + "android.injected.signing.store.file" => "keystore.jks", + "android.injected.signing.store.password" => signing_config[:keystore_password], + "android.injected.signing.key.alias" => signing_config[:key_alias], + "android.injected.signing.key.password" => signing_config[:key_password], + }) +end + +desc "Deploy a new version to the Google Play" +lane :deploy do + config_json = read_json(json_string: get_app_config()) + generate_bundle( + keystore_file: config_json[:keystore_file], + keystore_password: config_json[:keystore_password], + key_password: config_json[:key_password], + key_alias: config_json[:key_alias] + ) + upload_to_play_store( + skip_upload_apk: true, + package_name: config_json[:package_name], + json_key_data: convert_base64_into_string(data: config_json[:json_key_file]), + ) +end + +lane :replace_google_services do + config_json = read_json(json_string: get_app_config()) + replace_google_services_json(google_services_json: config_json[:google_services_json]) +end + +lane :replace_images do |config_json| + config_json = read_json(json_string: get_app_config()) + download_file(url: config_json[:splash_screen1], destination_path: './app/src/main/res/drawable/splash_screen.png') + download_file(url: config_json[:splash_screen2], destination_path: './app/src/main/res/drawable-land/splash_screen.png') + download_file(url: config_json[:splash_screen3], destination_path: './app/src/main/res/drawable-large/splash_screen.png') + download_file(url: config_json[:splash_screen4], destination_path: './app/src/main/res/drawable-large-land/splash_screen.png') + download_file(url: config_json[:notification1], destination_path: './app/src/main/res/drawable-mdpi/ic_stat_notification.png') + download_file(url: config_json[:notification2], destination_path: './app/src/main/res/drawable-hdpi/ic_stat_notification.png') + download_file(url: config_json[:notification3], destination_path: './app/src/main/res/drawable-xhdpi/ic_stat_notification.png') + download_file(url: config_json[:notification4], destination_path: './app/src/main/res/drawable-xxhdpi/ic_stat_notification.png') + download_file(url: config_json[:notification5], destination_path: './app/src/main/res/drawable-xxxhdpi/ic_stat_notification.png') + download_file(url: config_json[:launcher1], destination_path: './app/src/main/res/mipmap-mdpi/ic_launcher.png') + download_file(url: config_json[:launcher2], destination_path: './app/src/main/res/mipmap-hdpi/ic_launcher.png') + download_file(url: config_json[:launcher3], destination_path: './app/src/main/res/mipmap-xhdpi/ic_launcher.png') + download_file(url: config_json[:launcher4], destination_path: './app/src/main/res/mipmap-xxhdpi/ic_launcher.png') + download_file(url: config_json[:launcher5], destination_path: './app/src/main/res/mipmap-xxxhdpi/ic_launcher.png') + download_file(url: config_json[:login_screen_image], destination_path: './app/src/main/res/drawable/login_screen_image.png') +end + + +lane :modify_config_json do + modify_config_json_file(config_json: get_app_config()) +end + +lane :generate_debug_apk do + gradle( + task: "assemble", + build_type: "Debug" + ) +end + diff --git a/fastlane/Pluginfile b/fastlane/Pluginfile new file mode 100644 index 000000000..02d825dbb --- /dev/null +++ b/fastlane/Pluginfile @@ -0,0 +1,7 @@ +# Autogenerated by fastlane +# +# Ensure this file is checked in to source control! + +gem 'fastlane-plugin-json' +gem 'fastlane-plugin-json' +gem 'fastlane-plugin-download_file' diff --git a/fastlane/README.md b/fastlane/README.md new file mode 100644 index 000000000..f8596f125 --- /dev/null +++ b/fastlane/README.md @@ -0,0 +1,70 @@ +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 + +### generate_bundle + +```sh +[bundle exec] fastlane generate_bundle +``` + +Generate Android App Bundle + +### deploy + +```sh +[bundle exec] fastlane deploy +``` + +Deploy a new version to the Google Play + +### replace_google_services + +```sh +[bundle exec] fastlane replace_google_services +``` + + + +### replace_images + +```sh +[bundle exec] fastlane replace_images +``` + + + +### modify_config_json + +```sh +[bundle exec] fastlane modify_config_json +``` + + + +### generate_debug_apk + +```sh +[bundle exec] fastlane generate_debug_apk +``` + + + +---- + +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/actions/convert_base64_into_string.rb b/fastlane/actions/convert_base64_into_string.rb new file mode 100644 index 000000000..f4a55a572 --- /dev/null +++ b/fastlane/actions/convert_base64_into_string.rb @@ -0,0 +1,22 @@ +require "base64" +require 'json' + +module Fastlane + module Actions + class ConvertBase64IntoStringAction < Action + def self.run(params) + return Base64.decode64(params[:data]) + end + def self.available_options + [ + FastlaneCore::ConfigItem.new(key: :data, env_name: "ConvertBase64IntoString", + description: "major", + default_value: "", + verify_block: proc do |value| + end) + + ] + end + end + end +end \ No newline at end of file diff --git a/fastlane/actions/get_app_config.rb b/fastlane/actions/get_app_config.rb new file mode 100644 index 000000000..7984b41d2 --- /dev/null +++ b/fastlane/actions/get_app_config.rb @@ -0,0 +1,14 @@ +require 'uri' +require 'net/http' + +module Fastlane + module Actions + class GetAppConfigAction < Action + def self.run(params) + uri = URI('https://hari.in.ngrok.io/api/android/') + res = Net::HTTP.get_response(uri) + return res.body if res.is_a?(Net::HTTPSuccess) + end + end + end +end \ No newline at end of file diff --git a/fastlane/actions/modify_config_json_file.rb b/fastlane/actions/modify_config_json_file.rb new file mode 100644 index 000000000..7640dd8b4 --- /dev/null +++ b/fastlane/actions/modify_config_json_file.rb @@ -0,0 +1,39 @@ +require 'tempfile' +require 'fileutils' +require 'json' + +module Fastlane + module Actions + class ModifyConfigJsonFileAction < Action + def self.run(params) + fields_to_change = ["allow_anonymous_user","package_name", "app_name", "primary_color", "server_client_id","facebook_app_id", + "display_username_on_video", "white_labeled_host_url", "is_growth_hacks_enabled", "show_pdf_vertically", "testpress_site_subdomain", "share_message"] + replace_fields_value(fields_to_change, params[:config_json]) + end + + def self.replace_fields_value(fields, data) + path = "./app/src/main/assets/config.json" + file = File.read(path) + current_json = JSON.parse(file) + json_data = JSON.parse(data) + current_json.each{|key, value| current_json[key] = json_data[key] if json_data.key?(key)} + File.open(path,"w") do |f| + f.puts JSON.pretty_generate(current_json) + end + end + def self.available_options + [ + FastlaneCore::ConfigItem.new(key: :config_json, env_name: "ModifyConfigJsonFile", + description: "major", + default_value: "", + verify_block: proc do |value| + end) + + ] + end + def self.is_supported?(platform) + [:android].include?(platform) + end + end + end +end diff --git a/fastlane/actions/replace_google_services_json.rb b/fastlane/actions/replace_google_services_json.rb new file mode 100644 index 000000000..ef8bf5466 --- /dev/null +++ b/fastlane/actions/replace_google_services_json.rb @@ -0,0 +1,25 @@ +require 'tempfile' +require 'fileutils' + +module Fastlane + module Actions + class ReplaceGoogleServicesJsonAction < Action + def self.run(params) + File.open('./app/google-services.json', 'wb') do |f| + f.write(params[:google_services_json]) + end + end + def self.available_options + [ + FastlaneCore::ConfigItem.new(key: :google_services_json, + env_name: "ReplaceBase64StringFile", + description: "major", + default_value: "", + verify_block: proc do |value| + end) + + ] + end + end + end +end \ No newline at end of file From 6ee97c2b786f2d5793bfe76f3e60a4466d427675 Mon Sep 17 00:00:00 2001 From: hari-testpress Date: Mon, 28 Mar 2022 14:29:54 +0530 Subject: [PATCH 2/3] Create github actions --- .github/workflow/deploy_app.yml | 58 +++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 .github/workflow/deploy_app.yml diff --git a/.github/workflow/deploy_app.yml b/.github/workflow/deploy_app.yml new file mode 100644 index 000000000..25d9267eb --- /dev/null +++ b/.github/workflow/deploy_app.yml @@ -0,0 +1,58 @@ +name: Deploy app workflow +on: + workflow_dispatch: + inputs: + deploy_mode: + description: 'Which domain you are launching an app' + required: true + default: 'sandbox' + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout the repository + uses: actions/checkout@v2 + + - name: Setup JDK 11 + uses: actions/setup-java@v2 + with: + distribution: "zulu" + java-version: 11 + + - name: Setup Android SDK + uses: android-actions/setup-android@v2 + + - name: Setup ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.7 + + - name: Caching ruby dependencies + uses: actions/cache@v2 + with: + path: 'vendor/bundle' + key: ${{ runner.os }}-gems-${{ secrets.GEMS_CACHE_VERSION }}-${{ hashFiles('**/Gemfile.lock') }} + restore-keys: | + ${{ runner.os }}-gems- + + - name: Caching Gradle packages + uses: actions/cache@v2 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Install dependencies to support ruby project + run: | + bundle config --global set deploy_platform_default x86_64-linux + bundle install + + - name: Build and distribute app + run: | + export LC_ALL=en_US.UTF-8 + export LANG=en_US.UTF-8 + bundle exec fastlane deploy \ No newline at end of file From f81082c7c09ba922b17e0290552864f4ba16ab58 Mon Sep 17 00:00:00 2001 From: hari-testpress Date: Mon, 28 Mar 2022 15:27:44 +0530 Subject: [PATCH 3/3] temp --- .github/workflow/deploy_app.yml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflow/deploy_app.yml b/.github/workflow/deploy_app.yml index 25d9267eb..c56797cfa 100644 --- a/.github/workflow/deploy_app.yml +++ b/.github/workflow/deploy_app.yml @@ -1,11 +1,7 @@ name: Deploy app workflow -on: - workflow_dispatch: - inputs: - deploy_mode: - description: 'Which domain you are launching an app' - required: true - default: 'sandbox' +on: + pull_request: + types: [opened, reopened] jobs: deploy: