fastlane 2.139.0 → 2.144.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +85 -72
  4. data/cert/lib/cert/options.rb +12 -5
  5. data/cert/lib/cert/runner.rb +13 -0
  6. data/deliver/lib/deliver/options.rb +28 -2
  7. data/deliver/lib/deliver/runner.rb +13 -2
  8. data/fastlane/lib/fastlane/action.rb +1 -1
  9. data/fastlane/lib/fastlane/actions/.hockey.rb.swp +0 -0
  10. data/fastlane/lib/fastlane/actions/.slack.rb.swp +0 -0
  11. data/fastlane/lib/fastlane/actions/.update_project_provisioning.rb.swp +0 -0
  12. data/fastlane/lib/fastlane/actions/README.md +2 -0
  13. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +13 -5
  14. data/fastlane/lib/fastlane/actions/automatic_code_signing.rb +7 -1
  15. data/fastlane/lib/fastlane/actions/build_app.rb +157 -6
  16. data/fastlane/lib/fastlane/actions/build_ios_app.rb +28 -132
  17. data/fastlane/lib/fastlane/actions/build_mac_app.rb +46 -0
  18. data/fastlane/lib/fastlane/actions/clean_build_artifacts.rb +3 -0
  19. data/fastlane/lib/fastlane/actions/cocoapods.rb +2 -2
  20. data/fastlane/lib/fastlane/actions/crashlytics.rb +14 -2
  21. data/fastlane/lib/fastlane/actions/create_pull_request.rb +29 -0
  22. data/fastlane/lib/fastlane/actions/docs/{build_ios_app.md → build_app.md} +1 -1
  23. data/fastlane/lib/fastlane/actions/docs/frame_screenshots.md +22 -6
  24. data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +22 -6
  25. data/fastlane/lib/fastlane/actions/ensure_git_branch.rb +1 -1
  26. data/fastlane/lib/fastlane/actions/ensure_xcode_version.rb +35 -7
  27. data/fastlane/lib/fastlane/actions/frame_screenshots.rb +2 -1
  28. data/fastlane/lib/fastlane/actions/get_github_release.rb +3 -0
  29. data/fastlane/lib/fastlane/actions/gradle.rb +43 -2
  30. data/fastlane/lib/fastlane/actions/gym.rb +3 -7
  31. data/fastlane/lib/fastlane/actions/import_from_git.rb +4 -0
  32. data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +9 -3
  33. data/fastlane/lib/fastlane/actions/notarize.rb +183 -0
  34. data/fastlane/lib/fastlane/actions/pod_lib_lint.rb +7 -1
  35. data/fastlane/lib/fastlane/actions/run_tests.rb +5 -22
  36. data/fastlane/lib/fastlane/actions/s3.rb +5 -291
  37. data/fastlane/lib/fastlane/actions/set_github_release.rb +1 -1
  38. data/fastlane/lib/fastlane/actions/spm.rb +8 -0
  39. data/fastlane/lib/fastlane/actions/swiftlint.rb +45 -9
  40. data/fastlane/lib/fastlane/actions/update_code_signing_settings.rb +190 -0
  41. data/fastlane/lib/fastlane/actions/update_plist.rb +37 -2
  42. data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +13 -3
  43. data/fastlane/lib/fastlane/actions/upload_to_app_store.rb +1 -0
  44. data/fastlane/lib/fastlane/fast_file.rb +13 -3
  45. data/fastlane/lib/fastlane/helper/adb_helper.rb +1 -1
  46. data/fastlane/lib/fastlane/helper/s3_client_helper.rb +56 -0
  47. data/fastlane/lib/fastlane/plugins/plugin_manager.rb +1 -1
  48. data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +2 -0
  49. data/fastlane/lib/fastlane/runner.rb +23 -18
  50. data/fastlane/lib/fastlane/server/socket_server_action_command_executor.rb +1 -1
  51. data/fastlane/lib/fastlane/version.rb +1 -1
  52. data/fastlane/swift/Deliverfile.swift +1 -1
  53. data/fastlane/swift/DeliverfileProtocol.swift +3 -3
  54. data/fastlane/swift/Fastlane.swift +422 -45
  55. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcuserdata/josh.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  56. data/fastlane/swift/Gymfile.swift +1 -1
  57. data/fastlane/swift/GymfileProtocol.swift +17 -1
  58. data/fastlane/swift/Matchfile.swift +1 -1
  59. data/fastlane/swift/MatchfileProtocol.swift +23 -3
  60. data/fastlane/swift/Precheckfile.swift +1 -1
  61. data/fastlane/swift/RubyCommand.swift +1 -1
  62. data/fastlane/swift/Scanfile.swift +1 -1
  63. data/fastlane/swift/ScanfileProtocol.swift +21 -1
  64. data/fastlane/swift/Screengrabfile.swift +1 -1
  65. data/fastlane/swift/Snapshotfile.swift +1 -1
  66. data/fastlane/swift/SnapshotfileProtocol.swift +9 -1
  67. data/fastlane_core/lib/fastlane_core/cert_checker.rb +28 -0
  68. data/fastlane_core/lib/fastlane_core/device_manager.rb +1 -1
  69. data/fastlane_core/lib/fastlane_core/ipa_file_analyser.rb +1 -0
  70. data/fastlane_core/lib/fastlane_core/keychain_importer.rb +2 -0
  71. data/fastlane_core/lib/fastlane_core/project.rb +27 -0
  72. data/fastlane_core/lib/fastlane_core/provisioning_profile.rb +15 -2
  73. data/frameit/lib/frameit/commands_generator.rb +25 -0
  74. data/frameit/lib/frameit/config_parser.rb +31 -9
  75. data/frameit/lib/frameit/device.rb +90 -0
  76. data/frameit/lib/frameit/device_types.rb +121 -5
  77. data/frameit/lib/frameit/editor.rb +28 -40
  78. data/frameit/lib/frameit/offsets.rb +8 -1
  79. data/frameit/lib/frameit/options.rb +81 -54
  80. data/frameit/lib/frameit/runner.rb +17 -7
  81. data/frameit/lib/frameit/screenshot.rb +35 -47
  82. data/frameit/lib/frameit/template_finder.rb +15 -12
  83. data/gym/lib/gym/code_signing_mapping.rb +32 -3
  84. data/gym/lib/gym/detect_values.rb +34 -2
  85. data/gym/lib/gym/generators/package_command_generator.rb +8 -0
  86. data/gym/lib/gym/generators/package_command_generator_xcode7.rb +52 -17
  87. data/gym/lib/gym/module.rb +8 -0
  88. data/gym/lib/gym/options.rb +25 -1
  89. data/gym/lib/gym/runner.rb +70 -21
  90. data/match/lib/match/change_password.rb +1 -1
  91. data/match/lib/match/encryption.rb +4 -0
  92. data/match/lib/match/encryption/openssl.rb +1 -1
  93. data/match/lib/match/generator.rb +17 -3
  94. data/match/lib/match/importer.rb +35 -20
  95. data/match/lib/match/module.rb +5 -2
  96. data/match/lib/match/nuke.rb +59 -17
  97. data/match/lib/match/options.rb +38 -15
  98. data/match/lib/match/runner.rb +24 -8
  99. data/match/lib/match/setup.rb +1 -1
  100. data/match/lib/match/spaceship_ensure.rb +19 -9
  101. data/match/lib/match/storage.rb +4 -0
  102. data/match/lib/match/storage/git_storage.rb +5 -2
  103. data/match/lib/match/storage/google_cloud_storage.rb +2 -2
  104. data/match/lib/match/storage/s3_storage.rb +162 -0
  105. data/pilot/lib/pilot/.manager.rb.swp +0 -0
  106. data/pilot/lib/pilot/build_manager.rb +24 -9
  107. data/scan/lib/scan/detect_values.rb +6 -1
  108. data/scan/lib/scan/manager.rb +18 -1
  109. data/scan/lib/scan/options.rb +28 -1
  110. data/scan/lib/scan/runner.rb +9 -7
  111. data/scan/lib/scan/slack_poster.rb +1 -1
  112. data/scan/lib/scan/test_command_generator.rb +12 -5
  113. data/screengrab/lib/screengrab/runner.rb +31 -18
  114. data/sigh/lib/sigh/.runner.rb.swp +0 -0
  115. data/snapshot/lib/snapshot/fixes/simulator_shared_pasteboard.rb +16 -0
  116. data/snapshot/lib/snapshot/options.rb +12 -1
  117. data/snapshot/lib/snapshot/simulator_launchers/launcher_configuration.rb +2 -0
  118. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +13 -0
  119. data/spaceship/lib/spaceship/connect_api/.DS_Store +0 -0
  120. data/spaceship/lib/spaceship/connect_api/models/.bundle_id.rb.swp +0 -0
  121. data/{gym/lib/gym/.runner.rb.swp → spaceship/lib/spaceship/connect_api/models/.bundle_id_capability.rb.swp} +0 -0
  122. data/spaceship/lib/spaceship/connect_api/models/app.rb +11 -0
  123. data/spaceship/lib/spaceship/connect_api/models/beta_feedback.rb +4 -0
  124. data/spaceship/lib/spaceship/connect_api/models/build.rb +1 -2
  125. data/spaceship/lib/spaceship/connect_api/models/certificate.rb +2 -0
  126. data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +29 -0
  127. data/spaceship/lib/spaceship/portal/app.rb +11 -2
  128. data/spaceship/lib/spaceship/tunes/app_version.rb +6 -1
  129. data/spaceship/lib/spaceship/tunes/iap.rb +11 -11
  130. data/spaceship/lib/spaceship/tunes/iap_detail.rb +7 -3
  131. data/spaceship/lib/spaceship/tunes/iap_families.rb +12 -1
  132. data/spaceship/lib/spaceship/tunes/iap_family_details.rb +26 -17
  133. data/spaceship/lib/spaceship/tunes/iap_status.rb +5 -1
  134. data/spaceship/lib/spaceship/tunes/tunes_client.rb +2 -2
  135. data/supply/lib/supply/client.rb +1 -1
  136. metadata +63 -18
