Class: Fastlane::Actions::UpdateProjectProvisioningAction
- Inherits:
-
Fastlane::Action
- Object
- Fastlane::Action
- Fastlane::Actions::UpdateProjectProvisioningAction
- Defined in:
- lib/fastlane/actions/update_project_provisioning.rb
Constant Summary collapse
- ROOT_CERTIFICATE_URL =
"http://www.apple.com/appleca/AppleIncRootCertificate.cer"
Constants inherited from Fastlane::Action
Fastlane::Action::AVAILABLE_CATEGORIES
Class Method Summary collapse
- .authors ⇒ Object
- .available_options ⇒ Object
- .category ⇒ Object
- .description ⇒ Object
- .details ⇒ Object
- .example_code ⇒ Object
- .is_supported?(platform) ⇒ Boolean
- .run(params) ⇒ Object
Methods inherited from Fastlane::Action
action_name, author, lane_context, method_missing, other_action, output, return_value, sample_return_value, sh, step_text
Class Method Details
.authors ⇒ Object
126 127 128 |
# File 'lib/fastlane/actions/update_project_provisioning.rb', line 126 def self. ["tobiasstrebitzer", "czechboy0"] end |
.available_options ⇒ Object
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/fastlane/actions/update_project_provisioning.rb', line 91 def self. [ FastlaneCore::ConfigItem.new(key: :xcodeproj, env_name: "FL_PROJECT_PROVISIONING_PROJECT_PATH", description: "Path to your Xcode project", optional: true, verify_block: proc do |value| UI.user_error!("Path to xcode project is invalid") unless File.exist?(value) end), FastlaneCore::ConfigItem.new(key: :profile, env_name: "FL_PROJECT_PROVISIONING_PROFILE_FILE", description: "Path to provisioning profile (.mobileprovision)", default_value: Actions.lane_context[SharedValues::SIGH_PROFILE_PATH], verify_block: proc do |value| UI.user_error!("Path to provisioning profile is invalid") unless File.exist?(value) end), FastlaneCore::ConfigItem.new(key: :target_filter, env_name: "FL_PROJECT_PROVISIONING_PROFILE_TARGET_FILTER", description: "A filter for the target name. Use a standard regex", optional: true), FastlaneCore::ConfigItem.new(key: :build_configuration_filter, env_name: "FL_PROJECT_PROVISIONING_PROFILE_FILTER", description: "Legacy option, use 'target_filter' instead", optional: true), FastlaneCore::ConfigItem.new(key: :build_configuration, env_name: "FL_PROJECT_PROVISIONING_PROFILE_BUILD_CONFIGURATION", description: "A filter for the build configuration name. Use a standard regex. Applied to all configurations if not specified", optional: true), FastlaneCore::ConfigItem.new(key: :certificate, env_name: "FL_PROJECT_PROVISIONING_CERTIFICATE_PATH", description: "Path to apple root certificate", default_value: "/tmp/AppleIncRootCertificate.cer") ] end |
.category ⇒ Object
145 146 147 |
# File 'lib/fastlane/actions/update_project_provisioning.rb', line 145 def self.category :code_signing end |
.description ⇒ Object
75 76 77 |
# File 'lib/fastlane/actions/update_project_provisioning.rb', line 75 def self.description "Update projects code signing settings from your provisioning profile" end |
.details ⇒ Object
79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/fastlane/actions/update_project_provisioning.rb', line 79 def self.details [ "You should check out the code signing gide before using this action: https://github.com/fastlane/fastlane/tree/master/fastlane/docs/Codesigning", "This action retrieves a provisioning profile UUID from a provisioning profile (.mobileprovision) to set", "up the xcode projects' code signing settings in *.xcodeproj/project.pbxproj", "The `target_filter` value can be used to only update code signing for specified targets", "The `build_configuration` value can be used to only update code signing for specified build configurations of the targets passing through the `target_filter`", "Example Usage is the WatchKit Extension or WatchKit App, where you need separate provisioning profiles", "Example: `update_project_provisioning(xcodeproj: \"..\", target_filter: \".*WatchKit App.*\")" ].join("\n") end |
.example_code ⇒ Object
134 135 136 137 138 139 140 141 142 143 |
# File 'lib/fastlane/actions/update_project_provisioning.rb', line 134 def self.example_code [ 'update_project_provisioning( xcodeproj: "Project.xcodeproj", profile: "./watch_app_store.mobileprovision", # optional if you use sigh target_filter: ".*WatchKit Extension.*", # matches name or type of a target build_configuration: "Release" )' ] end |
.is_supported?(platform) ⇒ Boolean
130 131 132 |
# File 'lib/fastlane/actions/update_project_provisioning.rb', line 130 def self.is_supported?(platform) [:ios, :mac].include? platform end |
.run(params) ⇒ Object
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/fastlane/actions/update_project_provisioning.rb', line 9 def self.run(params) UI.("You’re updating provisioning profiles directly in your project, but have you considered easier ways to do code signing?") UI.("https://docs.fastlane.tools/codesigning/GettingStarted/") # assign folder from parameter or search for xcodeproj file folder = params[:xcodeproj] || Dir["*.xcodeproj"].first # validate folder project_file_path = File.join(folder, "project.pbxproj") UI.user_error!("Could not find path to project config '#{project_file_path}'. Pass the path to your project (not workspace)!") unless File.exist?(project_file_path) # download certificate unless File.exist?(params[:certificate]) UI.("Downloading root certificate from (#{ROOT_CERTIFICATE_URL}) to path '#{params[:certificate]}'") require 'open-uri' File.open(params[:certificate], "w") do |file| file.write(open(ROOT_CERTIFICATE_URL, "rb").read) end end # parsing mobileprovision file UI.("Parsing mobile provisioning profile from '#{params[:profile]}'") profile = File.read(params[:profile]) p7 = OpenSSL::PKCS7.new(profile) store = OpenSSL::X509::Store.new UI.user_error!("Could not find valid certificate at '#{params[:certificate]}'") unless File.size(params[:certificate]) > 0 cert = OpenSSL::X509::Certificate.new(File.read(params[:certificate])) store.add_cert(cert) p7.verify([cert], store) data = Plist.parse_xml(p7.data) target_filter = params[:target_filter] || params[:build_configuration_filter] configuration = params[:build_configuration] # manipulate project file UI.success("Going to update project '#{folder}' with UUID") require 'xcodeproj' project = Xcodeproj::Project.open(folder) project.targets.each do |target| if !target_filter || target.product_name.match(target_filter) || (target.respond_to?(:product_type) && target.product_type.match(target_filter)) UI.success("Updating target #{target.product_name}...") else UI.important("Skipping target #{target.product_name} as it doesn't match the filter '#{target_filter}'") next end target.build_configuration_list.build_configurations.each do |build_configuration| config_name = build_configuration.name if !configuration || config_name.match(configuration) UI.success("Updating configuration #{config_name}...") else UI.important("Skipping configuration #{config_name} as it doesn't match the filter '#{configuration}'") next end build_configuration.build_settings["PROVISIONING_PROFILE"] = data["UUID"] end end project.save # complete UI.success("Successfully updated project settings in'#{params[:xcodeproj]}'") end |