fastlane 2.193.1 → 2.197.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +88 -88
  3. data/cert/lib/cert/options.rb +1 -1
  4. data/deliver/lib/assets/ScreenshotsHelp +29 -6
  5. data/deliver/lib/deliver/app_screenshot.rb +4 -4
  6. data/deliver/lib/deliver/options.rb +1 -1
  7. data/deliver/lib/deliver/upload_screenshots.rb +1 -1
  8. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +13 -7
  9. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +1 -1
  10. data/fastlane/lib/fastlane/actions/download_dsyms.rb +47 -30
  11. data/fastlane/lib/fastlane/actions/gradle.rb +15 -2
  12. data/fastlane/lib/fastlane/actions/last_git_commit.rb +1 -1
  13. data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +3 -4
  14. data/fastlane/lib/fastlane/actions/notarize.rb +27 -18
  15. data/fastlane/lib/fastlane/actions/prompt.rb +1 -1
  16. data/fastlane/lib/fastlane/actions/register_device.rb +1 -1
  17. data/fastlane/lib/fastlane/actions/register_devices.rb +1 -1
  18. data/fastlane/lib/fastlane/actions/set_changelog.rb +1 -1
  19. data/fastlane/lib/fastlane/actions/slather.rb +6 -0
  20. data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +11 -5
  21. data/fastlane/lib/fastlane/version.rb +1 -1
  22. data/fastlane/swift/Deliverfile.swift +1 -1
  23. data/fastlane/swift/DeliverfileProtocol.swift +2 -2
  24. data/fastlane/swift/Fastlane.swift +86 -99
  25. data/fastlane/swift/Gymfile.swift +1 -1
  26. data/fastlane/swift/GymfileProtocol.swift +1 -1
  27. data/fastlane/swift/LaneFileProtocol.swift +1 -1
  28. data/fastlane/swift/Matchfile.swift +1 -1
  29. data/fastlane/swift/MatchfileProtocol.swift +10 -2
  30. data/fastlane/swift/Precheckfile.swift +1 -1
  31. data/fastlane/swift/PrecheckfileProtocol.swift +2 -2
  32. data/fastlane/swift/Runner.swift +1 -1
  33. data/fastlane/swift/Scanfile.swift +1 -1
  34. data/fastlane/swift/ScanfileProtocol.swift +1 -1
  35. data/fastlane/swift/Screengrabfile.swift +1 -1
  36. data/fastlane/swift/ScreengrabfileProtocol.swift +3 -3
  37. data/fastlane/swift/Snapshotfile.swift +1 -1
  38. data/fastlane/swift/SnapshotfileProtocol.swift +2 -2
  39. data/fastlane/swift/formatting/Brewfile.lock.json +16 -16
  40. data/fastlane_core/lib/fastlane_core/build_watcher.rb +1 -1
  41. data/frameit/lib/frameit/editor.rb +16 -18
  42. data/frameit/lib/frameit/trim_box.rb +6 -0
  43. data/match/lib/match/generator.rb +2 -1
  44. data/match/lib/match/options.rb +11 -1
  45. data/match/lib/match/runner.rb +94 -10
  46. data/pem/lib/pem/manager.rb +2 -1
  47. data/pem/lib/pem/options.rb +1 -1
  48. data/pilot/lib/pilot/options.rb +1 -1
  49. data/precheck/lib/precheck/options.rb +1 -1
  50. data/screengrab/lib/screengrab/options.rb +2 -2
  51. data/sigh/lib/assets/resign.sh +9 -6
  52. data/sigh/lib/sigh/options.rb +6 -1
  53. data/sigh/lib/sigh/runner.rb +2 -2
  54. data/snapshot/lib/snapshot/options.rb +1 -1
  55. data/snapshot/lib/snapshot/reports_generator.rb +8 -0
  56. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +9 -1
  57. data/spaceship/lib/spaceship/connect_api/models/.build.rb.swp +0 -0
  58. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +1 -1
  59. data/spaceship/lib/spaceship/connect_api/models/build.rb +4 -2
  60. data/spaceship/lib/spaceship/connect_api/models/build_bundle.rb +59 -0
  61. data/spaceship/lib/spaceship/connect_api/token.rb +1 -1
  62. data/spaceship/lib/spaceship/connect_api.rb +1 -0
  63. data/supply/lib/supply/client.rb +3 -3
  64. data/supply/lib/supply/uploader.rb +10 -7
  65. metadata +39 -35
  66. data/fastlane/lib/fastlane/actions/crashlytics.rb +0 -207
  67. data/fastlane/lib/fastlane/helper/crashlytics_helper.rb +0 -157
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 16bbd4e5c7f94860e5d9cba08578ab2918bccfe31092380f43d859da4f8393e7
4
- data.tar.gz: f527779d5963a3f3110c7b5b4bb6bda4c816a01e391b16919c7ef5c0c841b82d
3
+ metadata.gz: 471eff584bf9045c8387208af74f22d6556be211f98a16272b726d7354d7a12e
4
+ data.tar.gz: 66f352f900ba8669eb12a16d83f31b28372173207ef2c077312a029548429efd
5
5
  SHA512:
