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
@@ -0,0 +1,46 @@
1
+ module Fastlane
2
+ module Actions
3
+ require 'fastlane/actions/build_app'
4
+ class BuildMacAppAction < BuildAppAction
5
+ # Gym::Options.available_options keys that don't apply to mac apps.
6
+ REJECT_OPTIONS = [
7
+ :ipa,
8
+ :skip_package_ipa,
9
+ :catalyst_platform
10
+ ]
11
+
12
+ def self.run(params)
13
+ # Adding reject options back in so gym has everything it needs
14
+ params.available_options += Gym::Options.available_options.select do |option|
15
+ REJECT_OPTIONS.include?(option.key)
16
+ end
17
+
18
+ # Defaulting to mac specific values
19
+ params[:catalyst_platform] = "macos"
20
+
21
+ super(params)
22
+ end
23
+
24
+ #####################################################
25
+ # @!group Documentation
26
+ #####################################################
27
+
28
+ def self.available_options
29
+ require 'gym'
30
+ require 'gym/options'
31
+
32
+ Gym::Options.available_options.reject do |option|
33
+ REJECT_OPTIONS.include?(option.key)
34
+ end
35
+ end
36
+
37
+ def self.is_supported?(platform)
38
+ [:mac].include?(platform)
39
+ end
40
+
41
+ def self.description
42
+ "Alias for the `build_app` action but only for macOS"
43
+ end
44
+ end
45
+ end
46
+ end
@@ -21,6 +21,9 @@ module Fastlane
21
21
  File.delete(file)
22
22
  end
23
23
 
24
+ Actions.lane_context[Actions::SharedValues::SIGH_PROFILE_PATHS] = nil
25
+ Actions.lane_context[Actions::SharedValues::DSYM_PATHS] = nil
26
+
24
27
  UI.success('Cleaned up build artifacts 🐙')
25
28
  end
26
29
 
@@ -19,7 +19,7 @@ module Fastlane
19
19
 
20
20
  cmd << '--no-clean' unless params[:clean]
21
21
  cmd << '--no-integrate' unless params[:integrate]
22
- cmd << '--clean-install' if params[:clean_install] && pod_version.to_f >= 1.7
22
+ cmd << '--clean-install' if params[:clean_install] && pod_version(params).to_f >= 1.7
23
23
  cmd << '--repo-update' if params[:repo_update]
24
24
  cmd << '--silent' if params[:silent]
25
25
  cmd << '--verbose' if params[:verbose]
@@ -42,7 +42,7 @@ module Fastlane
42
42
  params[:use_bundle_exec] && shell_out_should_use_bundle_exec?
43
43
  end
44
44
 
45
- def self.pod_version
45
+ def self.pod_version(params)
46
46
  use_bundle_exec?(params) ? `bundle exec pod --version` : `pod --version`
47
47
  end
48
48
 
@@ -66,7 +66,7 @@ module Fastlane
66
66
  end
67
67
 
68
68
  def self.description
69
- "Upload a new build to [Crashlytics Beta](http://try.crashlytics.com/beta/)"
69
+ "Refer to [Firebase App Distribution](https://appdistro.page.link/fastlane-repo)"
70
70
  end
71
71
 
72
72
  def self.available_options
@@ -169,6 +169,10 @@ module Fastlane
169
169
 
170
170
  def self.details