@@ -241,7 +241,7 @@ module Fastlane
241
241
  end
242
242
 
243
243
  def self.return_type
244
- :hash_of_strings
244
+ :hash
245
245
  end
246
246
 
247
247
  def self.authors
@@ -15,6 +15,9 @@ module Fastlane
15
15
  end
16
16
  if params[:xcpretty_output]
17
17
  cmd += ["2>&1", "|", "xcpretty", "--#{params[:xcpretty_output]}"]
18
+ if params[:xcpretty_args]
19
+ cmd << (params[:xcpretty_args]).to_s
20
+ end
18
21
  cmd = %w(set -o pipefail &&) + cmd
19
22
  end
20
23
 
@@ -67,6 +70,11 @@ module Fastlane
67
70
  verify_block: proc do |value|
68
71
  UI.user_error!("Please pass a valid xcpretty output type: (#{xcpretty_output_types.join('|')})") unless xcpretty_output_types.include?(value)
69
72
  end),
73
+ FastlaneCore::ConfigItem.new(key: :xcpretty_args,
74
+ env_name: "FL_SPM_XCPRETTY_ARGS",
75
+ description: "Pass in xcpretty additional command line arguments (e.g. '--test --no-color' or '--tap --no-utf'), requires xcpretty_output to be specified also",
76
+ type: String,
77
+ optional: true),
70
78
  FastlaneCore::ConfigItem.new(key: :verbose,
71
79
  short_option: "-v",
72
80
  env_name: "FL_SPM_VERBOSE",
@@ -13,13 +13,7 @@ module Fastlane
13
13
 
14
14
  command = (params[:executable] || "swiftlint").dup
15
15
  command << " #{params[:mode]}"
16
- command << " --path #{params[:path].shellescape}" if params[:path]
17
- command << supported_option_switch(params, :strict, "0.9.2", true)
18
- command << " --config #{params[:config_file].shellescape}" if params[:config_file]
19
- command << " --reporter #{params[:reporter]}" if params[:reporter]
20
- command << supported_option_switch(params, :quiet, "0.9.0", true)
21
- command << supported_option_switch(params, :format, "0.11.0", true) if params[:mode] == :autocorrect
22
- command << " --compiler-log-path #{params[:compiler_log_path].shellescape}" if params[:compiler_log_path]
16
+ command << optional_flags(params)
23
17
 
24
18
  if params[:files]
25
19
  if version < Gem::Version.new('0.5.1')
@@ -37,15 +31,37 @@ module Fastlane
37
31
  Actions.sh(command)
38
32
  rescue
39
33
  handle_swiftlint_error(params[:ignore_exit_status], $?.exitstatus)
34
+ raise if params[:raise_if_swiftlint_error]
40
35
  end
41
36
  end
42
37
 
38
+ def self.optional_flags(params)
39
+ command = ""
40
+ command << " --path #{params[:path].shellescape}" if params[:path]
41
+ command << supported_option_switch(params, :strict, "0.9.2", true)
42
+ command << " --config #{params[:config_file].shellescape}" if params[:config_file]
43
+ command << " --reporter #{params[:reporter]}" if params[:reporter]
44
+ command << supported_option_switch(params, :quiet, "0.9.0", true)
45
+ command << supported_option_switch(params, :format, "0.11.0", true) if params[:mode] == :autocorrect
46
+ command << supported_no_cache_option(params) if params[:no_cache]
47
+ command << " --compiler-log-path #{params[:compiler_log_path].shellescape}" if params[:compiler_log_path]
48
+ return command
49
+ end
50
+
43
51
  # Get current SwiftLint version
44
52
  def self.swiftlint_version(executable: nil)
45
53
  binary = executable || 'swiftlint'
46
54
  Gem::Version.new(`#{binary} version`.chomp)
47
55
  end
48
56
 
57
+ def self.supported_no_cache_option(params)
58
+ if params[:mode] == :autocorrect || params[:mode] == :lint
59
+ return " --no-cache"
60
+ else
61
+ return ""
62
+ end
63
+ end
64
+
49
65
  # Return "--option" switch if option is on and current SwiftLint version is greater or equal than min version.
50
66
  # Return "" otherwise.
51
67
  def self.supported_option_switch(params, option, min_version, can_ignore = false)
@@ -106,10 +122,22 @@ module Fastlane
106
122
  is_string: false,
107
123
  type: Boolean,
108
124
  optional: true),