6
- metadata.gz: 148193a7bc745d1c044cadad094875e5375c8f0ed611231695228bd1656aa3f5030018a88cf484d7c811bcd4161ac191f786f3cfcce759a9e59d70cc5a814e34
7
- data.tar.gz: b041a08c28429bc1a32c7a08702ebca0e260ac051734541b4345cb441a3cfaeb33d08f75887346bc974380463c1c8eddae468024069ad505c5edaa2ec5fdfc1c
6
+ metadata.gz: a4fc178fa1af1418d7967d29085def077bd3887d3922c4d1308781930ced91ed858d2b3b0032ae2b9116316c32ebba6ae3ee25fd4e4380a336a4e3c8874852fd
7
+ data.tar.gz: 354898d403d3829ecbf42627d8b6fe549a78374aa2412c568a53e2dd66b84f8a220e5a480f5e0b7d92c6e89d844b53de9b25cba961d1b9b4976291061e08673e
data/README.md CHANGED
@@ -35,17 +35,23 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
35
35
  <!-- This table is regenerated and resorted on each release -->
36
36
  <table id='team'>
37
37
  <tr>
38
- <td id='iulian-onofrei'>
39
- <a href='https://github.com/revolter'>
40
- <img src='https://github.com/revolter.png' width='140px;'>
38
+ <td id='josh-holtz'>
39
+ <a href='https://github.com/joshdholtz'>
40
+ <img src='https://github.com/joshdholtz.png' width='140px;'>
41
41
  </a>
42
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
42
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
43
43
  </td>
44
- <td id='andrew-mcburney'>
45
- <a href='https://github.com/armcburney'>
46
- <img src='https://github.com/armcburney.png' width='140px;'>
44
+ <td id='fumiya-nakamura'>
45
+ <a href='https://github.com/nafu'>
46
+ <img src='https://github.com/nafu.png' width='140px;'>
47
47
  </a>
48
- <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
48
+ <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
49
+ </td>
50
+ <td id='danielle-tomlinson'>
51
+ <a href='https://github.com/endocrimes'>
52
+ <img src='https://github.com/endocrimes.png' width='140px;'>
53
+ </a>
54
+ <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
49
55
  </td>
50
56
  <td id='maksym-grebenets'>
51
57
  <a href='https://github.com/mgrebenets'>
@@ -53,43 +59,37 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
53
59
  </a>
54
60
  <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
55
61
  </td>
56
- <td id='joshua-liebowitz'>
57
- <a href='https://github.com/taquitos'>
58
- <img src='https://github.com/taquitos.png' width='140px;'>
59
- </a>
60
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
61
- </td>
62
- <td id='luka-mirosevic'>
63
- <a href='https://github.com/lmirosevic'>
64
- <img src='https://github.com/lmirosevic.png' width='140px;'>
62
+ <td id='satoshi-namai'>
63
+ <a href='https://github.com/ainame'>
64
+ <img src='https://github.com/ainame.png' width='140px;'>
65
65
  </a>
66
- <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
66
+ <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
67
67
  </td>
68
68
  </tr>
69
69
  <tr>
70
- <td id='olivier-halligon'>
71
- <a href='https://github.com/AliSoftware'>
72
- <img src='https://github.com/AliSoftware.png' width='140px;'>
70
+ <td id='roger-oba'>
71
+ <a href='https://github.com/rogerluan'>
72
+ <img src='https://github.com/rogerluan.png' width='140px;'>
73
73
  </a>
74
- <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
74
+ <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
75
75
  </td>
76
- <td id='satoshi-namai'>
77
- <a href='https://github.com/ainame'>
78
- <img src='https://github.com/ainame.png' width='140px;'>
76
+ <td id='matthew-ellis'>
77
+ <a href='https://github.com/matthewellis'>
78
+ <img src='https://github.com/matthewellis.png' width='140px;'>
79
79
  </a>