171
171
  [
172
+ "Crashlytics Beta has been deprecated and replaced with Firebase App Distribution.",
173
+ "Beta will continue working until May 4, 2020.",
174
+ "Check out the [Firebase App Distribution docs](https://github.com/fastlane/fastlane-plugin-firebase_app_distribution) to get started.",
175
+ "",
172
176
  "Additionally, you can specify `notes`, `emails`, `groups` and `notifications`.",
173
177
  "Distributing to Groups: When using the `groups` parameter, it's important to use the group **alias** names for each group you'd like to distribute to. A group's alias can be found in the web UI. If you're viewing the Beta page, you can open the groups dialog by clicking the 'Manage Groups' button.",
174
178
  "This action uses the `submit` binary provided by the Crashlytics framework. If the binary is not found in its usual path, you'll need to specify the path manually by using the `crashlytics_path` option."
@@ -196,7 +200,15 @@ module Fastlane
196
200
  end
197
201
 
198
202
  def self.category
199
- :beta
203
+ :deprecated
204
+ end
205
+
206
+ def self.deprecated_notes
207
+ [
208
+ "Crashlytics Beta has been deprecated and replaced with Firebase App Distribution.",
209
+ "Beta will continue working until May 4, 2020.",
210
+ "Check out the [Firebase App Distribution docs](https://github.com/fastlane/fastlane-plugin-firebase_app_distribution) to get started."
211
+ ].join("\n")
200
212
  end
201
213
  end
202
214
  end
@@ -43,6 +43,9 @@ module Fastlane
43
43
  # Add reviewers to pull request
44
44
  add_reviewers(params, number) if params[:reviewers] || params[:team_reviewers]
45
45
 
46
+ # Add a milestone to pull request
47
+ add_milestone(params, number) if params[:milestone]
48
+
46
49
  Actions.lane_context[SharedValues::CREATE_PULL_REQUEST_HTML_URL] = html_url
47
50
  Actions.lane_context[SharedValues::CREATE_PULL_REQUEST_NUMBER] = number
48
51
  return html_url
@@ -111,6 +114,27 @@ module Fastlane
111
114
  )
112
115
  end
113
116
 
117
+ def self.add_milestone(params, number)
118
+ payload = {}
119
+ if params[:milestone]
120
+ payload["milestone"] = params[:milestone]
121
+ end
122
+
123
+ GithubApiAction.run(
124
+ server_url: params[:api_url],
125
+ api_token: params[:api_token],
126
+ http_method: 'PATCH',
127
+ path: "repos/#{params[:repo]}/issues/#{number}",
128
+ body: payload,
129
+ error_handlers: {
130
+ '*' => proc do |result|
131
+ UI.error("GitHub responded with #{result[:status]}: #{result[:body]}")
132
+ return nil
133
+ end
134
+ }
135
+ )
136
+ end
137
+
114
138
  #####################################################
115
139
  # @!group Documentation
116
140
  #####################################################
@@ -157,6 +181,11 @@ module Fastlane
157
181
  description: "The labels for the pull request",
158
182
  type: Array,
159
183
  optional: true),