125
+ FastlaneCore::ConfigItem.new(key: :raise_if_swiftlint_error,
126
+ description: "Raises an error if swiftlint fails, so you can fail CI/CD jobs if necessary \
127
+ (true/false)",
128
+ default_value: false,
129
+ is_string: false,
130
+ type: Boolean,
131
+ optional: true),
109
132
  FastlaneCore::ConfigItem.new(key: :reporter,
110
- description: 'Choose output reporter',
133
+ description: "Choose output reporter. Available: xcode, json, csv, checkstyle, junit, html, \
134
+ emoji, sonarqube, markdown, github-actions-logging",
111
135
  is_string: true,
112
- optional: true),
136
+ optional: true,
137
+ verify_block: proc do |value|
138
+ available = ['xcode', 'json', 'csv', 'checkstyle', 'junit', 'html', 'emoji', 'sonarqube', 'markdown', 'github-actions-logging']
139
+ UI.user_error!("Available values are '#{available.join("', '")}'") unless available.include?(value)
140
+ end),
113
141
  FastlaneCore::ConfigItem.new(key: :quiet,
114
142
  description: "Don't print status logs like 'Linting <file>' & 'Done linting'",
115
143
  default_value: false,
@@ -126,6 +154,12 @@ module Fastlane
126
154
  is_string: false,
127
155
  type: Boolean,
128
156
  optional: true),