80
- <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
80
+ <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
81
81
  </td>
82
- <td id='stefan-natchev'>
83
- <a href='https://github.com/snatchev'>
84
- <img src='https://github.com/snatchev.png' width='140px;'>
82
+ <td id='olivier-halligon'>
83
+ <a href='https://github.com/AliSoftware'>
84
+ <img src='https://github.com/AliSoftware.png' width='140px;'>
85
85
  </a>
86
- <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
86
+ <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
87
87
  </td>
88
- <td id='kohki-miki'>
89
- <a href='https://github.com/giginet'>
90
- <img src='https://github.com/giginet.png' width='140px;'>
88
+ <td id='helmut-januschka'>
89
+ <a href='https://github.com/hjanuschka'>
90
+ <img src='https://github.com/hjanuschka.png' width='140px;'>
91
91
  </a>
92
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
92
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
93
93
  </td>
94
94
  <td id='daniel-jankowski'>
95
95
  <a href='https://github.com/mollyIV'>
@@ -99,17 +99,11 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
99
99
  </td>
100
100
  </tr>
101
101
  <tr>
102
- <td id='max-ott'>
103
- <a href='https://github.com/max-ott'>
104
- <img src='https://github.com/max-ott.png' width='140px;'>
105
- </a>
106
- <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
107
- </td>
108
- <td id='matthew-ellis'>
109
- <a href='https://github.com/matthewellis'>
110
- <img src='https://github.com/matthewellis.png' width='140px;'>
102
+ <td id='jan-piotrowski'>
103
+ <a href='https://github.com/janpio'>
104
+ <img src='https://github.com/janpio.png' width='140px;'>
111
105
  </a>
112
- <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
106
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
113
107
  </td>
114
108
  <td id='jorge-revuelta-h'>
115
109
  <a href='https://github.com/minuscorp'>
@@ -117,25 +111,31 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
117
111
  </a>
118
112
  <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
119
113
  </td>
120
- <td id='fumiya-nakamura'>
121
- <a href='https://github.com/nafu'>
122
- <img src='https://github.com/nafu.png' width='140px;'>
114
+ <td id='kohki-miki'>
115
+ <a href='https://github.com/giginet'>
116
+ <img src='https://github.com/giginet.png' width='140px;'>
123
117
  </a>
124
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
118
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
125
119
  </td>
126
- <td id='jimmy-dee'>
127
- <a href='https://github.com/jdee'>
128
- <img src='https://github.com/jdee.png' width='140px;'>
120
+ <td id='aaron-brager'>
121
+ <a href='https://github.com/getaaron'>
122
+ <img src='https://github.com/getaaron.png' width='140px;'>
129
123
  </a>
130
- <h4 align='center'>Jimmy Dee</h4>
124
+ <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
125
+ </td>
126
+ <td id='luka-mirosevic'>
127
+ <a href='https://github.com/lmirosevic'>
128
+ <img src='https://github.com/lmirosevic.png' width='140px;'>
129
+ </a>
130
+ <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
131
131
  </td>
132
132
  </tr>
133
133
  <tr>
134
- <td id='helmut-januschka'>
135
- <a href='https://github.com/hjanuschka'>
136
- <img src='https://github.com/hjanuschka.png' width='140px;'>
134
+ <td id='felix-krause'>
135
+ <a href='https://github.com/KrauseFx'>
136
+ <img src='https://github.com/KrauseFx.png' width='140px;'>
137
137
  </a>
138
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
138
+ <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
139
139
  </td>
140
140
  <td id='jérôme-lacoste'>
141
141
  <a href='https://github.com/lacostej'>
@@ -143,55 +143,55 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
143
143
  </a>
144
144
  <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
145
145
  </td>
146
- <td id='danielle-tomlinson'>
147
- <a href='https://github.com/endocrimes'>
148
- <img src='https://github.com/endocrimes.png' width='140px;'>
146
+ <td id='jimmy-dee'>
147
+ <a href='https://github.com/jdee'>
148
+ <img src='https://github.com/jdee.png' width='140px;'>
149
149
  </a>
150
- <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
150
+ <h4 align='center'>Jimmy Dee</h4>
151
151
  </td>