184
+ FastlaneCore::ConfigItem.new(key: :milestone,
185
+ env_name: "GITHUB_PULL_REQUEST_MILESTONE",
186
+ description: "The milestone ID (Integer) for the pull request",
187
+ type: Numeric,
188
+ optional: true),
160
189
  FastlaneCore::ConfigItem.new(key: :head,
161
190
  env_name: "GITHUB_PULL_REQUEST_HEAD",
162
191
  description: "The name of the branch where your changes are implemented (defaults to the current branch name)",
@@ -146,7 +146,7 @@ export_options({
146
146
  Optional: If _gym_ can't automatically detect the provisioning profiles to use, you can pass a mapping of bundle identifiers to provisioning profiles:
147
147
 
148
148
  ```ruby
149
- build_ios_app(
149
+ build_app(
150
150
  scheme: "Release",
151
151
  export_options: {
152
152
  method: "app-store",
@@ -4,7 +4,7 @@
4
4
 
5
5
  ###### Easily put your screenshots into the right device frames
6
6
 
7
- _frameit_ allows you to put a gorgeous device frame around your iOS and macOS screenshots just by running one simple command. Use _frameit_ to prepare perfect screenshots for the App Store, your website, QA or emails.
7
+ _frameit_ allows you to put a gorgeous device frame around your iOS, macOS and Android screenshots just by running one simple command. Use _frameit_ to prepare perfect screenshots for the App Store, your website, QA or emails.
8
8
 
9
9
  -------
10
10
 
@@ -23,9 +23,10 @@ _frameit_ allows you to put a gorgeous device frame around your iOS and macOS sc
23
23
 
24
24
  ## Frame screenshot
25
25
 
26
- Put a gorgeous device frame around your iOS and macOS screenshots just by running one simple command. Support for:
26
+ Put a gorgeous device frame around your iOS, macOS and Android screenshots just by running one simple command. Support for:
27
27
 
28
28
  - iPhone, iPad and Mac
29
+ - Set of Android devices
29
30
  - Portrait and Landscape modes
30
31
  - Several device frame colors
31
32
 
@@ -69,12 +70,18 @@ More information about this process and how to update the frames can be found [h
69
70
 
70
71
  Why should you have to use Photoshop, just to add a frame around your screenshots?
71
72
 
72
- Just navigate to your folder of screenshots and use the following command:
73
+ Just navigate to your folder of screenshots and use the following command (iOS and Mac OS are default platforms for backward compatibility):
73
74
 
74
75
  ```no-highlight
75
76
  fastlane frameit
76
77
  ```
77
78
 
79
+ To frame Android screenshots:
80
+
81
+ ```no-highlight
82
+ fastlane frameit android
83
+ ```
84
+
78
85
  To use the silver version of the frames:
79
86
 
80
87
  ```no-highlight
@@ -129,8 +136,10 @@ The general parameters are defined in the `default` key and can be:
129
136
  | `padding` | The content of the framed screenshot will be resized to match the specified `padding` around all edges. The vertical padding is also applied between the text and the top or bottom (depending on `title_below_image`) of the device frame. <p> There are 3 different options of specyfying the padding: <p> 1. Default: An integer value that defines both horizontal and vertical padding in pixels. <br> 2. A string that defines (different) padding values in pixels for horizontal and vertical padding. The syntax is `"<horizontal>x<vertical>"`, e.g. `"30x60"`. <br> 3. A string that defines (different) padding values in percentage for horizontal and vertical padding. The syntax is `"<horizontal>%x<vertical>%"`, e.g. `"5%x10%"`. <br> **Note:** The percentage is calculated from the smallest image dimension (height or width). <p> A combination of option 2 and 3 is possible, e.g. `"5%x40"`. | `50` |
130
137
  | `interline_spacing` | Specifies whether _frameit_ should add or subtract this many pixels between the individual lines of text. This only applies to a multi-line `title` and/or `keyword` to expand or squash together the individual lines of text. | `0` |
131
138
  | `font_scale_factor` | Specifies whether _frameit_ should increase or decrease the font size of the text. | `0.1` |
132
- | `frame` | Overrides the color of the frame to be used. (Valid values are `BLACK, `WHITE`, `GOLD` and `ROSE_GOLD`) | NA |
139
+ | `frame` | Overrides the color of the frame to be used. (Valid values are `BLACK`, `WHITE`, `GOLD` and `ROSE_GOLD`) | NA |
133
140
  | `title_min_height` | Specifies a height always reserved for the title. Value can be a percentage of the height or an absolute value. The device will be placed below (or above) this area. Convenient to ensure the device top (or bottom) will be consistently placed at the same height on the different screenshots. | NA |
141
+ | `use_platform` | Overrides the platform used for the screenshot. Valid values are `IOS`, `ANDROID` and `ANY`. | `IOS` |
142
+ | `force_device_type` | Forces a specific device. Valid values are: Huawei P8, Motorola Moto E, Motorola Moto G, Nexus 4, Nexus 5X, Nexus 6P, Nexus 9, Samsung Galaxy Grand Prime, Samsung Galaxy Note 5, Samsung Galaxy S Duos, Samsung Galaxy S3, Samsung Galaxy S5, Samsung Galaxy S7, Samsung Galaxy S8, Samsung Galaxy S9, iPhone 5s, iPhone 5c, iPhone SE, iPhone 6s, iPhone 6s Plus, iPhone 7, iPhone 7 Plus, iPhone 8, iPhone 8 Plus, iPhone X, iPhone XS, iPhone XR, iPhone XS Max, iPad Air 2, iPad Mini 4, iPad Pro, MacBook, Google Pixel 3, Google Pixel 3 XL, HTC One A9, HTC One M8 | NA |
134
143
 
135
144
  ### Specific parameters
136
145
 
@@ -142,7 +151,9 @@ These are defined in the `data` key. This is an array with the following keys fo
142
151
  | `filter` | This is mandatory to link the individual configuration to the screenshot, based on part of the file name. <p>Example:<br>If a screenshot is named `iPhone 8-Brainstorming.png` you can use value `Brainstorming` for `filter`. If there are more than one `filter` matching an entry, they will all be applied in order (which means that the last one has the highest precedence). All other keys from that array element will only be applied on this specific screenshot. |
143
152
  | `keyword` | Similar use as in `default`, except that parameter `text` can be used here because it is screenshot specific. |
144
153
  | `title` | Similar use as in `default`, except that parameter `text` can be used here because it is screenshot specific. |
145
- | `frame` | Overrides the color of the frame to be used. (Valid values are `BLACK, `WHITE`, `GOLD` and `ROSE_GOLD`) | NA |
154
+ | `frame` | Overrides the color of the frame to be used. (Valid values are `BLACK`, `WHITE`, `GOLD` and `ROSE_GOLD`) | NA |
155
+ | `use_platform` | Overrides the platform used for the screenshot. Valid values are `IOS`, `ANDROID` and `ANY`. | `IOS` |
156
+ | `force_device_type` | Forces a specific device. Valid values are the same as for the general parameter. | NA |
146
157
 
147
158
  ### <a name="keyword-and-title-parameters"></a>Framefile `keyword` and `title` parameters
148
159
 
@@ -172,7 +183,8 @@ The `keyword` and `title` parameters are both used in `default` and `data`. They
172
183
  "show_complete_frame": false,
173
184
  "stack_title" : false,
174
185
  "title_below_image": true,
175
- "frame": "WHITE"
186
+ "frame": "WHITE",
187
+ "use_platform": "IOS"
176
188
  },
177
189
 
178
190
  "data": [
@@ -200,6 +212,10 @@ The `keyword` and `title` parameters are both used in `default` and `data`. They
200
212
  "keyword": {
201
213
  "color": "#31bb48"
202
214
  }
215
+ },
216
+ {
217
+ "filter": "Android",
218
+ "use_platform": "ANDROID"
203
219
  }
204
220
  ]
205
221
  }