157
+ FastlaneCore::ConfigItem.new(key: :no_cache,
158
+ description: "Ignore the cache when mode is :autocorrect or :lint",
159
+ default_value: false,
160
+ is_string: false,
161
+ type: Boolean,
162
+ optional: true),
129
163
  FastlaneCore::ConfigItem.new(key: :compiler_log_path,
130
164
  description: "Compiler log path when mode is :analyze",
131
165
  is_string: true,
@@ -161,7 +195,9 @@ module Fastlane
161
195
  "AppDelegate.swift",
162
196
  "path/to/project/Model.swift"
163
197
  ],
198
+ raise_if_swiftlint_error: true, # Allow fastlane to raise an error if swiftlint fails
164
199
  ignore_exit_status: true # Allow fastlane to continue even if SwiftLint returns a non-zero exit status
200
+
165
201
  )'
166
202
  ]
167
203
  end
@@ -0,0 +1,190 @@
1
+ require 'xcodeproj'
2
+ module Fastlane
3
+ module Actions
4
+ class UpdateCodeSigningSettingsAction < Action
5
+ def self.run(params)
6
+ FastlaneCore::PrintTable.print_values(config: params, title: "Summary for code signing settings")
7
+ path = params[:path]
8
+ path = File.join(File.expand_path(path), "project.pbxproj")
9
+
10
+ project = Xcodeproj::Project.open(params[:path])
11
+ UI.user_error!("Could not find path to project config '#{path}'. Pass the path to your project (not workspace)!") unless File.exist?(path)
12
+ UI.message("Updating the Automatic Codesigning flag to #{params[:use_automatic_signing] ? 'enabled' : 'disabled'} for the given project '#{path}'")
13
+
14
+ unless project.root_object.attributes["TargetAttributes"]
15
+ UI.user_error!("Seems to be a very old project file format - please open your project file in a more recent version of Xcode")
16
+ return false
17
+ end
18
+
19
+ target_dictionary = project.targets.map { |f| { name: f.name, uuid: f.uuid, build_configuration_list: f.build_configuration_list } }
20
+ target_attributes = project.root_object.attributes["TargetAttributes"]
21
+ changed_targets = []
22
+
23
+ # make sure TargetAttributes exist for all targets
24
+ target_dictionary.each do |props|
25
+ unless target_attributes.key?(props[:uuid])
26
+ target_attributes[props[:uuid]] = {}
27
+ end
28
+ end
29
+
30
+ target_attributes.each do |target, sett|
31
+ found_target = target_dictionary.detect { |h| h[:uuid] == target }
32
+ if params[:targets]
33
+ # get target name
34
+ unless params[:targets].include?(found_target[:name])
35
+ UI.important("Skipping #{found_target[:name]} not selected (#{params[:targets].join(',')})")
36
+ next
37
+ end
38
+ end
39
+
40
+ style_value = params[:use_automatic_signing] ? 'Automatic' : 'Manual'
41
+ build_configuration_list = found_target[:build_configuration_list]
42
+ build_configuration_list.set_setting("CODE_SIGN_STYLE", style_value)
43
+ sett["ProvisioningStyle"] = style_value
44
+
45
+ if params[:team_id]
46
+ sett["DevelopmentTeam"] = params[:team_id]
47
+ build_configuration_list.set_setting("DEVELOPMENT_TEAM", params[:team_id])
48
+ UI.important("Set Team id to: #{params[:team_id]} for target: #{found_target[:name]}")
49
+ end
50
+ if params[:code_sign_identity]
51
+ build_configuration_list.set_setting("CODE_SIGN_IDENTITY", params[:code_sign_identity])
52
+
53
+ # We also need to update the value if it was overridden for a specific SDK
54
+ build_configuration_list.build_configurations.each do |build_configuration|
55
+ codesign_build_settings_keys = build_configuration.build_settings.keys.select { |key| key.to_s.match(/CODE_SIGN_IDENTITY.*/) }
56
+ codesign_build_settings_keys.each do |setting|
57
+ build_configuration_list.set_setting(setting, params[:code_sign_identity])
58
+ end
59
+ end
60
+ UI.important("Set Code Sign identity to: #{params[:code_sign_identity]} for target: #{found_target[:name]}")
61
+ end
62
+ if params[:profile_name]
63
+ build_configuration_list.set_setting("PROVISIONING_PROFILE_SPECIFIER", params[:profile_name])
64
+ UI.important("Set Provisioning Profile name to: #{params[:profile_name]} for target: #{found_target[:name]}")
65
+ end
66
+ # Since Xcode 8, this is no longer needed, you simply use PROVISIONING_PROFILE_SPECIFIER
67
+ if params[:profile_uuid]
68
+ build_configuration_list.set_setting("PROVISIONING_PROFILE", params[:profile_uuid])
69
+ UI.important("Set Provisioning Profile UUID to: #{params[:profile_uuid]} for target: #{found_target[:name]}")
70
+ end
71
+ if params[:bundle_identifier]
72
+ build_configuration_list.set_setting("PRODUCT_BUNDLE_IDENTIFIER", params[:bundle_identifier])
73
+ UI.important("Set Bundle identifier to: #{params[:bundle_identifier]} for target: #{found_target[:name]}")
74
+ end
75
+
76
+ changed_targets << found_target[:name]
77
+ end
78
+ project.save
79
+
80
+ if changed_targets.empty?
81
+ UI.important("None of the specified targets has been modified")
82
+ UI.important("available targets:")
83
+ target_dictionary.each do |target|
84
+ UI.important("\t* #{target[:name]}")
85
+ end
86
+ else
87
+ UI.success("Successfully updated project settings to use Code Sign Style = '#{params[:use_automatic_signing] ? 'Automatic' : 'Manual'}'")
88
+ UI.success("Modified Targets:")
89
+ changed_targets.each do |target|
90
+ UI.success("\t * #{target}")
91
+ end
92
+ end
93
+
94
+ params[:use_automatic_signing]
95
+ end
96
+
97
+ def self.description
98
+ "Configures Xcode's Codesigning options"
99
+ end
100
+
101
+ def self.details
102
+ "Configures Xcode's Codesigning options of all targets in the project"
103
+ end
104
+
105
+ def self.available_options
106
+ [
107
+ FastlaneCore::ConfigItem.new(key: :path,
108
+ env_name: "FL_PROJECT_SIGNING_PROJECT_PATH",
109
+ description: "Path to your Xcode project",
110
+ code_gen_sensitive: true,
111
+ default_value: Dir['*.xcodeproj'].first,
112
+ default_value_dynamic: true,
113
+ verify_block: proc do |value|
114
+ UI.user_error!("Path is invalid") unless File.exist?(File.expand_path(value))
115
+ end),
116
+ FastlaneCore::ConfigItem.new(key: :use_automatic_signing,
117
+ env_name: "FL_PROJECT_USE_AUTOMATIC_SIGNING",
118
+ description: "Defines if project should use automatic signing",
119
+ is_string: false,
120
+ default_value: false),
121
+ FastlaneCore::ConfigItem.new(key: :team_id,
122
+ env_name: "FASTLANE_TEAM_ID",
123
+ optional: true,
124
+ description: "Team ID, is used when upgrading project",
125
+ is_string: true),
126
+ FastlaneCore::ConfigItem.new(key: :targets,
127
+ env_name: "FL_PROJECT_SIGNING_TARGETS",
128
+ optional: true,
129
+ type: Array,
130
+ description: "Specify targets you want to toggle the signing mech. (default to all targets)",
131
+ is_string: false),
132
+ FastlaneCore::ConfigItem.new(key: :code_sign_identity,
133
+ env_name: "FL_CODE_SIGN_IDENTITY",
134
+ description: "Code signing identity type (iPhone Developer, iPhone Distribution)",
135
+ optional: true,
136
+ is_string: true),
137
+ FastlaneCore::ConfigItem.new(key: :profile_name,
138
+ env_name: "FL_PROVISIONING_PROFILE_SPECIFIER",
139
+ description: "Provisioning profile name to use for code signing",
140
+ optional: true,
141
+ is_string: true),
142
+ FastlaneCore::ConfigItem.new(key: :profile_uuid,
143
+ env_name: "FL_PROVISIONING_PROFILE",
144
+ description: "Provisioning profile UUID to use for code signing",
145
+ optional: true,
146
+ is_string: true),
147
+ FastlaneCore::ConfigItem.new(key: :bundle_identifier,
148
+ env_name: "FL_APP_IDENTIFIER",
149
+ description: "Application Product Bundle Identifier",
150
+ optional: true,
151
+ is_string: true)
152
+ ]
153
+ end
154
+
155
+ def self.output
156
+ end
157
+
158
+ def self.example_code
159
+ [
160
+ ' # manual code signing
161
+ update_code_signing_settings(
162
+ use_automatic_signing: false,
163
+ path: "demo-project/demo/demo.xcodeproj"
164
+ )',
165
+ ' # automatic code signing
166
+ update_code_signing_settings(
167
+ use_automatic_signing: true,
168
+ path: "demo-project/demo/demo.xcodeproj"
169
+ )'
170
+ ]
171
+ end
172
+
173
+ def self.category
174
+ :code_signing
175
+ end
176
+
177
+ def self.return_value
178
+ "The current status (boolean) of codesigning after modification"
179
+ end
180
+
181
+ def self.authors
182
+ ["mathiasAichinger", "hjanuschka", "p4checo", "portellaa", "aeons", "att55"]
183
+ end
184
+
185
+ def self.is_supported?(platform)
186
+ [:ios, :mac].include?(platform)
187
+ end
188
+ end
189
+ end
190
+ end
@@ -39,7 +39,7 @@ module Fastlane
39
39
  end
