diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 909d6f6c..a32e37a3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,7 +18,7 @@ jobs: - name: -- Step 2 -- Setup node uses: actions/setup-node@v3 with: - node-version: 16 + node-version-file: '.nvmrc' - name: -- Step 3 -- Install node dependencies run: yarn install - name: -- Step 4 -- Install ruby dependencies @@ -53,7 +53,7 @@ jobs: - name: -- Step 2 -- Setup node uses: actions/setup-node@v3 with: - node-version: 16 + node-version-file: '.nvmrc' - name: -- Step 3 -- Setup Java uses: actions/setup-java@v3 with: @@ -88,21 +88,30 @@ jobs: - name: -- Step 2 -- Setup node uses: actions/setup-node@v3 with: - node-version: 16 - - name: -- Step 3 -- Use Expo action + node-version-file: '.nvmrc' + - name: -- Step 3 -- Setup Java + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: '11' + - name: -- Step 4 -- Use Expo action uses: expo/expo-github-action@v7 with: expo-version: latest token: ${{ secrets.EXPO_TOKEN }} - - name: -- Step 4 -- Install node dependencies + - name: -- Step 5 -- Install node dependencies run: yarn install - - name: -- Step 5 -- Install ruby dependencies + - name: -- Step 6 -- Install ruby dependencies run: bundle install - - name: -- Step 6 -- Run fastlane + - name: -- Step 7 -- Run fastlane env: ENVIRONMENT: ${{ steps.branch.outputs.branch }} LC_ALL: en_US.UTF-8 LANG: en_US.UTF-8 + ANDROID_KEYSTORE: ${{ secrets.ANDROID_KEYSTORE }} + ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }} + ANDROID_KEYSTORE_ALIAS: ${{ secrets.ANDROID_KEYSTORE_ALIAS }} + ANDROID_KEYSTORE_KEY_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_KEY_PASSWORD }} GH_PAT_GET_RELEASE: ${{ secrets.GH_PAT_GET_RELEASE }} FL_GITHUB_RELEASE_API_BEARER: ${{ secrets.GITHUB_TOKEN }} run: yarn app:build release diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..19c7bdba --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +16 \ No newline at end of file diff --git a/fastlane/Fastfile b/fastlane/Fastfile index fd746971..ff183218 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -19,67 +19,41 @@ XCODEPROJ = "./ios/tooot.xcodeproj" INFO_PLIST = "./ios/tooot/Info.plist" EXPO_PLIST = "./ios/tooot/Supporting/Expo.plist" -desc "IOS: Prepare app store" -private_lane :prepare_appstore_ios do - set_info_plist_value( path: INFO_PLIST, key: "CFBundleShortVersionString", value: VERSION ) - set_info_plist_value( - path: INFO_PLIST, - key: "NSAppTransportSecurity", - value: {} - ) - increment_build_number( xcodeproj: XCODEPROJ, build_number: BUILD_NUMBER ) - app_store_connect_api_key -end - -desc 'IOS: Update expo information' -private_lane :update_expo_ios do - set_info_plist_value( path: EXPO_PLIST, key: "EXUpdatesSDKVersion", value: VERSIONS[:expo] ) - set_info_plist_value( path: EXPO_PLIST, key: "EXUpdatesReleaseChannel", value: RELEASE_CHANNEL ) -end - desc "ANDROID: Prepare play store" private_lane :prepare_playstore_android do android_set_version_name( version_name: VERSION, gradle_file: "./android/app/build.gradle" ) android_set_version_code( version_code: BUILD_NUMBER, gradle_file: "./android/app/build.gradle" ) end -desc "Create new GitHub release" -private_lane :github_release do |options| - set_github_release( - repository_name: GITHUB_REPO, - name: GITHUB_RELEASE, - tag_name: GITHUB_RELEASE, - description: "No changelog provided", - commitish: git_branch, - is_prerelease: options[:prerelease], - upload_assets: ["#{File.expand_path('..', Dir.pwd)}/tooot-#{GITHUB_RELEASE}.apk"] - ) -end - -desc "Expo release" -private_lane :expo_release do - yarn( package_path: "./package.json", flags: "release", command: RELEASE_CHANNEL ) -end - desc "Build and deploy iOS app" private_lane :build_ios do BUILD_DIRECTORY = "./ios/build" IPA_FILE = "#{BUILD_DIRECTORY}/tooot.ipa" DSYM_FILE = "#{BUILD_DIRECTORY}/tooot.app.dSYM.zip" - update_expo_ios + set_info_plist_value( path: EXPO_PLIST, key: "EXUpdatesSDKVersion", value: VERSIONS[:expo] ) + set_info_plist_value( path: EXPO_PLIST, key: "EXUpdatesReleaseChannel", value: RELEASE_CHANNEL ) + setup_ci + set_info_plist_value( path: INFO_PLIST, key: "CFBundleShortVersionString", value: VERSION ) + set_info_plist_value( + path: INFO_PLIST, + key: "NSAppTransportSecurity", + value: {} + ) + increment_build_number( xcodeproj: XCODEPROJ, build_number: BUILD_NUMBER ) + app_store_connect_api_key + match( type: "appstore", readonly: true ) + + build_ios_app( + export_method: "app-store", + include_symbols: true, + output_directory: BUILD_DIRECTORY, + silent: false + ) case ENVIRONMENT when "candidate" - prepare_appstore_ios - match( type: "appstore", readonly: true ) - build_ios_app( - export_method: "app-store", - include_symbols: true, - output_directory: BUILD_DIRECTORY, - silent: true - ) sentry_upload_dsym( org_slug: ENV["SENTRY_ORGANIZATION"], project_slug: ENV["SENTRY_PROJECT"], @@ -94,26 +68,19 @@ private_lane :build_ios do changelog: "感谢帮忙测试 tooot 🙏" ) when "release" - prepare_appstore_ios - match( type: "appstore", readonly: true ) - build_ios_app( - export_method: "app-store", - include_bitcode: true, - output_directory: BUILD_DIRECTORY, - silent: true + upload_to_app_store( + ipa: IPA_FILE, + app_version: VERSION + ) + download_dsyms( + version: VERSION, + build_number: BUILD_NUMBER, + wait_for_dsym_processing: true ) - upload_to_app_store( ipa: IPA_FILE, app_version: VERSION ) - download_dsyms( version: VERSION, build_number: BUILD_NUMBER, wait_for_dsym_processing: true ) sentry_upload_dsym( org_slug: ENV["SENTRY_ORGANIZATION"], project_slug: ENV["SENTRY_PROJECT"], ) - else - if !is_ci - match( type: "adhoc", readonly: true ) - build_ios_app( export_method: "ad-hoc", output_directory: BUILD_DIRECTORY, silent: true ) - install_on_device( skip_wifi: true ) - end end end @@ -121,24 +88,26 @@ desc "Build and deploy Android app" private_lane :build_android do sh("echo #{ENV["ANDROID_KEYSTORE"]} | base64 -d | tee #{File.expand_path('..', Dir.pwd)}/android/tooot.jks >/dev/null", log: false) + prepare_playstore_android + + build_android_app( + task: 'clean bundle', + build_type: 'release', + project_dir: "./android", + print_command: true, + print_command_output: true, + properties: { + "expoSDK" => VERSIONS[:expo], + "releaseChannel" => RELEASE_CHANNEL, + "android.injected.signing.store.file" => "#{File.expand_path('..', Dir.pwd)}/android/tooot.jks", + "android.injected.signing.store.password" => ENV["ANDROID_KEYSTORE_PASSWORD"], + "android.injected.signing.key.alias" => ENV["ANDROID_KEYSTORE_ALIAS"], + "android.injected.signing.key.password" => ENV["ANDROID_KEYSTORE_KEY_PASSWORD"], + } + ) + case ENVIRONMENT when "candidate" - prepare_playstore_android - build_android_app( - task: 'clean bundle', - build_type: 'release', - project_dir: "./android", - print_command: true, - print_command_output: true, - properties: { - "expoSDK" => VERSIONS[:expo], - "releaseChannel" => RELEASE_CHANNEL, - "android.injected.signing.store.file" => "#{File.expand_path('..', Dir.pwd)}/android/tooot.jks", - "android.injected.signing.store.password" => ENV["ANDROID_KEYSTORE_PASSWORD"], - "android.injected.signing.key.alias" => ENV["ANDROID_KEYSTORE_ALIAS"], - "android.injected.signing.key.password" => ENV["ANDROID_KEYSTORE_KEY_PASSWORD"], - } - ) upload_to_play_store( track: "alpha", skip_upload_metadata: true, @@ -146,73 +115,39 @@ private_lane :build_android do skip_upload_images: true, skip_upload_screenshots: true ) - build_android_app( - task: 'assemble', - build_type: 'release', - project_dir: "./android", - print_command: false, - print_command_output: false, - properties: { - "expoSDK" => VERSIONS[:expo], - "releaseChannel" => RELEASE_CHANNEL, - "android.injected.signing.store.file" => "#{File.expand_path('..', Dir.pwd)}/android/tooot.jks", - "android.injected.signing.store.password" => ENV["ANDROID_KEYSTORE_PASSWORD"], - "android.injected.signing.key.alias" => ENV["ANDROID_KEYSTORE_ALIAS"], - "android.injected.signing.key.password" => ENV["ANDROID_KEYSTORE_KEY_PASSWORD"], - } - ) - sh "mv #{lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH]} #{File.expand_path('..', Dir.pwd)}/tooot-#{GITHUB_RELEASE}.apk" when "release" - prepare_playstore_android - build_android_app( - task: 'clean bundle', - build_type: 'release', - project_dir: "./android", - print_command: true, - print_command_output: true, - properties: { - "expoSDK" => VERSIONS[:expo], - "releaseChannel" => RELEASE_CHANNEL, - "android.injected.signing.store.file" => "#{File.expand_path('..', Dir.pwd)}/android/tooot.jks", - "android.injected.signing.store.password" => ENV["ANDROID_KEYSTORE_PASSWORD"], - "android.injected.signing.key.alias" => ENV["ANDROID_KEYSTORE_ALIAS"], - "android.injected.signing.key.password" => ENV["ANDROID_KEYSTORE_KEY_PASSWORD"], - } - ) upload_to_play_store( track: "production", skip_upload_changelogs: true ) - build_android_app( - task: 'assemble', - build_type: 'release', - project_dir: "./android", - print_command: true, - print_command_output: true, - properties: { - "expoSDK" => VERSIONS[:expo], - "releaseChannel" => RELEASE_CHANNEL, - "android.injected.signing.store.file" => "#{File.expand_path('..', Dir.pwd)}/android/tooot.jks", - "android.injected.signing.store.password" => ENV["ANDROID_KEYSTORE_PASSWORD"], - "android.injected.signing.key.alias" => ENV["ANDROID_KEYSTORE_ALIAS"], - "android.injected.signing.key.password" => ENV["ANDROID_KEYSTORE_KEY_PASSWORD"], - } - ) - sh "mv #{lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH]} #{File.expand_path('..', Dir.pwd)}/tooot-#{GITHUB_RELEASE}.apk" - else - if !is_ci - build_android_app( - task: 'assemble', - build_type: 'release', - project_dir: "./android" - ) - adb( - command: "install #{lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH]}" - ) - end end end +desc "Build Android apk" +private_lane :build_android_apk do + sh("echo #{ENV["ANDROID_KEYSTORE"]} | base64 -d | tee #{File.expand_path('..', Dir.pwd)}/android/tooot.jks >/dev/null", log: false) + + prepare_playstore_android + + build_android_app( + task: 'assemble', + build_type: 'release', + project_dir: "./android", + print_command: true, + print_command_output: true, + properties: { + "expoSDK" => VERSIONS[:expo], + "releaseChannel" => RELEASE_CHANNEL, + "android.injected.signing.store.file" => "#{File.expand_path('..', Dir.pwd)}/android/tooot.jks", + "android.injected.signing.store.password" => ENV["ANDROID_KEYSTORE_PASSWORD"], + "android.injected.signing.key.alias" => ENV["ANDROID_KEYSTORE_ALIAS"], + "android.injected.signing.key.password" => ENV["ANDROID_KEYSTORE_KEY_PASSWORD"], + } + ) + + sh "mv #{lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH]} #{File.expand_path('..', Dir.pwd)}/tooot-#{GITHUB_RELEASE}.apk" +end + lane :ios do releaseExists = get_github_release(url: GITHUB_REPO, version: "v#{VERSION}", api_token: ENV['GH_PAT_GET_RELEASE']) if releaseExists @@ -239,13 +174,17 @@ end lane :release do releaseExists = get_github_release(url: GITHUB_REPO, version: "v#{VERSION}", api_token: ENV['GH_PAT_GET_RELEASE']) if !releaseExists - case ENVIRONMENT - when "candidate" - github_release(prerelease: true) - when "release" - github_release(prerelease: false) - end + build_android_apk + set_github_release( + repository_name: GITHUB_REPO, + name: GITHUB_RELEASE, + tag_name: GITHUB_RELEASE, + description: "No changelog provided", + commitish: git_branch, + is_prerelease: ENVIRONMENT == 'candidate', + upload_assets: ["#{File.expand_path('..', Dir.pwd)}/tooot-#{GITHUB_RELEASE}.apk"] + ) end - expo_release + yarn( package_path: "./package.json", flags: "release", command: RELEASE_CHANNEL ) rocket end