@@ -73,7 +73,7 @@ fastlane match init
73
73
 
74
74
  <img src="/img/actions/match_init.gif" width="550" />
75
75
 
76
- You'll be asked if you want to store your code signing identities inside a **Git repo**, or on **Google Cloud**.
76
+ You'll be asked if you want to store your code signing identities inside a **Git repo**, **Google Cloud** or **Amazon S3**.
77
77
 
78
78
  #### Git Storage
79
79
 
@@ -142,6 +142,18 @@ Example content (for more advanced setups check out the [fastlane section](#fast
142
142
  google_cloud_bucket_name("major-key-certificates")
143
143
  ```
144
144
 
145
+ #### Amazon S3
146
+
147
+ Use [Amazon S3](https://aws.amazon.com/s3/) for a fully hosted solution for your code signing identities. Certificates are stored on S3, inside a storage bucket you provide. You can also directly access the files using the web console.
148
+
149
+ This will create a `Matchfile` in your current directory (or in your `./fastlane/` folder).
150
+
151
+ Example content (for more advanced setups check out the [fastlane section](#fastlane)):
152
+
153
+ ```ruby-skip-tests
154
+ s3_bucket("ios-certificates")
155
+ ```
156
+
145
157
  ### Multiple teams
146
158
 
147
159
  _match_ can store the codesigning files for multiple development teams:
@@ -155,9 +167,9 @@ match(git_branch: "team1", username: "user@team1.com")
155
167
  match(git_branch: "team2", username: "user@team2.com")
156
168
  ```
157
169
 
158
- #### Google Cloud Storage
170
+ #### Google Cloud or Amazon S3 Storage
159
171
 
160
- If you use Google Cloud Storage, you don't need to do anything manually for multiple teams. Just use Google Cloud Storage, and the top level folder will be the team ID.
172
+ If you use Google Cloud or Amazon S3 Storage, you don't need to do anything manually. Just use Google Cloud or Amazon S3 Storage, and the top level folder will be the team ID.
161
173
 
162
174
  ### Run
163
175
 
@@ -194,7 +206,7 @@ fastlane action match
194
206
 
195
207
  #### Handle multiple targets
196
208
 
197
- _match_ can use the same one Git repository or Google Cloud Storage for all bundle identifiers.
209
+ _match_ can use the same one Git repository, Google Cloud, or Amazon S3 Storage for all bundle identifiers.
198
210
 
199
211
  If you have several targets with different bundle identifiers, supply them as a comma-separated list:
200
212
 
@@ -419,6 +431,10 @@ Once you've decided which approach to take, all that's left to do is to set your
419
431
 
420
432
  Accessing Google Cloud Storage from your CI system requires you to provide the `gc_keys.json` file as part of your build. How you implement this is your decision. You can inject that file during build time.
421
433
 
434
+ #### Amazon S3 Storage access
435
+
436
+ Accessing Amazon S3 Storage from your CI system requires you to provide the `s3_region`, `s3_access_key`, `s3_secret_access_key` and `s3_bucket` options (or environment variables), with keys that has read access to the bucket.
437
+
422
438
  ### Nuke
423
439
 
424
440
  If you never really cared about code signing and have a messy Apple Developer account with a lot of invalid, expired or Xcode managed profiles/certificates, you can use the `match nuke` command to revoke your certificates and provisioning profiles. Don't worry, apps that are already available in the App Store / TestFlight will still work. Builds distributed via Ad Hoc or Enterprise will be disabled after nuking your account, so you'll have to re-upload a new build. After clearing your account you'll start from a clean state, and you can run _match_ to generate your certificates and profiles again.
@@ -449,13 +465,13 @@ You'll be asked for the new password on all your machines on the next run.
449
465
 
450
466
  ### Import
451
467
 
452
- To import and encrypt a certificate (`.cer`) and the private key (`.p12`) into the _match_ repo run:
468
+ To import and encrypt a certificate (`.cer`), the private key (`.p12`) and the provisioning profiles (`.mobileprovision` or `.provisionprofile`) into the _match_ repo run:
453
469
 
454
470
  ```no-highlight
455
471
  fastlane match import
456
472
  ```
457
473
 
458
- You'll be prompted for the certificate (`.cer`) and the private key (`.p12`) paths. _match_ will first validate the certificate (`.cer`) against the Developer Portal before importing the certificate (`.cer`) and the private key (`.p12`).
474
+ You'll be prompted for the certificate (`.cer`), the private key (`.p12`) and the provisioning profiles (`.mobileprovision` or `.provisionprofile`) paths. _match_ will first validate the certificate (`.cer`) against the Developer Portal before importing the certificate, the private key and the provisioning profiles into the specified _match_ repository.
459
475
 
460
476
  ### Manual Decrypt
461
477
 
@@ -34,7 +34,7 @@ module Fastlane
34
34
  [
35
35
  FastlaneCore::ConfigItem.new(key: :branch,
36
36
  env_name: "FL_ENSURE_GIT_BRANCH_NAME",
37
- description: "The branch that should be checked for. String that can be either the full name of the branch or a regex to match",
37
+ description: "The branch that should be checked for. String that can be either the full name of the branch or a regex e.g. `^feature\/.*$` to match",
38
38
  is_string: true,
39
39
  default_value: 'master')
40
40
  ]
@@ -4,6 +4,7 @@ module Fastlane
4
4
  def self.run(params)
5
5
  Actions.verify_gem!('xcode-install')
6
6
  required_version = params[:version]
7
+ strict = params[:strict]
7
8
 
8
9
  if required_version.to_s.length == 0
9
10
  # The user didn't provide an Xcode version, let's see
@@ -30,16 +31,38 @@ module Fastlane
30
31
  UI.user_error!("Invalid version number provided, make sure it's valid: #{ex}")
31
32
  end
32
33
 
33
- if selected_version == required_version
34
- UI.success("Selected Xcode version is correct: #{selected_version}")
34
+ if strict == true
35
+ if selected_version == required_version
36
+ success(selected_version)
37
+ else
38
+ error(selected_version, required_version)
39
+ end
35
40
  else
36
- UI.message("Selected Xcode version is not correct: #{selected_version}. You expected #{required_version}.")
37
- UI.message("To correct this, use: `xcode_select(version: #{required_version})`.")
41
+ required_version_numbers = required_version.to_s.split(".")
42
+ selected_version_numbers = selected_version.to_s.split(".")
43
+
44
+ required_version_numbers.each_with_index do |required_version_number, index|
45
+ selected_version_number = selected_version_numbers[index]
46
+ next unless required_version_number != selected_version_number
47
+ error(selected_version, required_version)
48
+ break
49
+ end
38
50
 
39
- UI.user_error!("Selected Xcode version doesn't match your requirement.\nExpected: Xcode #{required_version}\nActual: Xcode #{selected_version}\n")
51
+ success(selected_version)
40
52
  end
41
53
  end
42
54
 
55
+ def self.success(selected_version)
56
+ UI.success("Selected Xcode version is correct: #{selected_version}")
57
+ end
58
+
59
+ def self.error(selected_version, required_version)
60
+ UI.message("Selected Xcode version is not correct: #{selected_version}. You expected #{required_version}.")
61
+ UI.message("To correct this, use: `xcode_select(version: #{required_version})`.")
62
+
63
+ UI.user_error!("Selected Xcode version doesn't match your requirement.\nExpected: Xcode #{required_version}\nActual: Xcode #{selected_version}\n")
64
+ end
65
+
43
66
  #####################################################
44
67
  # @!group Documentation
45
68
  #####################################################
@@ -52,7 +75,8 @@ module Fastlane
52
75
  [
53
76
  "If building your app requires a specific version of Xcode, you can invoke this command before using gym.",
54
77
  "For example, to ensure that a beta version of Xcode is not accidentally selected to build, which would make uploading to TestFlight fail.",
55
- "You can either manually provide a specific version using `version: ` or you make use of the `.xcode-version` file."
78
+ "You can either manually provide a specific version using `version: ` or you make use of the `.xcode-version` file.",
79
+ "Using the `strict` parameter, you can either verify the full set of version numbers strictly (i.e. `11.3.1`) or only a subset of them (i.e. `11.3` or `11`)."
56
80
  ].join("\n")
57
81
  end
58
82
 
@@ -62,7 +86,11 @@ module Fastlane
62
86
  env_name: "FL_ENSURE_XCODE_VERSION",
63
87
  description: "Xcode version to verify that is selected",
64
88
  is_string: true,
65
- optional: true)
89
+ optional: true),
90
+ FastlaneCore::ConfigItem.new(key: :strict,
91
+ description: "Should the version be verified strictly (all 3 version numbers), or matching only the given version numbers (i.e. `11.3` == `11.3.x`)",
92
+ type: Boolean,
93
+ default_value: true)
66
94
  ]