40
40
 
41
41
  def self.details
42
- "This action allows you to modify any `plist` file."
42
+ "This action allows you to modify any value inside any `plist` file."
43
43
  end
44
44
 
45
45
  def self.available_options
@@ -57,11 +57,46 @@ module Fastlane
57
57
  end
58
58
 
59
59
  def self.author
60
- 'rishabhtayal'
60
+ ["rishabhtayal", "matthiaszarzecki"]
61
61
  end
62
62
 
63
63
  def self.example_code
64
64
  [
65
+ 'update_plist( # Updates the CLIENT_ID and GOOGLE_APP_ID string entries in the plist-file
66
+ plist_path: "path/to/your_plist_file.plist",
67
+ block: proc do |plist|
68
+ plist[:CLIENT_ID] = "new_client_id"
69
+ plist[:GOOGLE_APP_ID] = "new_google_app_id"
70
+ end
71
+ )',
72
+ 'update_plist( # Sets a boolean entry
73
+ plist_path: "path/to/your_plist_file.plist",
74
+ block: proc do |plist|
75
+ plist[:boolean_entry] = true
76
+ end
77
+ )',
78
+ 'update_plist( # Sets a number entry
79
+ plist_path: "path/to/your_plist_file.plist",
80
+ block: proc do |plist|
81
+ plist[:number_entry] = 13
82
+ end
83
+ )',
84
+ 'update_plist( # Sets an array-entry with multiple sub-types
85
+ plist_path: "path/to/your_plist_file.plist",
86
+ block: proc do |plist|
87
+ plist[:array_entry] = ["entry_01", true, 1243]
88
+ end
89
+ )',
90
+ 'update_plist( # The block can contain logic too
91
+ plist_path: "path/to/your_plist_file.plist",
92
+ block: proc do |plist|
93
+ if options[:environment] == "production"
94
+ plist[:CLIENT_ID] = "new_client_id_production"
95
+ else
96
+ plist[:CLIENT_ID] = "new_client_id_development"
97
+ end
98
+ end
99
+ )',
65
100
  'update_plist( # Advanced processing: find URL scheme for particular key and replace value