152
- <td id='josh-holtz'>
153
- <a href='https://github.com/joshdholtz'>
154
- <img src='https://github.com/joshdholtz.png' width='140px;'>
152
+ <td id='manish-rathi'>
153
+ <a href='https://github.com/crazymanish'>
154
+ <img src='https://github.com/crazymanish.png' width='140px;'>
155
155
  </a>
156
- <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
156
+ <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
157
157
  </td>
158
- <td id='felix-krause'>
159
- <a href='https://github.com/KrauseFx'>
160
- <img src='https://github.com/KrauseFx.png' width='140px;'>
158
+ <td id='joshua-liebowitz'>
159
+ <a href='https://github.com/taquitos'>
160
+ <img src='https://github.com/taquitos.png' width='140px;'>
161
161
  </a>
162
- <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
162
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
163
163
  </td>
164
164
  </tr>
165
165
  <tr>
166
- <td id='aaron-brager'>
167
- <a href='https://github.com/getaaron'>
168
- <img src='https://github.com/getaaron.png' width='140px;'>
166
+ <td id='andrew-mcburney'>
167
+ <a href='https://github.com/armcburney'>
168
+ <img src='https://github.com/armcburney.png' width='140px;'>
169
169
  </a>
170
- <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
170
+ <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
171
171
  </td>
172
- <td id='manu-wallner'>
173
- <a href='https://github.com/milch'>
174
- <img src='https://github.com/milch.png' width='140px;'>
172
+ <td id='max-ott'>
173
+ <a href='https://github.com/max-ott'>
174
+ <img src='https://github.com/max-ott.png' width='140px;'>
175
175
  </a>
176
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
176
+ <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
177
177
  </td>
178
- <td id='jan-piotrowski'>
179
- <a href='https://github.com/janpio'>
180
- <img src='https://github.com/janpio.png' width='140px;'>
178
+ <td id='stefan-natchev'>
179
+ <a href='https://github.com/snatchev'>
180
+ <img src='https://github.com/snatchev.png' width='140px;'>
181
181
  </a>
182
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
182
+ <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
183
183
  </td>
184
- <td id='manish-rathi'>
185
- <a href='https://github.com/crazymanish'>
186
- <img src='https://github.com/crazymanish.png' width='140px;'>
184
+ <td id='iulian-onofrei'>
185
+ <a href='https://github.com/revolter'>
186
+ <img src='https://github.com/revolter.png' width='140px;'>
187
187
  </a>
188
- <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
188
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
189
189
  </td>
190
- <td id='roger-oba'>
191
- <a href='https://github.com/rogerluan'>
192
- <img src='https://github.com/rogerluan.png' width='140px;'>
190
+ <td id='manu-wallner'>
191
+ <a href='https://github.com/milch'>
192
+ <img src='https://github.com/milch.png' width='140px;'>
193
193
  </a>
194
- <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
194
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
195
195
  </td>
196
196
  </tr>
197
197
  </table>
@@ -47,7 +47,7 @@ module Cert
47
47
  end),
48
48
  FastlaneCore::ConfigItem.new(key: :api_key,
49
49
  env_names: ["CERT_API_KEY", "DELIVER_API_KEY", "APP_STORE_CONNECT_API_KEY"],
50
- description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#use-return-value-and-pass-in-as-an-option)",
50
+ description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key-hash-option)",
51
51
  type: Hash,
52
52
  optional: true,
53
53
  sensitive: true,
@@ -1,7 +1,30 @@
1
- Put all screenshots you want to use inside the folder of its language (e.g. en-US).
2
- The device type will automatically be recognized using the image resolution. Apple TV screenshots
3
- should be stored in a subdirectory named appleTV with language folders inside of it. iMessage
4
- screenshots, like Apple TV screenshots, should also be stored in a subdirectory named iMessage
5
- with language folders inside of it.
1
+ ## Screenshots Naming Rules
6
2
 
