# 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 APP_NAME = ENV['APP_NAME'] DEVELOPER_KEY_ID = ENV['DEVELOPER_KEY_ID'] DEVELOPER_KEY_ISSUER_ID = ENV['DEVELOPER_KEY_ISSUER_ID'] DEVELOPER_KEY_CONTENT = ENV['DEVELOPER_KEY_CONTENT'] TEAM_ID = ENV['TEAM_ID'] TEMP_KEYCHAIN_USER = ENV['TEMP_KEYCHAIN_USER'] TEMP_KEYCHAIN_PASSWORD = ENV['TEMP_KEYCHAIN_PASSWORD'] DEVELOPER_APP_IDENTIFIER = ENV['DEVELOPER_APP_IDENTIFIER'] GIT_AUTHORIZATION = ENV['GIT_AUTHORIZATION'] TESTFLIGHT_EXTERNAL_GROUPS = ENV['TESTFLIGHT_EXTERNAL_GROUPS'] AS_CONNECT_BUILD_VERSION_FILENAME = 'AS_CONNECT_BUILD_VERSION' AS_CONNECT_BUILD_VERSION_PATH = "../#{AS_CONNECT_BUILD_VERSION_FILENAME}" XCODEPROJ = "#{APP_NAME}.xcodeproj" def delete_temp_keychain(name) delete_keychain( name: name ) if File.exist? File.expand_path("~/Library/Keychains/#{name}-db") end def create_temp_keychain(name, password) create_keychain( name: name, password: password, unlock: false, timeout: 0 ) end def ensure_temp_keychain(name, password) delete_temp_keychain(name) create_temp_keychain(name, password) end add_extra_platforms(platforms: [:tvos]) before_all do update_fastlane end desc "Bump build number and commit" lane :bump_build do as_connect_build_version = File.read(AS_CONNECT_BUILD_VERSION_PATH).to_i build = get_build_number(xcodeproj: XCODEPROJ).to_i puts "AS Connect build version: #{as_connect_build_version}" puts "Current build number: #{build}" if build <= as_connect_build_version new_build_number = as_connect_build_version + 1 increment_build_number actual_build_number = get_build_number(xcodeproj: XCODEPROJ).to_i puts "Bumped build number to #{actual_build_number}" File.open(AS_CONNECT_BUILD_VERSION_PATH, 'w+') { |file| file.write("#{new_build_number}\n") } commit_version_bump( message: "Bump build number to #{get_build_number(xcodeproj: XCODEPROJ)}", include: [AS_CONNECT_BUILD_VERSION_FILENAME], xcodeproj: XCODEPROJ ) else puts "Current build number is higher than App Store Connect build version" end end desc "Bump version number and commit" lane :bump_version do increment_version_number commit_version_bump( message: "Bump version number to #{get_version_number}", xcodeproj: XCODEPROJ ) end platform :ios do desc "Push a new beta build to TestFlight" lane :beta do ensure_temp_keychain(TEMP_KEYCHAIN_USER, TEMP_KEYCHAIN_PASSWORD) api_key = app_store_connect_api_key( key_id: DEVELOPER_KEY_ID, issuer_id: DEVELOPER_KEY_ISSUER_ID, key_content: DEVELOPER_KEY_CONTENT ) build = get_build_number(xcodeproj: XCODEPROJ) version = get_version_number( xcodeproj: XCODEPROJ, target: "#{APP_NAME} (iOS)" ) match( type: 'appstore', platform: 'ios', app_identifier: ["#{DEVELOPER_APP_IDENTIFIER}", "#{DEVELOPER_APP_IDENTIFIER}.Open-in-#{APP_NAME}"], git_basic_authorization: Base64.strict_encode64(GIT_AUTHORIZATION), readonly: true, keychain_name: TEMP_KEYCHAIN_USER, keychain_password: TEMP_KEYCHAIN_PASSWORD, api_key: api_key ) build_app( scheme: "#{APP_NAME} (iOS)", output_directory: "fastlane/builds/#{version}-#{build}/iOS", output_name: "#{APP_NAME}-#{version}-iOS.ipa", export_options: { provisioningProfiles: { "#{DEVELOPER_APP_IDENTIFIER}" => "match AppStore #{DEVELOPER_APP_IDENTIFIER}", "#{DEVELOPER_APP_IDENTIFIER}.Open-in-#{APP_NAME}" => "match AppStore #{DEVELOPER_APP_IDENTIFIER}.Open-in-#{APP_NAME}" } } ) changelog = File.read('../CHANGELOG.md') upload_to_testflight( api_key: api_key, ipa: lane_context[SharedValues::IPA_OUTPUT_PATH], distribute_external: true, groups: TESTFLIGHT_EXTERNAL_GROUPS, changelog: changelog ) end end platform :tvos do desc "Push a new beta build to TestFlight" lane :beta do ensure_temp_keychain(TEMP_KEYCHAIN_USER, TEMP_KEYCHAIN_PASSWORD) api_key = app_store_connect_api_key( key_id: DEVELOPER_KEY_ID, issuer_id: DEVELOPER_KEY_ISSUER_ID, key_content: DEVELOPER_KEY_CONTENT ) build = get_build_number(xcodeproj: XCODEPROJ) version = get_version_number( xcodeproj: XCODEPROJ, target: "#{APP_NAME} (tvOS)" ) match( type: 'appstore', platform: 'tvos', app_identifier: "#{DEVELOPER_APP_IDENTIFIER}", git_basic_authorization: Base64.strict_encode64(GIT_AUTHORIZATION), readonly: true, keychain_name: TEMP_KEYCHAIN_USER, keychain_password: TEMP_KEYCHAIN_PASSWORD, api_key: api_key ) build_app( scheme: "#{APP_NAME} (tvOS)", output_directory: "fastlane/builds/#{version}-#{build}/tvOS", output_name: "#{APP_NAME}-#{version}-tvOS.ipa", export_method: "app-store", export_options: { provisioningProfiles: { "#{DEVELOPER_APP_IDENTIFIER}" => "match AppStore #{DEVELOPER_APP_IDENTIFIER} tvos" } } ) changelog = File.read('../CHANGELOG.md') upload_to_testflight( api_key: api_key, ipa: lane_context[SharedValues::IPA_OUTPUT_PATH], distribute_external: true, groups: TESTFLIGHT_EXTERNAL_GROUPS, changelog: changelog ) end end platform :mac do desc "Push a new beta build to TestFlight" lane :beta do ensure_temp_keychain(TEMP_KEYCHAIN_USER, TEMP_KEYCHAIN_PASSWORD) api_key = app_store_connect_api_key( key_id: DEVELOPER_KEY_ID, issuer_id: DEVELOPER_KEY_ISSUER_ID, key_content: DEVELOPER_KEY_CONTENT ) build = get_build_number(xcodeproj: XCODEPROJ) version = get_version_number( xcodeproj: XCODEPROJ, target: "#{APP_NAME} (macOS)" ) match( type: 'appstore', platform: 'macos', additional_cert_types: ['mac_installer_distribution'], app_identifier: "#{DEVELOPER_APP_IDENTIFIER}", git_basic_authorization: Base64.strict_encode64(GIT_AUTHORIZATION), readonly: true, keychain_name: TEMP_KEYCHAIN_USER, keychain_password: TEMP_KEYCHAIN_PASSWORD, api_key: api_key ) build_app( scheme: "#{APP_NAME} (macOS)", output_directory: "fastlane/builds/#{version}-#{build}/macOS", output_name: "#{APP_NAME}-#{version}-macOS.app", export_method: "app-store", export_options: { provisioningProfiles: { "#{DEVELOPER_APP_IDENTIFIER}" => "match AppStore #{DEVELOPER_APP_IDENTIFIER} macos" } } ) changelog = File.read('../CHANGELOG.md') upload_to_testflight( api_key: api_key, pkg: lane_context[SharedValues::PKG_OUTPUT_PATH], distribute_external: true, groups: TESTFLIGHT_EXTERNAL_GROUPS, changelog: changelog ) end desc "Build for Developer ID distribution and notarize" lane :build_and_notarize do ensure_temp_keychain(TEMP_KEYCHAIN_USER, TEMP_KEYCHAIN_PASSWORD) api_key = app_store_connect_api_key( key_id: DEVELOPER_KEY_ID, issuer_id: DEVELOPER_KEY_ISSUER_ID, key_content: DEVELOPER_KEY_CONTENT ) build = get_build_number(xcodeproj: XCODEPROJ) version = get_version_number( xcodeproj: XCODEPROJ, target: "#{APP_NAME} (macOS)" ) match( type: 'developer_id', platform: 'macos', app_identifier: "#{DEVELOPER_APP_IDENTIFIER}", git_basic_authorization: Base64.strict_encode64(GIT_AUTHORIZATION), readonly: true, keychain_name: TEMP_KEYCHAIN_USER, keychain_password: TEMP_KEYCHAIN_PASSWORD, api_key: api_key ) build_mac_app( scheme: "#{APP_NAME} (macOS)", output_directory: "fastlane/builds/#{version}-#{build}/macOS", output_name: "#{APP_NAME}", export_method: "developer-id", export_options: { provisioningProfiles: { "#{DEVELOPER_APP_IDENTIFIER}" => "match Direct #{DEVELOPER_APP_IDENTIFIER} macos" } } ) notarize( package: "fastlane/builds/#{version}-#{build}/macOS/#{APP_NAME}.app", bundle_id: "#{DEVELOPER_APP_IDENTIFIER}", api_key: api_key, ) end end