66
101
  plist_path: "path/to/Info.plist",
67
102
  block: proc do |plist|
@@ -10,8 +10,8 @@ module Fastlane
10
10
  find_gsp_path(params)
11
11
  find_api_token(params)
12
12
 
13
- if !params[:api_token] && !params[:gsp_path]
14
- UI.user_error!('Either Fabric API key or path to Firebase Crashlytics GoogleService-Info.plist must be given.')
13
+ if !params[:app_id] && !params[:gsp_path] && !params[:api_token]
14
+ UI.user_error!('Either Firebase Crashlytics App ID, path to GoogleService-Info.plist or legacy Fabric API key must be given.')
15
15
  end
16
16
 
17
17
  dsym_paths = []
@@ -87,7 +87,9 @@ module Fastlane
87
87
  UI.message("Uploading '#{path}'...")
88
88
  command = []
89
89
  command << File.expand_path(params[:binary_path]).shellescape
90
- if params[:gsp_path]
90
+ if params[:app_id]
91
+ command << "-ai #{params[:app_id].shellescape}"
92
+ elsif params[:gsp_path]
91
93
  command << "-gsp #{params[:gsp_path].shellescape}"
92
94
  elsif params[:api_token]
93
95
  command << "-a #{params[:api_token]}"
@@ -186,6 +188,14 @@ module Fastlane
186
188
  UI.user_error!("Couldn't find file at path '#{File.expand_path(value)}'") unless File.exist?(value)