7
- The screenshots can be named whatever you want, but keep in mind they are sorted alphabetically.
3
+ Put all screenshots you want to use inside the folder of its language (e.g. `en-US`).
4
+ The device type will automatically be recognized using the image resolution.
5
+
6
+ The screenshots can be named whatever you want, but keep in mind they are sorted
7
+ alphabetically, in a human-friendly way. See https://github.com/fastlane/fastlane/pull/18200 for more details.
8
+
9
+ ### Exceptions
10
+
11
+ #### iPad Pro (3rd Gen) 12.9"
12
+
13
+ Since iPad Pro (3rd Gen) 12.9" and iPad Pro (2nd Gen) 12.9" have the same image
14
+ resolution, screenshots of the iPad Pro (3rd gen) 12.9" must contain either the
15
+ string `iPad Pro (12.9-inch) (3rd generation)`, `IPAD_PRO_3GEN_129`, or `ipadPro129`
16
+ (App Store Connect's internal naming of the display family for the 3rd generation iPad Pro)
17
+ in its filename to be assigned the correct display family and to be uploaded to
18
+ the correct screenshot slot in your app's metadata.
19
+
20
+ ### Other Platforms
21
+
22
+ #### Apple TV
23
+
24
+ Apple TV screenshots should be stored in a subdirectory named `appleTV` with language
25
+ folders inside of it.
26
+
27
+ #### iMessage
28
+
29
+ iMessage screenshots, like the Apple TV ones, should also be stored in a subdirectory
30
+ named `iMessage`, with language folders inside of it.
@@ -322,10 +322,10 @@ module Deliver
322
322
 
323
323
  def self.resolve_ipadpro_conflict_if_needed(screen_size, filename)
324
324
  is_3rd_gen = [
325
- "iPad Pro (12.9-inch) (3rd generation)", # default simulator name has this
326
- "iPad Pro (12.9-inch) (4th generation)", # default simulator name has this
327
- "ipadPro129", # downloaded screenshots name has this,
328
- "3GEN" # downloaded screenshots name from App Store Connect API has this
325
+ "iPad Pro (12.9-inch) (3rd generation)", # Default simulator has this name
326
+ "iPad Pro (12.9-inch) (4th generation)", # Default simulator has this name
327
+ "IPAD_PRO_3GEN_129", # Screenshots downloaded from App Store Connect has this name
328
+ "ipadPro129" # Legacy: screenshots downloaded from iTunes Connect used to have this name
329
329
  ].any? { |key| filename.include?(key) }
330
330
  if is_3rd_gen
331
331
  if screen_size == ScreenSize::IOS_IPAD_PRO
@@ -22,7 +22,7 @@ module Deliver
22
22
  end),
23
23
  FastlaneCore::ConfigItem.new(key: :api_key,
24
24
  env_names: ["DELIVER_API_KEY", "APP_STORE_CONNECT_API_KEY"],
25
- description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#use-return-value-and-pass-in-as-an-option)",
25
+ description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key-hash-option)",
26
26
  type: Hash,
27
27
  optional: true,
28
28
  sensitive: true,
@@ -157,7 +157,7 @@ module Deliver
157
157
 
158
158
  UI.verbose('Uploading jobs are completed')
159
159
 
160
- Helper.show_loading_indicator("Waiting for all the screenshots processed...")
160
+ Helper.show_loading_indicator("Waiting for all the screenshots to finish being processed...")
161
161
  states = wait_for_complete(iterator)
162
162
  Helper.hide_loading_indicator
163
163
  retry_upload_screenshots_if_needed(iterator, states, total_number_of_screenshots, tries, localizations, screenshots_per_language)
@@ -9,9 +9,18 @@ module Fastlane
9
9
 
10
10
  class AppStoreBuildNumberAction < Action
11
11
  def self.run(params)
12
+ build_v, build_nr = get_build_version_and_number(params)
13
+
14
+ Actions.lane_context[SharedValues::LATEST_BUILD_NUMBER] = build_nr
15
+ Actions.lane_context[SharedValues::LATEST_VERSION] = build_v
16
+
17
+ return build_nr
18
+ end
19
+
20
+ def self.get_build_version_and_number(params)
12
21
  require 'spaceship'
13
22
 
14
- result = get_build_number(params)
23
+ result = get_build_info(params)
15
24
  build_nr = result.build_nr
16
25
 
17
26
  # Convert build_nr to int (for legacy use) if no "." in string
@@ -19,13 +28,10 @@ module Fastlane
19
28
  build_nr = build_nr.to_i
20
29
  end
21
30
 
22
- Actions.lane_context[SharedValues::LATEST_BUILD_NUMBER] = build_nr
23
- Actions.lane_context[SharedValues::LATEST_VERSION] = result.build_v
24
-
25
- return build_nr
31
+ return result.build_v, build_nr
26
32
  end
27
33
 
28
- def self.get_build_number(params)
34
+ def self.get_build_info(params)
29
35
  # Prompts select team if multiple teams and none specified
30
36
  if (api_token = Spaceship::ConnectAPI::Token.from(hash: params[:api_key], filepath: params[:api_key_path]))
