require 'yaml' require_relative 'changelog' lane :alpha do config_xcodegen_alpha() xcodegen(spec: "project.yml") provisioning_profile_name = "ElementX PR Ad Hoc" bundle_identifier = "io.element.elementx.pr" code_signing_identity = "Apple Distribution: Vector Creations Limited (7J4U792NQT)" update_code_signing_settings( use_automatic_signing: false, bundle_identifier: bundle_identifier, profile_name: provisioning_profile_name, code_sign_identity: code_signing_identity ) get_provisioning_profile( app_identifier: bundle_identifier, provisioning_name: provisioning_profile_name, ignore_profiles_with_different_name: true, adhoc: true ) version = ENV["GITHUB_PR_NUMBER"] update_app_icon(caption_text: "PR #{version}") build_ios_app( clean: true, export_method: "ad-hoc", output_directory: "build", export_options: { provisioningProfiles: { bundle_identifier => provisioning_profile_name, } } ) upload_to_diawi() export_version_changes(version: version) end lane :build_and_publish_on_github do ios_adhoc() upload_to_diawi() mac_adhoc() release_to_github() end lane :ios_adhoc do build_ios_app( scheme: "ElementX", clean: true, export_method: "ad-hoc", output_directory: "build", export_options: { provisioningProfiles: { "io.element.elementx" => "ElementX Ad Hoc", } } ) end lane :mac_adhoc do build_mac_app( scheme: "ElementX", clean: true, export_method: "mac-application", output_directory: "build" ) zip( path: "build/ElementX.app", output_path: "build/ElementX.app.zip" ) end lane :tests do run_tests() slather( cobertura_xml: true, output_directory: "./fastlane/test_output", proj: "ElementX.xcodeproj", scheme: "ElementX", ) end private_lane :export_version_changes do |options| Dir.chdir("..") do Changelog.update_topmost_section(version: options[:version], additional_entries: {}) changelog = Changelog.extract_first_section # Pushing them directly into the $GITHUB_ENV results in errors # https://trstringer.com/github-actions-multiline-strings/ # String substitution and here documents failed too sh("echo '#{changelog}' >> version_changes.md") end end private_lane :config_xcodegen_alpha do target_file_path = "../ElementX/SupportingFiles/target.yml" data = YAML.load_file target_file_path data["targets"]["ElementX"]["settings"]["base"]["PRODUCT_NAME"] = "ElementX PR" data["targets"]["ElementX"]["settings"]["base"]["PRODUCT_BUNDLE_IDENTIFIER"] = "io.element.elementx.pr" File.open(target_file_path, 'w') { |f| YAML.dump(data, f) } end desc "Upload IPA to Diawi" private_lane :upload_to_diawi do api_token = ENV["DIAWI_API_TOKEN"] UI.user_error!("Invalid Diawi API token.") unless !api_token.to_s.empty? # Upload to Diawi diawi( token: api_token, wall_of_apps: false, file: lane_context[SharedValues::IPA_OUTPUT_PATH] ) # Get the Diawi link from Diawi action shared value diawi_link = lane_context[SharedValues::UPLOADED_FILE_LINK_TO_DIAWI] UI.command_output("Diawi link: " + diawi_link.to_s) # Generate the Diawi QR code file link diawi_app_id = URI(diawi_link).path.split('/').last diawi_qr_code_link = "https://www.diawi.com/qrcode/link/#{diawi_app_id}" # Set "DIAWI_FILE_LINK" to GitHub environment variables for Github actions sh("echo DIAWI_FILE_LINK=#{diawi_link} >> $GITHUB_ENV") sh("echo DIAWI_QR_CODE_LINK=#{diawi_qr_code_link} >> $GITHUB_ENV") end desc "Create GitHub Release" private_lane :release_to_github do api_token = "" #ENV["GITHUB_TOKEN"] UI.user_error!("Invalid GitHub API token.") unless !api_token.to_s.empty? # Get the Diawi link from Diawi action shared value diawi_link = lane_context[SharedValues::UPLOADED_FILE_LINK_TO_DIAWI] # Generate the Diawi QR code file link diawi_app_id = URI(diawi_link).path.split('/').last diawi_qr_code_link = "https://www.diawi.com/qrcode/link/#{diawi_app_id}" release_version = "v#{get_version_number()}.#{Time.now.strftime("%Y%m%d%H%M")}" github_release = set_github_release( repository_name: "vector-im/element-x-ios", api_token: api_token, name: release_version, tag_name: release_version, is_generate_release_notes: true, description: "[iOS AdHoc Release - Diawi Link](#{diawi_link}) ![QR code](#{diawi_qr_code_link})", upload_assets: ["build/ElementX.app.zip"] ) end private_lane :update_app_icon do |options| caption_text = options[:caption_text] UI.user_error!("Invalid caption text.") unless !caption_text.to_s.empty? Dir.glob("../ElementX/Resources/Assets.xcassets/AppIcon.appiconset/**/*.png") do |file_name| # Change the icons color sh("convert '#{file_name}' -modulate 100,100,200 '#{file_name}'") caption_width = sh("identify -format %w '#{file_name}'") caption_height = file_name.end_with?("@2x.png") ? 60 : 30 if caption_width.to_i > caption_height*2 then # Add a label on top sh("convert -background '#0008' -fill white -gravity center -size '#{caption_width}'x'#{caption_height}' caption:'#{caption_text}' '#{file_name}' +swap -gravity south -composite '#{file_name}'") end end end