67
95
  end
68
96
 
@@ -45,6 +45,7 @@ module Fastlane
45
45
  [
46
46
  'frame_screenshots',
47
47
  'frameit # alias for "frame_screenshots"',
48
+ 'frame_screenshots(use_platform: "ANDROID")',
48
49
  'frame_screenshots(silver: true)',
49
50
  'frame_screenshots(path: "/screenshots")',
50
51
  'frame_screenshots(rose_gold: true)'
@@ -56,7 +57,7 @@ module Fastlane
56
57
  end
57
58
 
58
59
  def self.is_supported?(platform)
59
- [:ios, :mac].include?(platform)
60
+ [:ios, :mac, :android].include?(platform)
60
61
  end
61
62
  end
62
63
  end
@@ -129,6 +129,9 @@ module Fastlane
129
129
  FastlaneCore::ConfigItem.new(key: :api_token,
130
130
  env_name: "FL_GITHUB_RELEASE_API_TOKEN",
131
131
  sensitive: true,
132
+ code_gen_sensitive: true,
133
+ default_value: ENV["GITHUB_API_TOKEN"],
134
+ default_value_dynamic: true,
132
135
  description: "GitHub Personal Token (required for private repositories)",
133
136
  optional: true)
134
137
  ]
@@ -17,12 +17,16 @@ module Fastlane
17
17
  end