31
37
  UI.message("Creating authorization token for App Store Connect API")
@@ -125,7 +131,7 @@ module Fastlane
125
131
  end),
126
132
  FastlaneCore::ConfigItem.new(key: :api_key,
127
133
  env_names: ["APPSTORE_BUILD_NUMBER_API_KEY", "APP_STORE_CONNECT_API_KEY"],
128
- description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#use-return-value-and-pass-in-as-an-option)",
134
+ description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key-hash-option)",
129
135
  type: Hash,
130
136
  default_value: Fastlane::Actions.lane_context[Fastlane::Actions::SharedValues::APP_STORE_CONNECT_API_KEY],
131
137
  default_value_dynamic: true,
@@ -694,7 +694,7 @@ In this case, default values for keywords, urls, name and release notes are used
694
694
 
695
695
  [Starting March 20, 2019 Apple's App Store](https://developer.apple.com/news/?id=03202019a) requires 12.9-inch iPad Pro (3rd generation) screenshots additionally to the iPad Pro 2nd generation [screenshots](https://help.apple.com/app-store-connect/#/devd274dd925). As fastlane historically uses the screenshot dimensions to determine the "display family" of a screenshot, this poses a problem as both use the same dimensions and are recognized as the same device family.
696
696
 
697
- To solve this a screenshot of a 12.9-inch iPad Pro (3rd generation) must contain either the string `iPad Pro (12.9-inch) (3rd generation)` or `ipadPro129` (Apple's internal naming of the display family for the 3rd generation iPad Pro) in its filename to be assigned the correct display family and to be uploaded to the correct screenshot slot in your app's metadata.
697
+ To solve this a screenshot of a 12.9-inch iPad Pro (3rd generation) must contain either the string `iPad Pro (12.9-inch) (3rd generation)`, `IPAD_PRO_3GEN_129`, or `ipadPro129` (Apple's internal naming of the display family for the 3rd generation iPad Pro) in its filename to be assigned the correct display family and to be uploaded to the correct screenshot slot in your app's metadata.
698
698
 
699
699
  ## Automatically create screenshots
700
700
 
@@ -12,11 +12,18 @@ module Fastlane
12
12
  require 'net/http'
13
13
  require 'date'
14
14
 
15
- # Team selection passed though FASTLANE_ITC_TEAM_ID and FASTLANE_ITC_TEAM_NAME environment variables
16
- # Prompts select team if multiple teams and none specified
17
- UI.message("Login to App Store Connect (#{params[:username]})")
18
- Spaceship::ConnectAPI.login(params[:username], use_portal: false, use_tunes: true)
19
- UI.message("Login successful")
15
+ if (api_token = Spaceship::ConnectAPI::Token.from(hash: params[:api_key], filepath: params[:api_key_path]))
16
+ UI.message("Creating authorization token for App Store Connect API")
17
+ Spaceship::ConnectAPI.token = api_token
18
+ elsif !Spaceship::ConnectAPI.token.nil?
19
+ UI.message("Using existing authorization token for App Store Connect API")
20
+ else
21
+ # Team selection passed though FASTLANE_ITC_TEAM_ID and FASTLANE_ITC_TEAM_NAME environment variables
22
+ # Prompts select team if multiple teams and none specified
23
+ UI.message("Login to App Store Connect (#{params[:username]})")
24
+ Spaceship::ConnectAPI.login(params[:username], use_portal: false, use_tunes: true)
25
+ UI.message("Login successful")
26
+ end
20
27
 
21
28
  # Get App
22
29
  app = Spaceship::ConnectAPI::App.find(params[:app_identifier])
@@ -68,7 +75,7 @@ module Fastlane
68
75
 
69
76
  filter = { app: app.id }
70
77
  filter["preReleaseVersion.platform"] = platform
71
- build_resps = Spaceship::ConnectAPI.get_builds(filter: filter, sort: "-uploadedDate", includes: "preReleaseVersion").all_pages
78
+ build_resps = Spaceship::ConnectAPI.get_builds(filter: filter, sort: "-uploadedDate", includes: "preReleaseVersion,buildBundles").all_pages
72
79
  builds = build_resps.flat_map(&:to_models)
73
80
 
74
81
  builds.each do |build|
@@ -107,31 +114,24 @@ module Fastlane
107
114
  end
108
115
 
109
116
  UI.verbose("Build_version: #{asc_build_number} matches #{build_number}, grabbing dsym_url") if build_number
110
- get_details_and_download_dsym(app: app, train: asc_app_version, build_number: asc_build_number, uploaded_date: uploaded_date, platform: itc_platform, wait_for_dsym_processing: wait_for_dsym_processing, wait_timeout: wait_timeout, output_directory: output_directory)
117
+
118
+ build.build_bundles&.each do |build_bundle|
119
+ download_dsym(build_bundle: build_bundle, build: build, app: app, wait_for_dsym_processing: wait_for_dsym_processing, wait_timeout: wait_timeout, output_directory: output_directory)
120
+ end
111
121
  end
112
122
  end
113
123
 
114
- def self.get_details_and_download_dsym(app: nil, train: nil, build_number: nil, uploaded_date: nil, platform: nil, wait_for_dsym_processing: nil, wait_timeout: nil, output_directory: nil)
124
+ def self.download_dsym(build_bundle: nil, build: nil, app: nil, wait_for_dsym_processing: nil, wait_timeout: nil, output_directory: nil)
115
125
  start = Time.now
116
126
  download_url = nil
117
127
 
118
128
  loop do
119
- begin
120
- resp = Spaceship::Tunes.client.build_details(app_id: app.id, train: train, build_number: build_number, platform: platform)
121
-
122
- resp['apple_id'] = app.id
123
- build_details = Spaceship::Tunes::BuildDetails.factory(resp)
124
-
125
- download_url = build_details.dsym_url
126
- UI.verbose("dsym_url: #{download_url}")
127
- rescue Spaceship::TunesClient::ITunesConnectError => ex
128
- UI.error("Error accessing dSYM file for build\n\n#{build}\n\nException: #{ex}")
129
- end
129
+ download_url = build_bundle.dsym_url
130
130
 
131
131
  unless download_url
132
132
  if !wait_for_dsym_processing || (Time.now - start) > wait_timeout
133
133
  # In some cases, AppStoreConnect does not process the dSYMs, thus no error should be thrown.
134
- UI.message("Could not find any dSYM for #{build_number} (#{train})")
134
+ UI.message("Could not find any dSYM for #{build.version} (#{build.app_version})")
135
135
  else
136
136
  UI.message("Waiting for dSYM file to appear...")
137
137
  sleep(30)
@@ -143,10 +143,10 @@ module Fastlane
143
143
  end
144
144
 
145
145
  if download_url
146
- self.download(download_url, app.bundle_id, train, build_number, uploaded_date, output_directory)
147
- return if build_number
146
+ self.download(download_url, build, app, output_directory)
147
+ return if build.version
148
148
  else
149
- UI.message("No dSYM URL for #{build_number} (#{train})")
149
+ UI.message("No dSYM URL for #{build.version} (#{build.app_version})")
150
150
  end
151
151
  end
152
152
  # rubocop:enable Metrics/PerceivedComplexity
@@ -154,7 +154,7 @@ module Fastlane
154
154
  def self.get_latest_build!(app_id: nil, platform: nil)
155
155
  filter = { app: app_id }
156
156
  filter["preReleaseVersion.platform"] = platform
157
- latest_build = Spaceship::ConnectAPI.get_builds(filter: filter, sort: "-uploadedDate", includes: "preReleaseVersion").first
157
+ latest_build = Spaceship::ConnectAPI.get_builds(filter: filter, sort: "-uploadedDate", includes: "preReleaseVersion,buildBundles").first
158
158
 
159
159
  if latest_build.nil?
160
160
  UI.user_error!("Could not find any build for platform #{platform}") if platform
@@ -164,18 +164,18 @@ module Fastlane
164
164
  return latest_build
165
165
  end
166
166
 
167
- def self.download(download_url, bundle_id, train_number, build_version, uploaded_date, output_directory)
167
+ def self.download(download_url, build, app, output_directory)
168
168
  result = self.download_file(download_url)
169
- path = write_dsym(result, bundle_id, train_number, build_version, output_directory)
170
- UI.success("🔑 Successfully downloaded dSYM file for #{train_number} - #{build_version} to '#{path}'")
169
+ path = write_dsym(result, app.bundle_id, build.app_version, build.version, output_directory)
170
+ UI.success("🔑 Successfully downloaded dSYM file for #{build.app_version} - #{build.version} to '#{path}'")
171
171
 
172
172
  Actions.lane_context[SharedValues::DSYM_PATHS] ||= []
173
173
  Actions.lane_context[SharedValues::DSYM_PATHS] << File.expand_path(path)
174
174
 
175
- unless uploaded_date.nil?
176
- Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE] ||= uploaded_date
175
+ unless build.uploaded_date.nil?
176
+ Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE] ||= build.uploaded_date
177
177
  current_latest = Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE]
