default_platform(:ios) platform :ios do desc "Build a release tag and upload it to TestFlight" lane :beta do setup_ci match(type: "appstore") tag = ENV.fetch("GITHUB_REF_NAME") version = tag[%r{\Arelease/ios/v(\d+\.\d+\.\d+)\z}, 1] UI.user_error!("Expected a tag in the form release/ios/vX.Y.Z; got #{tag.inspect}") unless version build_number = ENV.fetch("GITHUB_RUN_NUMBER") UI.user_error!("GITHUB_RUN_NUMBER must be a positive integer") unless build_number.match?(/\A[1-9]\d*\z/) ios_dir = File.expand_path("..", __dir__) project_spec = File.join(ios_dir, "Apps/Sybil/project.yml") contents = File.read(project_spec) unless contents.match?(/^\s*MARKETING_VERSION:/) && contents.match?(/^\s*CURRENT_PROJECT_VERSION:/) UI.user_error!("Could not find version settings in #{project_spec}") end contents.sub!(/^(\s*MARKETING_VERSION:\s*).*/, "\\1\"#{version}\"") contents.sub!(/^(\s*CURRENT_PROJECT_VERSION:\s*).*/, "\\1#{build_number}") File.write(project_spec, contents) sh("xcodegen", "--spec", File.join(ios_dir, "project.yml")) api_key = app_store_connect_api_key( key_id: ENV.fetch("ASC_KEY_ID"), issuer_id: ENV.fetch("ASC_ISSUER_ID"), key_content: ENV.fetch("ASC_KEY"), is_key_content_base64: true ) build_app( project: File.join(ios_dir, "Sybil.xcodeproj"), scheme: "Sybil" ) upload_to_testflight( api_key: api_key, skip_waiting_for_build_processing: true, uses_non_exempt_encryption: false ) end end