18
18
 
19
19
  class GradleAction < Action
20
+ # rubocop:disable Metrics/PerceivedComplexity
20
21
  def self.run(params)
21
22
  task = params[:task]
22
23
  flavor = params[:flavor]
23
24
  build_type = params[:build_type]
25
+ tasks = params[:tasks]
24
26
 
25
- gradle_task = [task, flavor, build_type].join
27
+ gradle_task = gradle_task(task, flavor, build_type, tasks)
28
+
29
+ UI.user_error!('Please pass a gradle task or tasks') if gradle_task.empty?
26
30
 
27
31
  project_dir = params[:project_dir]
28
32
 
@@ -101,6 +105,28 @@ module Fastlane
101
105
 
102
106
  return result
103
107
  end
108
+ # rubocop:enable Metrics/PerceivedComplexity
109
+
110
+ def self.gradle_task(task, flavor, build_type, tasks)
111
+ gradle_task = [task, flavor, build_type].join
112
+
113
+ if gradle_task.empty? && !tasks.nil?
114
+ gradle_task = tasks.join(' ')
115
+ end
116
+
117
+ gradle_task
118
+ end
119
+
120
+ def self.step_text(params)
121
+ task = params[:task]
122
+ flavor = params[:flavor]
123
+ build_type = params[:build_type]
124
+ tasks = params[:tasks]
125
+
126
+ gradle_task = gradle_task(task, flavor, build_type, tasks)
127
+
128
+ return gradle_task
129
+ end
104
130
 