178
- Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE] = [current_latest, uploaded_date].max
178
+ Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE] = [current_latest, build.uploaded_date].max
179
179
  UI.verbose("Most recent build uploaded_date #{Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE]}")
180
180
  end
181
181
  end
@@ -234,6 +234,23 @@ module Fastlane
234
234
  user ||= CredentialsManager::AppfileConfig.try_fetch_value(:apple_id)
235
235
 
236
236
  [
237
+ FastlaneCore::ConfigItem.new(key: :api_key_path,
238
+ env_names: ["DOWNLOAD_DSYMS_API_KEY_PATH", "APP_STORE_CONNECT_API_KEY_PATH"],
239
+ description: "Path to your App Store Connect API Key JSON file (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key-json-file)",
240
+ optional: true,
241
+ conflicting_options: [:api_key],
242
+ verify_block: proc do |value|
243
+ UI.user_error!("Couldn't find API key JSON file at path '#{value}'") unless File.exist?(value)
244
+ end),
245
+ FastlaneCore::ConfigItem.new(key: :api_key,
246
+ env_names: ["DOWNLOAD_DSYMS_API_KEY", "APP_STORE_CONNECT_API_KEY"],
247
+ description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#use-return-value-and-pass-in-as-an-option)",
248
+ type: Hash,
249
+ default_value: Fastlane::Actions.lane_context[Fastlane::Actions::SharedValues::APP_STORE_CONNECT_API_KEY],
250
+ default_value_dynamic: true,
251
+ optional: true,
252
+ sensitive: true,
253
+ conflicting_options: [:api_key_path]),
237
254
  FastlaneCore::ConfigItem.new(key: :username,
238
255
  short_option: "-u",
239
256
  env_name: "DOWNLOAD_DSYMS_USERNAME",
@@ -258,8 +258,21 @@ module Fastlane
258
258
  # ...
259
259
 
260
260
  properties: {
261
- "versionCode" => 100,
262
- "versionName" => "1.0.0",
261
+ "exampleNumber" => 100,
262
+ "exampleString" => "1.0.0",
263
+ # ...
264
+ }
265
+ )
266
+ ```
267
+
268
+ You can use this to change the version code and name of your app:
269
+ ```ruby
270
+ gradle(
271
+ # ...
272
+
273
+ properties: {
274
+ "android.injected.version.code" => 100,
275
+ "android.injected.version.name" => "1.0.0",
263
276
  # ...
264
277
  }
265
278
  )
@@ -32,7 +32,7 @@ module Fastlane
32
32
  def self.example_code
33
33
  [
34
34
  'commit = last_git_commit
35
- crashlytics(notes: commit[:message]) # message of commit
35
+ pilot(changelog: commit[:message]) # message of commit
36
36
  author = commit[:author] # author of the commit
37
37
  author_email = commit[:author_email] # email of the author of the commit
38
38
  hash = commit[:commit_hash] # long sha of commit
@@ -9,9 +9,8 @@ module Fastlane
9
9
 
10
10
  class LatestTestflightBuildNumberAction < Action
11
11
  def self.run(params)
12
- AppStoreBuildNumberAction.run(params)
13
- build_nr = Actions.lane_context[SharedValues::LATEST_BUILD_NUMBER]
14
- build_v = Actions.lane_context[SharedValues::LATEST_VERSION]
12
+ build_v, build_nr = AppStoreBuildNumberAction.get_build_version_and_number(params)
13
+
15
14
  Actions.lane_context[SharedValues::LATEST_TESTFLIGHT_BUILD_NUMBER] = build_nr
16
15
  Actions.lane_context[SharedValues::LATEST_TESTFLIGHT_VERSION] = build_v
17
16
  return build_nr
@@ -47,7 +46,7 @@ module Fastlane
47
46
  end),
48
47
  FastlaneCore::ConfigItem.new(key: :api_key,
49
48
  env_names: ["APPSTORE_BUILD_NUMBER_API_KEY", "APP_STORE_CONNECT_API_KEY"],
50
- description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#use-return-value-and-pass-in-as-an-option)",
49
+ description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key-hash-option)",
51
50
  type: Hash,
52
51
  optional: true,
53
52
  sensitive: true,