From 324cfe1a50085f745c47a81226e13bc4f18f77b6 Mon Sep 17 00:00:00 2001 From: zhiqingchen <329604487@qq.com> Date: Thu, 16 Feb 2023 11:44:02 +0800 Subject: [PATCH] feat: add github actions config --- .github/scripts/import-certificate.sh | 16 ++ .github/scripts/import-profile.sh | 6 + .github/workflows/assemble_android_debug.yml | 100 ++++++++ .../workflows/assemble_android_release.yml | 105 +++++++++ .github/workflows/assemble_ios_debug.yml | 113 +++++++++ .github/workflows/assemble_ios_release.yml | 131 +++++++++++ Gemfile | 1 + README.md | 7 + android/Gemfile | 7 + android/Gemfile.lock | 222 ++++++++++++++++++ android/app/build.gradle | 2 +- android/fastlane/Appfile | 2 + android/fastlane/Fastfile | 43 ++++ android/fastlane/Pluginfile | 5 + android/gradle.properties | 1 + ios/assets/.gitkeep | 0 ios/fastlane/Appfile | 6 + ios/fastlane/Fastfile | 56 +++++ ios/fastlane/README.md | 48 ++++ .../AppIcon.appiconset/Contents.json | 2 + .../AppIcon.appiconset/icon-1024.png | Bin 0 -> 29887 bytes .../AppIcon.appiconset/icon-60@2x.png | Bin 0 -> 1916 bytes ios/taroDemo/Info.plist | 2 + 23 files changed, 874 insertions(+), 1 deletion(-) create mode 100755 .github/scripts/import-certificate.sh create mode 100755 .github/scripts/import-profile.sh create mode 100644 .github/workflows/assemble_android_debug.yml create mode 100644 .github/workflows/assemble_android_release.yml create mode 100644 .github/workflows/assemble_ios_debug.yml create mode 100644 .github/workflows/assemble_ios_release.yml create mode 100644 android/Gemfile create mode 100644 android/Gemfile.lock create mode 100644 android/fastlane/Appfile create mode 100644 android/fastlane/Fastfile create mode 100644 android/fastlane/Pluginfile create mode 100644 ios/assets/.gitkeep create mode 100644 ios/fastlane/Appfile create mode 100644 ios/fastlane/Fastfile create mode 100644 ios/fastlane/README.md create mode 100644 ios/taroDemo/Images.xcassets/AppIcon.appiconset/icon-1024.png create mode 100644 ios/taroDemo/Images.xcassets/AppIcon.appiconset/icon-60@2x.png diff --git a/.github/scripts/import-certificate.sh b/.github/scripts/import-certificate.sh new file mode 100755 index 0000000..a016622 --- /dev/null +++ b/.github/scripts/import-certificate.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +set -euo pipefail + +security create-keychain -p "" build.keychain +security list-keychains -s build.keychain +security default-keychain -s build.keychain +security unlock-keychain -p "" build.keychain +security set-keychain-settings +echo $SIGNING_CERTIFICATE_P12_DATA | base64 --decode > signingCertificate.p12 +security import signingCertificate.p12 \ + -f pkcs12 \ + -k build.keychain \ + -P $SIGNING_CERTIFICATE_PASSWORD \ + -T /usr/bin/codesign +security set-key-partition-list -S apple-tool:,apple: -s -k "" build.keychain \ No newline at end of file diff --git a/.github/scripts/import-profile.sh b/.github/scripts/import-profile.sh new file mode 100755 index 0000000..bc2dbee --- /dev/null +++ b/.github/scripts/import-profile.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +set -euo pipefail + +mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles +echo "$PROVISIONING_PROFILE_DATA" | base64 --decode > ~/Library/MobileDevice/Provisioning\ Profiles/profile.mobileprovision \ No newline at end of file diff --git a/.github/workflows/assemble_android_debug.yml b/.github/workflows/assemble_android_debug.yml new file mode 100644 index 0000000..f0540e5 --- /dev/null +++ b/.github/workflows/assemble_android_debug.yml @@ -0,0 +1,100 @@ +# 工作流名称 +name: Assemble Android Debug + +# 触发工作流程的事件 +on: + push: + branches: [ master ] + tags: [ v* ] + pull_request: + branches: [ master ] + + workflow_dispatch: + +# 工作流环境变量 +env: + # 应用的application_id + APP_ID: com.tarodemo + # 应用名称 + APP_NAME: Taro Demo + # 打包类型 + BUILD_TYPE: debug + # 版本名称 + VERSION_NAME: 1.0.0 + # 版本号 + VERSION_CODE: 10 + # 密钥库文件 + KEYSTORE_FILE: debug.keystore + # 密钥库口令 + KEYSTORE_PASSWORD: android + # 密钥库别名 + KEYSTORE_KEY_ALIAS: androiddebugkey + # 密钥库别名口令 + KEYSTORE_KEY_PASSWORD: android + +# 工作流作业 +jobs: + assemble: + runs-on: ubuntu-latest + steps: + - name: Checkout Project + uses: actions/checkout@v2 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: '17' + - name: Cache node_modules Folder + uses: actions/cache@v2 + with: + path: ${{ github.workspace }}/node_modules + key: ${{ runner.os }}-node_modules + restore-keys: ${{ runner.os }}-node_modules + - name: Get Yarn Cache Directory Path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + - name: Cache Yarn + uses: actions/cache@v2 + env: + cache-name: yarn-cache + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/package.json') }} + restore-keys: | + ${{ runner.os }}-yarn- + - name: Install Dependencies + run: | + yarn + # - name: Build Taro React Native Bundle + # run: | + # yarn build:rn --platform android + - name: Cache Gradle + uses: actions/cache@v2 + env: + cache-name: gradle-cache + with: + path: ~/.gradle + key: ${{ runner.os }}-gradle + restore-keys: | + ${{ runner.os }}-gradle + - name: Assemble Android ${{ env.BUILD_TYPE }} + run: | + sudo apt install -y ruby-bundler + cd android + bundle update + bundle exec fastlane assemble + env: + KEYSTORE_FILE: ${{ github.workspace }}/android/app/${{ env.KEYSTORE_FILE }} + - name: Upload Android Products + uses: actions/upload-artifact@v2 + with: + name: app-${{ env.BUILD_TYPE }} + path: ${{ github.workspace }}/android/app/build/outputs/apk/${{ env.BUILD_TYPE }}/app-${{ env.BUILD_TYPE }}.apk + - name: Upload release assets + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/') + with: + prerelease: ${{ contains(github.ref, 'beta') }} + files: | + android/app/build/outputs/apk/${{ env.BUILD_TYPE }}/app-${{ env.BUILD_TYPE }}.apk + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/assemble_android_release.yml b/.github/workflows/assemble_android_release.yml new file mode 100644 index 0000000..961562c --- /dev/null +++ b/.github/workflows/assemble_android_release.yml @@ -0,0 +1,105 @@ +# 工作流名称 +name: Assemble Android Release + +# 触发工作流程的事件 +on: + push: + branches: [ master ] + tags: [ v* ] + pull_request: + branches: [ master ] + + workflow_dispatch: + +# 工作流环境变量 +env: + # 应用的application_id + APP_ID: com.tarodemo + # 应用名称 + APP_NAME: Taro Demo + # 打包类型 + BUILD_TYPE: release + # 版本名称 + VERSION_NAME: 1.0.0 + # 版本号 + VERSION_CODE: 10 + # 密钥库文件 + KEYSTORE_FILE: debug.keystore + # 密钥库口令 + KEYSTORE_PASSWORD: android + # 密钥库别名 + KEYSTORE_KEY_ALIAS: androiddebugkey + # 密钥库别名口令 + KEYSTORE_KEY_PASSWORD: android + +# 工作流作业 +jobs: + assemble: + runs-on: ubuntu-latest + steps: + - name: Checkout Project + uses: actions/checkout@v2 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: '17' + - name: Cache node_modules Folder + uses: actions/cache@v2 + with: + path: ${{ github.workspace }}/node_modules + key: ${{ runner.os }}-node_modules + restore-keys: ${{ runner.os }}-node_modules + - name: Get Yarn Cache Directory Path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + - name: Cache Yarn + uses: actions/cache@v2 + env: + cache-name: yarn-cache + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/package.json') }} + restore-keys: | + ${{ runner.os }}-yarn- + - name: Install Dependencies + run: | + yarn + # - name: Build Taro React Native Bundle + # run: | + # yarn build:rn --platform android + # - name: Upload Taro React Native Bundle + # uses: actions/upload-artifact@v2 + # with: + # name: taro-android-bundle + # path: ${{ github.workspace }}/android/app/src/main/assets/index.android.bundle + - name: Cache Gradle + uses: actions/cache@v2 + env: + cache-name: gradle-cache + with: + path: ~/.gradle + key: ${{ runner.os }}-gradle + restore-keys: | + ${{ runner.os }}-gradle + - name: Assemble Android ${{ env.BUILD_TYPE }} + run: | + sudo apt install -y ruby-bundler + cd android + bundle update + bundle exec fastlane assemble + env: + KEYSTORE_FILE: ${{ github.workspace }}/android/app/${{ env.KEYSTORE_FILE }} + - name: Upload Android Products + uses: actions/upload-artifact@v2 + with: + name: app-${{ env.BUILD_TYPE }} + path: ${{ github.workspace }}/android/app/build/outputs/apk/${{ env.BUILD_TYPE }}/app-${{ env.BUILD_TYPE }}.apk + - name: Upload release assets + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/') + with: + prerelease: ${{ contains(github.ref, 'beta') }} + files: | + android/app/build/outputs/apk/${{ env.BUILD_TYPE }}/app-${{ env.BUILD_TYPE }}.apk + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/assemble_ios_debug.yml b/.github/workflows/assemble_ios_debug.yml new file mode 100644 index 0000000..b9a6f20 --- /dev/null +++ b/.github/workflows/assemble_ios_debug.yml @@ -0,0 +1,113 @@ +# 工作流名称 +name: Assemble Ios Debug + +# 触发工作流程的事件 +on: + push: + branches: [ master ] + tags: [ v* ] + pull_request: + branches: [ master ] + + workflow_dispatch: + +# 工作流环境变量 +env: + # 应用的application_id + APP_ID: ${{secrets.APP_ID}} + APP_NAME: Taro Demo + VERSION_NUMBER: 1.0.0 + BUILD_TYPE: debug + TEAM_ID: ${{secrets.TEAM_ID}} + PROVISIONING_PROFILE_SPECIFIER: ${{secrets.DEBUG_PROVISIONING_PROFILE_SPECIFIER}} + CODE_SIGN_IDENTITY: Apple Development + SIGNING_CERTIFICATE_P12_DATA: ${{secrets.DEBUG_SIGNING_CERTIFICATE_P12_DATA}} + SIGNING_CERTIFICATE_PASSWORD: ${{secrets.DEBUG_SIGNING_CERTIFICATE_PASSWORD}} + PROVISIONING_PROFILE_DATA: ${{secrets.DEBUG_PROVISIONING_PROFILE_DATA}} + +jobs: + assemble: + runs-on: macos-13 + steps: + - name: Checkout Project + uses: actions/checkout@v2 + - name: Cache node_modules Folder + uses: actions/cache@v2 + with: + path: ${{ github.workspace }}/node_modules + key: ${{ runner.os }}-node_modules + restore-keys: ${{ runner.os }}-node_modules + - name: Get Yarn Cache Directory Path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + - name: Cache Yarn + uses: actions/cache@v2 + env: + cache-name: yarn-cache + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/package.json') }} + restore-keys: | + ${{ runner.os }}-yarn- + - name: Cache Pods + uses: actions/cache@v2 + with: + path: ios/Pods + key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }} + restore-keys: | + ${{ runner.os }}-pods- + - name: Install Dependencies + run: | + yarn + # - name: Build Taro React Native Bundle + # run: | + # yarn build:rn --platform ios + - name: Install pods + run: cd ios && pod update --no-repo-update + - name: Import signing certificate + env: + SIGNING_CERTIFICATE_P12_DATA: ${{ env.SIGNING_CERTIFICATE_P12_DATA }} + SIGNING_CERTIFICATE_PASSWORD: ${{ env.SIGNING_CERTIFICATE_PASSWORD }} + run: | + exec .github/scripts/import-certificate.sh + - name: Import provisioning profile + env: + PROVISIONING_PROFILE_DATA: ${{ env.PROVISIONING_PROFILE_DATA }} + run: | + exec .github/scripts/import-profile.sh + - name: Build app + env: + SKIP_BUNDLING: 1 + FL_APP_IDENTIFIER: ${{ env.APP_ID }} + FL_UPDATE_PLIST_DISPLAY_NAME: ${{ env.APP_NAME }} + FL_UPDATE_PLIST_PATH: taroDemo/Info.plist + FL_VERSION_NUMBER_VERSION_NUMBER: ${{ env.VERSION_NUMBER }} + FL_BUILD_NUMBER_BUILD_NUMBER: ${{ env.BUILD_NUMBER }} + FL_CODE_SIGN_IDENTITY: ${{ env.CODE_SIGN_IDENTITY }} + FL_PROVISIONING_PROFILE_SPECIFIER: ${{ env.PROVISIONING_PROFILE_SPECIFIER }} + FASTLANE_TEAM_ID: ${{ env.TEAM_ID }} + run: | + cd ios + bundle update + bundle exec fastlane build_dev + - name: Upload Ios Products + uses: actions/upload-artifact@v2 + with: + name: app-${{ env.BUILD_TYPE }} + path: | + ${{ github.workspace }}/ios/taroDemo.ipa + ${{ github.workspace }}/ios/taroDemo.app.dSYM.zip + - name: Rename release assets + run: | + mv ios/taroDemo.ipa ios/app-${{ env.BUILD_TYPE }}.ipa + mv ios/taroDemo.app.dSYM.zip ios/app-${{ env.BUILD_TYPE }}.app.dSYM.zip + - name: Upload release assets + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/') + with: + prerelease: ${{ contains(github.ref, 'beta') }} + files: | + ios/app-${{ env.BUILD_TYPE }}.ipa + ios/app-${{ env.BUILD_TYPE }}.app.dSYM.zip + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/assemble_ios_release.yml b/.github/workflows/assemble_ios_release.yml new file mode 100644 index 0000000..cb53972 --- /dev/null +++ b/.github/workflows/assemble_ios_release.yml @@ -0,0 +1,131 @@ +# 工作流名称 +name: Assemble Ios Release + +# 触发工作流程的事件 +on: + push: + branches: [ master ] + tags: [ v* ] + pull_request: + branches: [ master ] + + workflow_dispatch: + +# 工作流环境变量 +env: + # 应用的application_id + APP_ID: ${{secrets.APP_ID}} + APP_NAME: Taro Demo + VERSION_NUMBER: 1.0.0 + BUILD_NUMBER: 1.0.0.0 + BUILD_TYPE: release + TEAM_ID: ${{secrets.TEAM_ID}} + PROVISIONING_PROFILE_SPECIFIER: ${{secrets.RELEASE_PROVISIONING_PROFILE_SPECIFIER}} + CODE_SIGN_IDENTITY: Apple Distribution + SIGNING_CERTIFICATE_P12_DATA: ${{secrets.RELEASE_SIGNING_CERTIFICATE_P12_DATA}} + SIGNING_CERTIFICATE_PASSWORD: ${{secrets.RELEASE_SIGNING_CERTIFICATE_PASSWORD}} + PROVISIONING_PROFILE_DATA: ${{secrets.RELEASE_PROVISIONING_PROFILE_DATA}} + APP_STORE_CONNECT_USERNAME: ${{secrets.APP_STORE_CONNECT_USERNAME}} + APP_STORE_CONNECT_PASSWORD: ${{secrets.APP_STORE_CONNECT_PASSWORD}} + +jobs: + assemble: + runs-on: macos-13 + steps: + - name: Get current date + id: date + run: echo "::set-output name=timestamp::$(date +'%s')" + - name: Checkout Project + uses: actions/checkout@v2 + - name: Cache node_modules Folder + uses: actions/cache@v2 + with: + path: ${{ github.workspace }}/node_modules + key: ${{ runner.os }}-node_modules + restore-keys: ${{ runner.os }}-node_modules + - name: Get Yarn Cache Directory Path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + - name: Cache Yarn + uses: actions/cache@v2 + env: + cache-name: yarn-cache + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/package.json') }} + restore-keys: | + ${{ runner.os }}-yarn- + - name: Cache Pods + uses: actions/cache@v2 + with: + path: ios/Pods + key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }} + restore-keys: | + ${{ runner.os }}-pods- + - name: Install Dependencies + run: | + yarn + # - name: Build Taro React Native Bundle + # run: | + # yarn build:rn --platform ios + # - name: Upload Taro React Native Bundle + # uses: actions/upload-artifact@v2 + # with: + # name: taro-ios-bundle + # path: ${{ github.workspace }}/ios/main.jsbundle + - name: Install pods + run: cd ios && pod update --no-repo-update + - name: Import signing certificate + env: + SIGNING_CERTIFICATE_P12_DATA: ${{ env.SIGNING_CERTIFICATE_P12_DATA }} + SIGNING_CERTIFICATE_PASSWORD: ${{ env.SIGNING_CERTIFICATE_PASSWORD }} + run: | + exec .github/scripts/import-certificate.sh + - name: Import provisioning profile + env: + PROVISIONING_PROFILE_DATA: ${{ env.PROVISIONING_PROFILE_DATA }} + run: | + exec .github/scripts/import-profile.sh + - name: Build app + env: + SKIP_BUNDLING: 1 + FL_APP_IDENTIFIER: ${{ env.APP_ID }} + FL_UPDATE_PLIST_DISPLAY_NAME: ${{ env.APP_NAME }} + FL_UPDATE_PLIST_PATH: taroDemo/Info.plist + FL_VERSION_NUMBER_VERSION_NUMBER: ${{ env.VERSION_NUMBER }} + FL_BUILD_NUMBER_BUILD_NUMBER: ${{ env.BUILD_NUMBER }}.${{steps.date.outputs.timestamp}} + FL_CODE_SIGN_IDENTITY: ${{ env.CODE_SIGN_IDENTITY }} + FL_PROVISIONING_PROFILE_SPECIFIER: ${{ env.PROVISIONING_PROFILE_SPECIFIER }} + FASTLANE_TEAM_ID: ${{ env.TEAM_ID }} + run: | + cd ios + bundle update + bundle exec fastlane build_release + - name: Upload Ios Products + uses: actions/upload-artifact@v2 + with: + name: app-${{ env.BUILD_TYPE }} + path: | + ${{ github.workspace }}/ios/taroDemo.ipa + ${{ github.workspace }}/ios/taroDemo.app.dSYM.zip + - name: Upload app to App Store Connect + env: + APP_STORE_CONNECT_USERNAME: ${{ env.APP_STORE_CONNECT_USERNAME }} + APP_STORE_CONNECT_PASSWORD: ${{ env.APP_STORE_CONNECT_PASSWORD }} + run: | + cd ios + xcrun altool --upload-app -t ios -f "taroDemo.ipa" -u "$APP_STORE_CONNECT_USERNAME" -p "$APP_STORE_CONNECT_PASSWORD" + - name: Rename release assets + run: | + mv ios/taroDemo.ipa ios/app-${{ env.BUILD_TYPE }}.ipa + mv ios/taroDemo.app.dSYM.zip ios/app-${{ env.BUILD_TYPE }}.app.dSYM.zip + - name: Upload release assets + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/') + with: + prerelease: ${{ contains(github.ref, 'beta') }} + files: | + ios/app-${{ env.BUILD_TYPE }}.ipa + ios/app-${{ env.BUILD_TYPE }}.app.dSYM.zip + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/Gemfile b/Gemfile index 6a7d5c7..9213973 100644 --- a/Gemfile +++ b/Gemfile @@ -3,5 +3,6 @@ source 'https://rubygems.org' # You may use http://rbenv.org/ or https://rvm.io/ to install and use this version ruby ">= 2.6.10" +gem 'fastlane' gem 'cocoapods', '~> 1.13' gem 'activesupport', '>= 6.1.7.3', '< 7.1.0' diff --git a/README.md b/README.md index cf6ff68..42e7af2 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,13 @@ yarn yarn upgradePeerdeps ``` +5. 添加打包脚本,此部分可以直接 cherry-pick + - [fastlane] 添加 Android、iOS fastlane 配置 + - [actions] 添加 Android、iOS 打包脚本 + - [ios] 添加默认图标 + - [ios] 添加 ITSAppUsesNonExemptEncryption false + - [ios] 添加 main.jsbundle assets 引用 + ## React Native 小版本更新 https://react-native-community.github.io/upgrade-helper/ diff --git a/android/Gemfile b/android/Gemfile new file mode 100644 index 0000000..3bb287d --- /dev/null +++ b/android/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +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/android/Gemfile.lock b/android/Gemfile.lock new file mode 100644 index 0000000..a21c3c8 --- /dev/null +++ b/android/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.587.0) + aws-sdk-core (3.130.2) + aws-eventstream (~> 1, >= 1.0.2) + aws-partitions (~> 1, >= 1.525.0) + aws-sigv4 (~> 1.1) + jmespath (~> 1.0) + aws-sdk-kms (1.56.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.114.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.4) + aws-sigv4 (1.5.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.3) + 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.2) + 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-update_android_strings (0.1.0) + ox + gh_inspector (1.1.3) + google-apis-androidpublisher_v3 (0.20.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.13.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.2) + 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.3) + 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) + ox (2.14.11) + plist (3.6.0) + public_suffix (4.0.7) + 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 + universal-darwin-21 + +DEPENDENCIES + fastlane + fastlane-plugin-update_android_strings + +BUNDLED WITH + 2.2.27 diff --git a/android/app/build.gradle b/android/app/build.gradle index 46921c3..dc8fa57 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -76,7 +76,7 @@ android { namespace "com.tarodemo" defaultConfig { - applicationId "com.tarodemo" + applicationId app_id minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 diff --git a/android/fastlane/Appfile b/android/fastlane/Appfile new file mode 100644 index 0000000..17a3137 --- /dev/null +++ b/android/fastlane/Appfile @@ -0,0 +1,2 @@ +json_key_file("") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one +package_name("com.tarodemo") # e.g. com.krausefx.app diff --git a/android/fastlane/Fastfile b/android/fastlane/Fastfile new file mode 100644 index 0000000..a766054 --- /dev/null +++ b/android/fastlane/Fastfile @@ -0,0 +1,43 @@ +# This file contains the fastlane.tools configuration +# You can find the documentation at https://docs.fastlane.tools +# +# For a list of all available actions, check out +# +# https://docs.fastlane.tools/actions +# +# For a list of all available plugins, check out +# +# https://docs.fastlane.tools/plugins/available-plugins +# + +# Uncomment the line if you want fastlane to automatically update itself +# update_fastlane + +default_platform(:android) + +platform :android do + + desc "assemble" + lane :assemble do + update_android_strings( + xml_path: 'app/src/main/res/values/strings.xml', + block: lambda { |strings| + strings['app_name'] = ENV['APP_NAME'] + } + ) + gradle( + task: "assemble", + build_type: ENV['BUILD_TYPE'], + properties: { + "app_id" => ENV['APP_ID'], + "android.injected.version.code" => ENV['VERSION_CODE'].to_i, + "android.injected.version.name" => ENV['VERSION_NAME'], + "android.injected.signing.store.file" => ENV['KEYSTORE_FILE'], + "android.injected.signing.store.password" => ENV['KEYSTORE_PASSWORD'], + "android.injected.signing.key.alias" => ENV['KEYSTORE_KEY_ALIAS'], + "android.injected.signing.key.password" => ENV['KEYSTORE_KEY_PASSWORD'], + } + ) + end + +end diff --git a/android/fastlane/Pluginfile b/android/fastlane/Pluginfile new file mode 100644 index 0000000..438d7e1 --- /dev/null +++ b/android/fastlane/Pluginfile @@ -0,0 +1,5 @@ +# Autogenerated by fastlane +# +# Ensure this file is checked in to source control! + +gem 'fastlane-plugin-update_android_strings' diff --git a/android/gradle.properties b/android/gradle.properties index a46a5b9..b6c973a 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -39,3 +39,4 @@ newArchEnabled=false # Use this property to enable or disable the Hermes JS engine. # If set to false, you will be using JSC instead. hermesEnabled=true +app_id=com.tarodemo \ No newline at end of file diff --git a/ios/assets/.gitkeep b/ios/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/ios/fastlane/Appfile b/ios/fastlane/Appfile new file mode 100644 index 0000000..1803063 --- /dev/null +++ b/ios/fastlane/Appfile @@ -0,0 +1,6 @@ +# app_identifier("[[APP_IDENTIFIER]]") # The bundle identifier of your app +# apple_id("[[APPLE_ID]]") # Your Apple email address + + +# For more information about the Appfile, see: +# https://docs.fastlane.tools/advanced/#appfile diff --git a/ios/fastlane/Fastfile b/ios/fastlane/Fastfile new file mode 100644 index 0000000..4586950 --- /dev/null +++ b/ios/fastlane/Fastfile @@ -0,0 +1,56 @@ +# This file contains the fastlane.tools configuration +# You can find the documentation at https://docs.fastlane.tools +# +# For a list of all available actions, check out +# +# https://docs.fastlane.tools/actions +# +# For a list of all available plugins, check out +# +# https://docs.fastlane.tools/plugins/available-plugins +# + +# Uncomment the line if you want fastlane to automatically update itself +# update_fastlane + +default_platform(:ios) + +platform :ios do + desc "Description of what the lane does" + lane :custom_lane do + # add actions here: https://docs.fastlane.tools/actions + end + + desc "development" + lane :build_dev do |options| + update_info_plist + update_code_signing_settings + increment_version_number + build_app( + scheme: "taroDemo", + workspace: "taroDemo.xcworkspace", + export_method: "development", + configuration: "Debug", + clean: true, + xcargs: "GCC_PREPROCESSOR_DEFINITIONS='$(inherited) DEBUG=1'", + export_options: { + method: "development", + compileBitcode: false + } + ) + end + + desc "release" + lane :build_release do |options| + update_info_plist + update_code_signing_settings + increment_version_number + increment_build_number + build_app( + scheme: "taroDemo", + # clean: true, + workspace: "taroDemo.xcworkspace" + ) + end + +end diff --git a/ios/fastlane/README.md b/ios/fastlane/README.md new file mode 100644 index 0000000..49abb9e --- /dev/null +++ b/ios/fastlane/README.md @@ -0,0 +1,48 @@ +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 + +## iOS + +### ios custom_lane + +```sh +[bundle exec] fastlane ios custom_lane +``` + +Description of what the lane does + +### ios build_dev + +```sh +[bundle exec] fastlane ios build_dev +``` + +development + +### ios build_release + +```sh +[bundle exec] fastlane ios build_release +``` + +release + +---- + +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/ios/taroDemo/Images.xcassets/AppIcon.appiconset/Contents.json b/ios/taroDemo/Images.xcassets/AppIcon.appiconset/Contents.json index 8121323..1b5e555 100644 --- a/ios/taroDemo/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/taroDemo/Images.xcassets/AppIcon.appiconset/Contents.json @@ -31,6 +31,7 @@ "size" : "40x40" }, { + "filename" : "icon-60@2x.png", "idiom" : "iphone", "scale" : "2x", "size" : "60x60" @@ -41,6 +42,7 @@ "size" : "60x60" }, { + "filename" : "icon-1024.png", "idiom" : "ios-marketing", "scale" : "1x", "size" : "1024x1024" diff --git a/ios/taroDemo/Images.xcassets/AppIcon.appiconset/icon-1024.png b/ios/taroDemo/Images.xcassets/AppIcon.appiconset/icon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..b3756fc12f60f5d3585759f6d85bb5620782578b GIT binary patch literal 29887 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 literal 0 HcmV?d00001 diff --git a/ios/taroDemo/Images.xcassets/AppIcon.appiconset/icon-60@2x.png b/ios/taroDemo/Images.xcassets/AppIcon.appiconset/icon-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..91b172ed1f3eb8453772d71a63c0d7afb46390e8 GIT binary patch literal 1916 zcmbW2`8V4M7skJqDybl`mSSwh2#RP4sz@42w4p{rCH5_&I>cIQ2x2;jb?k&U1WuN)xb?RjQ!N=AK0|2q-0U#+A0KT4}Bpv`nTmXPIPXIvt z4gj)u%bsA(PYy!f_Glz<{BKn;>+?>)t{u|qX7uc4+4FEImvbY3&RN*|zr5@KwH6gI zaM6R2Z}F?dwrc4fOE6=07ZTs08cp2s%m&%tB>0W{1!)>iAQ2n&9ApPA#PB(6PDyA0 z$g4=OSUz-mAD`vi67y-ldV8Jg{=|5!y^51Snh}V`-JsiPvDNbfq1WId8YQVvj5YOq zH8Ssi#?ijwp7&;+`P>nR30LTS711eJT|n$2qTH`65Xwre5$Pco9vr3q`njdjO*giU z(SaA4jdgvE?U*aB*_IinGB<6~QD_}f8##t{1+HqJFy#C9gnL=4+L6s@Ot@YU0&*8gko zs%)Uzx->+4lEiIpRd7$U`(wk6ESz~0>WJc=y^e9fRxEXunLc)gk{F8v%}LJe_>_(^ zv!`jE1?=#q`8uoNp(B@JTR08$BuR~3=eG+UKk<8TFR}ZPspr%?FOc@=6k^TB`Njqm z9pwLu=_PYjO)G`!B#0Qld{UOpR&uS!;vw!XzWZZlAt5P23{7vj53A!*%0F(WabpL$ z?WeykTJ|QN6JpJ^Glk-!p)8jA(E3Se94ZoPHGz;3; zq(`Hd!b$U;2|X_yUscRD=+A4B?3!ehY=v5MS~rC4s%xozUEW*@8dt?Y=-F1lme3>z zFRi};%7+{oFdzLZ0CyzODjjuJ*mcGgu>3#w2>SAT7j zoV#Ru{gu+-f3ym#2Ca~&NW|^MX*RxJD$$-@+%#ipK9NynBDXc5hZj!?dm9`o{2f$x z;GVU$$DF3F!qv#Cx1}O=Uld23DhlmEOj^P#U$*VvM55La^1)u2`V!Hi2E>wO7CGUq z&vSyV{Xhi+BDU()w)!Y&p*MU$5%ulh$mn&(bWVX2A_4~UOHjboiV1!mUNbJI-4VZ7 zGaF*MQ8JnAaZHTy(zaL1%ytp4{CKxx9H;UCRjE*>raNhFwJkTF=63Zj`T6zQw7qVw zY@#8iF*K*V%3>Nj_eqoV+AT$(No3rJk9Ck&N90yotSw;iA_VcX+_%1@9Y+QJdx9u{e-ge$+kk<#Sw3&0$3qgh3X}Z|k91nm^;rsC2s; za-XXa@mi;*Rp$o+X@2Ob@6xeD3>>V9r^(dCu^Hd{MVEvFF#vk++8JjSZ^&eochDOm zj7VUtB%)b7zH9TqXS`-i*P&=GYU06NpG-Ebx~AU7zcv>|s2qa&MO8OKbaO$y{JE$p zP_OgmXQ%O!I}`_YvANKQT|84iXqicMV2jHdTs5t9mK}O8LrvxnLy4<1_KE1yzL`|F zQJk|vEwu}F+f##Aanw$a%Y?IuI8kR-Of8XDP+p~i-Fc}E!;TA#s6~flH)&O>Vs@_N z?l^je)^|$xdVk2cNELDWyKpr88N{L|6+61u!c_|o>Xb93r)%caol`L7q#|ZceuOFg zaKu(|H`1ERCnE2JZ1KB*)ZT!<^EI<%P1;Jt-xJEqpD2Q-ZN-);6N1z;SfuQm941rT zYxun;x)tRv15M2Pn#=Nb6?NaSmVcvk0r5rN + ITSAppUsesNonExemptEncryption + CFBundleDevelopmentRegion en CFBundleDisplayName