105
131
  #####################################################
106
132
  # @!group Documentation
@@ -119,7 +145,8 @@ module Fastlane
119
145
  FastlaneCore::ConfigItem.new(key: :task,
120
146
  env_name: 'FL_GRADLE_TASK',
121
147
  description: 'The gradle task you want to execute, e.g. `assemble`, `bundle` or `test`. For tasks such as `assembleMyFlavorRelease` you should use gradle(task: \'assemble\', flavor: \'Myflavor\', build_type: \'Release\')',
122
- optional: false,
148
+ conflicting_options: [:tasks],
149
+ optional: true,
123
150
  is_string: true),
124
151
  FastlaneCore::ConfigItem.new(key: :flavor,
125
152
  env_name: 'FL_GRADLE_FLAVOR',
@@ -131,6 +158,13 @@ module Fastlane
131
158
  description: 'The build type that you want the task for, e.g. `Release`. Useful for some tasks such as `assemble`',
132
159
  optional: true,
133
160
  is_string: true),
161
+ FastlaneCore::ConfigItem.new(key: :tasks,
162
+ type: Array,
163
+ env_name: 'FL_GRADLE_TASKS',
164
+ description: 'The multiple gradle tasks that you want to execute, e.g. `[assembleDebug, bundleDebug]`',
165
+ conflicting_options: [:task],
166
+ optional: true,
167
+ is_string: false),
134
168
  FastlaneCore::ConfigItem.new(key: :flags,
135
169
  env_name: 'FL_GRADLE_FLAGS',
136
170
  description: 'All parameter flags you want to pass to the gradle command, e.g. `--exitcode --xml file.xml`',
@@ -219,6 +253,13 @@ module Fastlane
219
253
  )
220
254
  ```
221
255
 
256
+ You can pass multiple gradle tasks:
257
+ ```ruby
258
+ gradle(
259
+ tasks: ["assembleDebug", "bundleDebug"]
260
+ )
261
+ ```
262
+
222
263
  You can pass properties to gradle:
223
264
  ```ruby
224
265
  gradle(