187
189
  UI.user_error!("No Path to GoogleService-Info.plist for Firebase Crashlytics given, pass using `gsp_path: 'path'`") if value.to_s.length == 0
188
190
  end),
191
+ FastlaneCore::ConfigItem.new(key: :app_id,
192
+ env_name: "CRASHLYTICS_APP_ID",
193
+ sensitive: true,
194
+ optional: true,
195
+ description: "Firebase Crashlytics APP ID",
196
+ verify_block: proc do |value|
197
+ UI.user_error!("No App ID for Firebase Crashlytics given, pass using `app_id: 'appId'`") if value.to_s.length == 0
198
+ end),
189
199
  FastlaneCore::ConfigItem.new(key: :binary_path,
190
200
  env_name: "FL_UPLOAD_SYMBOLS_TO_CRASHLYTICS_BINARY_PATH",
191
201
  description: "The path to the upload-symbols file of the Fabric app",
@@ -11,6 +11,7 @@ module Fastlane
11
11
  config.load_configuration_file("Deliverfile")
12
12
  config[:screenshots_path] = Actions.lane_context[SharedValues::SNAPSHOT_SCREENSHOTS_PATH] if Actions.lane_context[SharedValues::SNAPSHOT_SCREENSHOTS_PATH]
13
13
  config[:ipa] = Actions.lane_context[SharedValues::IPA_OUTPUT_PATH] if Actions.lane_context[SharedValues::IPA_OUTPUT_PATH]
14
+ config[:pkg] = Actions.lane_context[SharedValues::PKG_OUTPUT_PATH] if Actions.lane_context[SharedValues::PKG_OUTPUT_PATH]
14
15
 
15
16
  return config if Helper.test?
16
17
  Deliver::Runner.new(config).run
@@ -263,7 +263,7 @@ module Fastlane
263
263
  # @param branch [String] The branch to checkout in the repository
264
264
  # @param path [String] The path to the Fastfile
265
265
  # @param version [String, Array] Version requirement for repo tags
266
- def import_from_git(url: nil, branch: 'HEAD', path: 'fastlane/Fastfile', version: nil)
266
+ def import_from_git(url: nil, branch: 'HEAD', path: 'fastlane/Fastfile', version: nil, dependencies: [])
267
267
  UI.user_error!("Please pass a path to the `import_from_git` action") if url.to_s.length == 0
268
268
 
269
269
  Actions.execute_action('import_from_git') do
@@ -280,6 +280,10 @@ module Fastlane
280
280
 
281
281
  branch_option = "--branch #{branch}" if branch != 'HEAD'
282
282
 
283
+ checkout_dependencies = dependencies.map(&:shellescape).join(" ")
284
+
285
+ checkout_path = "#{path.shellescape} #{checkout_dependencies}"
286
+
283
287
  UI.message("Cloning remote git repo...")
284
288
  Helper.with_env_values('GIT_TERMINAL_PROMPT' => '0') do
285
289
  Actions.sh("git clone #{url.shellescape} #{clone_folder.shellescape} --depth 1 -n #{branch_option}")
@@ -292,7 +296,7 @@ module Fastlane
292
296
  UI.user_error!("No tag found matching #{version.inspect}") if checkout_param.nil?
293
297
  end
294
298
 
295
- Actions.sh("cd #{clone_folder.shellescape} && git checkout #{checkout_param.shellescape} #{path.shellescape}")
299
+ Actions.sh("cd #{clone_folder.shellescape} && git checkout #{checkout_param.shellescape} #{checkout_path}")
296
300
 
297
301
  # We also want to check out all the local actions of this fastlane setup
298
302
  containing = path.split(File::SEPARATOR)[0..-2]
@@ -304,7 +308,13 @@ module Fastlane
304
308
  # We don't care about a failure here, as local actions are optional
305
309
  end
306
310
 
307
- return_value = import(File.join(clone_folder, path))
311
+ return_value = nil
312
+ if dependencies.any?
313
+ return_value = [import(File.join(clone_folder, path))]
314
+ return_value += dependencies.map { |file_path| import(File.join(clone_folder, file_path)) }
315
+ else
316
+ return_value = import(File.join(clone_folder, path))
317
+ end
308
318
 
309
319
  action_completed('import_from_git', status: FastlaneCore::ActionCompletionStatus::SUCCESS)
310
320