fastlane 2.197.0 → 2.198.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +90 -90
  3. data/cert/lib/cert/runner.rb +5 -2
  4. data/deliver/lib/deliver/runner.rb +1 -1
  5. data/fastlane/lib/fastlane/actions/get_push_certificate.rb +1 -1
  6. data/fastlane/lib/fastlane/actions/get_version_number.rb +6 -2
  7. data/fastlane/lib/fastlane/actions/notarize.rb +29 -11
  8. data/fastlane/lib/fastlane/actions/set_github_release.rb +11 -5
  9. data/fastlane/lib/fastlane/version.rb +1 -1
  10. data/fastlane/swift/Deliverfile.swift +1 -1
  11. data/fastlane/swift/DeliverfileProtocol.swift +1 -1
  12. data/fastlane/swift/Fastlane.swift +23 -7
  13. data/fastlane/swift/Gymfile.swift +1 -1
  14. data/fastlane/swift/GymfileProtocol.swift +1 -1
  15. data/fastlane/swift/Matchfile.swift +1 -1
  16. data/fastlane/swift/MatchfileProtocol.swift +1 -1
  17. data/fastlane/swift/Precheckfile.swift +1 -1
  18. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  19. data/fastlane/swift/Scanfile.swift +1 -1
  20. data/fastlane/swift/ScanfileProtocol.swift +1 -1
  21. data/fastlane/swift/Screengrabfile.swift +1 -1
  22. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  23. data/fastlane/swift/Snapshotfile.swift +1 -1
  24. data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
  25. data/fastlane/swift/formatting/Brewfile.lock.json +23 -18
  26. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +31 -7
  27. data/match/lib/match/nuke.rb +79 -1
  28. data/match/lib/match/spaceship_ensure.rb +1 -0
  29. data/pem/lib/pem/manager.rb +29 -6
  30. data/pem/lib/pem/options.rb +9 -0
  31. data/pilot/lib/pilot/build_manager.rb +1 -1
  32. data/scan/lib/scan/runner.rb +1 -1
  33. data/spaceship/lib/spaceship/connect_api/models/certificate.rb +3 -0
  34. metadata +17 -18
  35. data/spaceship/lib/spaceship/connect_api/models/.build.rb.swp +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 471eff584bf9045c8387208af74f22d6556be211f98a16272b726d7354d7a12e
4
- data.tar.gz: 66f352f900ba8669eb12a16d83f31b28372173207ef2c077312a029548429efd
3
+ metadata.gz: 34ffaaedeedaf54aea167114b6be61500026da48a419856dbf15de2453425e90
4
+ data.tar.gz: 7ab613d2b2c4d94cdc1a49b092af2e15c6f9beb99edbdfa714a2f851704f46cf
5
5
  SHA512:
6
- metadata.gz: a4fc178fa1af1418d7967d29085def077bd3887d3922c4d1308781930ced91ed858d2b3b0032ae2b9116316c32ebba6ae3ee25fd4e4380a336a4e3c8874852fd
7
- data.tar.gz: 354898d403d3829ecbf42627d8b6fe549a78374aa2412c568a53e2dd66b84f8a220e5a480f5e0b7d92c6e89d844b53de9b25cba961d1b9b4976291061e08673e
6
+ metadata.gz: b0ce3c761e4d9015ec19618bfe8cb0bf797a740ddbfbeed841b01f7c8a0100491b45308c62caf877f20360d969bf13605dfefed2d37a9b236ec029c8ffc3e107
7
+ data.tar.gz: c567ba5dfc3fbff8f6eec14e0616d8b0c886f3f55873f6d762944bf088537b6cc78c2e2e2bb600af711d5adb19e68cfd46baf074ac32ac201234b1773163095d
data/README.md CHANGED
@@ -35,43 +35,49 @@ 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='josh-holtz'>
39
- <a href='https://github.com/joshdholtz'>
40
- <img src='https://github.com/joshdholtz.png' width='140px;'>
38
+ <td id='satoshi-namai'>
39
+ <a href='https://github.com/ainame'>
40
+ <img src='https://github.com/ainame.png' width='140px;'>
41
41
  </a>
42
- <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
42
+ <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
43
43
  </td>
44
- <td id='fumiya-nakamura'>
45
- <a href='https://github.com/nafu'>
46
- <img src='https://github.com/nafu.png' width='140px;'>
44
+ <td id='luka-mirosevic'>
45
+ <a href='https://github.com/lmirosevic'>
46
+ <img src='https://github.com/lmirosevic.png' width='140px;'>
47
47
  </a>
48
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
48
+ <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
49
49
  </td>
50
- <td id='danielle-tomlinson'>
51
- <a href='https://github.com/endocrimes'>
52
- <img src='https://github.com/endocrimes.png' width='140px;'>
50
+ <td id='felix-krause'>
51
+ <a href='https://github.com/KrauseFx'>
52
+ <img src='https://github.com/KrauseFx.png' width='140px;'>
53
53
  </a>
54
- <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
54
+ <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
55
55
  </td>
56
- <td id='maksym-grebenets'>
57
- <a href='https://github.com/mgrebenets'>
58
- <img src='https://github.com/mgrebenets.png' width='140px;'>
56
+ <td id='joshua-liebowitz'>
57
+ <a href='https://github.com/taquitos'>
58
+ <img src='https://github.com/taquitos.png' width='140px;'>
59
59
  </a>
60
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
60
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
61
61
  </td>
62
- <td id='satoshi-namai'>
63
- <a href='https://github.com/ainame'>
64
- <img src='https://github.com/ainame.png' width='140px;'>
62
+ <td id='stefan-natchev'>
63
+ <a href='https://github.com/snatchev'>
64
+ <img src='https://github.com/snatchev.png' width='140px;'>
65
65
  </a>
66
- <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
66
+ <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
67
67
  </td>
68
68
  </tr>
69
69
  <tr>
70
- <td id='roger-oba'>
71
- <a href='https://github.com/rogerluan'>
72
- <img src='https://github.com/rogerluan.png' width='140px;'>
70
+ <td id='daniel-jankowski'>
71
+ <a href='https://github.com/mollyIV'>
72
+ <img src='https://github.com/mollyIV.png' width='140px;'>
73
73
  </a>
74
- <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
74
+ <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
75
+ </td>
76
+ <td id='andrew-mcburney'>
77
+ <a href='https://github.com/armcburney'>
78
+ <img src='https://github.com/armcburney.png' width='140px;'>
79
+ </a>
80
+ <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
75
81
  </td>
76
82
  <td id='matthew-ellis'>
77
83
  <a href='https://github.com/matthewellis'>
@@ -79,31 +85,43 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
79
85
  </a>
80
86
  <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
81
87
  </td>
88
+ <td id='manish-rathi'>
89
+ <a href='https://github.com/crazymanish'>
90
+ <img src='https://github.com/crazymanish.png' width='140px;'>
91
+ </a>
92
+ <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
93
+ </td>
94
+ <td id='max-ott'>
95
+ <a href='https://github.com/max-ott'>
96
+ <img src='https://github.com/max-ott.png' width='140px;'>
97
+ </a>
98
+ <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
99
+ </td>
100
+ </tr>
101
+ <tr>
82
102
  <td id='olivier-halligon'>
83
103
  <a href='https://github.com/AliSoftware'>
84
104
  <img src='https://github.com/AliSoftware.png' width='140px;'>
85
105
  </a>
86
106
  <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
87
107
  </td>
88
- <td id='helmut-januschka'>
89
- <a href='https://github.com/hjanuschka'>
90
- <img src='https://github.com/hjanuschka.png' width='140px;'>
108
+ <td id='aaron-brager'>
109
+ <a href='https://github.com/getaaron'>
110
+ <img src='https://github.com/getaaron.png' width='140px;'>
91
111
  </a>
92
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
112
+ <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
93
113
  </td>
94
- <td id='daniel-jankowski'>
95
- <a href='https://github.com/mollyIV'>
96
- <img src='https://github.com/mollyIV.png' width='140px;'>
114
+ <td id='manu-wallner'>
115
+ <a href='https://github.com/milch'>
116
+ <img src='https://github.com/milch.png' width='140px;'>
97
117
  </a>
98
- <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
118
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
99
119
  </td>
100
- </tr>
101
- <tr>
102
- <td id='jan-piotrowski'>
103
- <a href='https://github.com/janpio'>
104
- <img src='https://github.com/janpio.png' width='140px;'>
120
+ <td id='fumiya-nakamura'>
121
+ <a href='https://github.com/nafu'>
122
+ <img src='https://github.com/nafu.png' width='140px;'>
105
123
  </a>
106
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
124
+ <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
107
125
  </td>
108
126
  <td id='jorge-revuelta-h'>
109
127
  <a href='https://github.com/minuscorp'>
@@ -111,37 +129,25 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
111
129
  </a>
112
130
  <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
113
131
  </td>
132
+ </tr>
133
+ <tr>
114
134
  <td id='kohki-miki'>
115
135
  <a href='https://github.com/giginet'>
116
136
  <img src='https://github.com/giginet.png' width='140px;'>
117
137
  </a>
118
138
  <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
119
139
  </td>
120
- <td id='aaron-brager'>
121
- <a href='https://github.com/getaaron'>
122
- <img src='https://github.com/getaaron.png' width='140px;'>
123
- </a>
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
- </td>
132
- </tr>
133
- <tr>
134
- <td id='felix-krause'>
135
- <a href='https://github.com/KrauseFx'>
136
- <img src='https://github.com/KrauseFx.png' width='140px;'>
140
+ <td id='danielle-tomlinson'>
141
+ <a href='https://github.com/endocrimes'>
142
+ <img src='https://github.com/endocrimes.png' width='140px;'>
137
143
  </a>
138
- <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
144
+ <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
139
145
  </td>
140
- <td id='jérôme-lacoste'>
141
- <a href='https://github.com/lacostej'>
142
- <img src='https://github.com/lacostej.png' width='140px;'>
146
+ <td id='helmut-januschka'>
147
+ <a href='https://github.com/hjanuschka'>
148
+ <img src='https://github.com/hjanuschka.png' width='140px;'>
143
149
  </a>
144
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
150
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
145
151
  </td>
146
152
  <td id='jimmy-dee'>
147
153
  <a href='https://github.com/jdee'>
@@ -149,49 +155,43 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
149
155
  </a>
150
156
  <h4 align='center'>Jimmy Dee</h4>
151
157
  </td>
152
- <td id='manish-rathi'>
153
- <a href='https://github.com/crazymanish'>
154
- <img src='https://github.com/crazymanish.png' width='140px;'>
155
- </a>
156
- <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
157
- </td>
158
- <td id='joshua-liebowitz'>
159
- <a href='https://github.com/taquitos'>
160
- <img src='https://github.com/taquitos.png' width='140px;'>
158
+ <td id='iulian-onofrei'>
159
+ <a href='https://github.com/revolter'>
160
+ <img src='https://github.com/revolter.png' width='140px;'>
161
161
  </a>
162
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
162
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
163
163
  </td>
164
164
  </tr>
165
165
  <tr>
166
- <td id='andrew-mcburney'>
167
- <a href='https://github.com/armcburney'>
168
- <img src='https://github.com/armcburney.png' width='140px;'>
166
+ <td id='josh-holtz'>
167
+ <a href='https://github.com/joshdholtz'>
168
+ <img src='https://github.com/joshdholtz.png' width='140px;'>
169
169
  </a>
170
- <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
170
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
171
171
  </td>
172
- <td id='max-ott'>
173
- <a href='https://github.com/max-ott'>
174
- <img src='https://github.com/max-ott.png' width='140px;'>
172
+ <td id='jérôme-lacoste'>
173
+ <a href='https://github.com/lacostej'>
174
+ <img src='https://github.com/lacostej.png' width='140px;'>
175
175
  </a>
176
- <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
176
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
177
177
  </td>
178
- <td id='stefan-natchev'>
179
- <a href='https://github.com/snatchev'>
180
- <img src='https://github.com/snatchev.png' width='140px;'>
178
+ <td id='maksym-grebenets'>
179
+ <a href='https://github.com/mgrebenets'>
180
+ <img src='https://github.com/mgrebenets.png' width='140px;'>
181
181
  </a>
182
- <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
182
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
183
183
  </td>
184
- <td id='iulian-onofrei'>
185
- <a href='https://github.com/revolter'>
186
- <img src='https://github.com/revolter.png' width='140px;'>
184
+ <td id='roger-oba'>
185
+ <a href='https://github.com/rogerluan'>
186
+ <img src='https://github.com/rogerluan.png' width='140px;'>
187
187
  </a>
188
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
188
+ <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
189
189
  </td>
190
- <td id='manu-wallner'>
191
- <a href='https://github.com/milch'>
192
- <img src='https://github.com/milch.png' width='140px;'>
190
+ <td id='jan-piotrowski'>
191
+ <a href='https://github.com/janpio'>
192
+ <img src='https://github.com/janpio.png' width='140px;'>
193
193
  </a>
194
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
194
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
195
195
  </td>
196
196
  </tr>
197
197
  </table>
@@ -154,8 +154,11 @@ module Cert
154
154
  when :developer_id_kext
155
155
  return Spaceship::ConnectAPI::Certificate::CertificateType::DEVELOPER_ID_KEXT
156
156
  when :developer_id_installer
157
- raise "Cannot do with ASC API?"
158
- # return Spaceship.certificate.developer_id_installer
157
+ if !Spaceship::ConnectAPI.token.nil?
158
+ raise "As of 2021-11-09, the App Store Connect API does not allow accessing DEVELOPER_ID_INSTALLER with the API Key. Please file an issue on GitHub if this has changed and needs to be updated"
159
+ else
160
+ return Spaceship::ConnectAPI::Certificate::CertificateType::DEVELOPER_ID_INSTALLER
161
+ end
159
162
  else
160
163
  UI.user_error("Unaccepted value for :type - #{Cert.config[:type]}")
161
164
  end
@@ -186,7 +186,7 @@ module Deliver
186
186
  end
187
187
 
188
188
  transporter = transporter_for_selected_team
189
- result = transporter.upload(package_path: package_path)
189
+ result = transporter.upload(package_path: package_path, asset_path: upload_ipa || upload_pkg)
190
190
 
191
191
  unless result
192
192
  transporter_errors = transporter.displayable_errors
@@ -60,7 +60,7 @@ module Fastlane
60
60
  end
61
61
 
62
62
  def self.is_supported?(platform)
63
- platform == :ios
63
+ [:ios, :mac].include?(platform)
64
64
  end
65
65
 
66
66
  def self.example_code
@@ -109,8 +109,10 @@ module Fastlane
109
109
  options = plist_files.keys
110
110
  selected = UI.select("What build configuration would you like to use?", options)
111
111
  plist_file = plist_files[selected]
112
- else
112
+ elsif plist_files_count > 0
113
113
  plist_file = plist_files.values.first
114
+ else
115
+ return nil
114
116
  end
115
117
 
116
118
  # $(SRCROOT) is the path of where the XcodeProject is
@@ -131,6 +133,8 @@ module Fastlane
131
133
  end
132
134
 
133
135
  def self.get_version_number_from_plist!(plist_file)
136
+ return '$(MARKETING_VERSION)' if plist_file.nil?
137
+
134
138
  plist = Xcodeproj::Plist.read_from_path(plist_file)
135
139
  UI.user_error!("Unable to read plist: #{plist_file}") unless plist
136
140
 
@@ -146,7 +150,7 @@ module Fastlane
146
150
  end
147
151
 
148
152
  def self.details
149
- "This action will return the current version number set on your project."
153
+ "This action will return the current version number set on your project. It first looks in the plist and then for '$(MARKETING_VERSION)' in the build settings."
150
154
  end
151
155
 
152
156
  def self.available_options
@@ -5,6 +5,7 @@ module Fastlane
5
5
  def self.run(params)
6
6
  package_path = params[:package]
7
7
  bundle_id = params[:bundle_id]
8
+ skip_stapling = params[:skip_stapling]
8
9
  try_early_stapling = params[:try_early_stapling]
9
10
  print_log = params[:print_log]
10
11
  verbose = params[:verbose]
@@ -38,13 +39,13 @@ module Fastlane
38
39
  UI.user_error!('Could not read bundle identifier, provide as a parameter') unless bundle_id
39
40
 
40
41
  if use_notarytool
41
- notarytool(params, package_path, bundle_id, try_early_stapling, print_log, verbose, api_key, compressed_package_path)
42
+ notarytool(params, package_path, bundle_id, skip_stapling, print_log, verbose, api_key, compressed_package_path)
42
43
  else
43
- altool(params, package_path, bundle_id, try_early_stapling, print_log, verbose, api_key, compressed_package_path)
44
+ altool(params, package_path, bundle_id, try_early_stapling, skip_stapling, print_log, verbose, api_key, compressed_package_path)
44
45
  end
45
46
  end
46
47
 
47
- def self.notarytool(params, package_path, bundle_id, try_early_stapling, print_log, verbose, api_key, compressed_package_path)
48
+ def self.notarytool(params, package_path, bundle_id, skip_stapling, print_log, verbose, api_key, compressed_package_path)
48
49
  temp_file = nil
49
50
 
50
51
  # Create authorization part of command with either API Key or Apple ID
@@ -89,10 +90,15 @@ module Fastlane
89
90
  submission_id = notarization_info["id"]
90
91
  UI.success("Successfully uploaded package to notarization service with request identifier #{submission_id}")
91
92
 
92
- UI.message('Stapling package')
93
- self.staple(package_path, verbose)
93
+ if skip_stapling
94
+ UI.success("Successfully notarized artifact")
95
+ else
96
+ UI.message('Stapling package')
94
97
 
95
- UI.success("Successfully notarized and stapled package")
98
+ self.staple(package_path, verbose)
99
+
100
+ UI.success("Successfully notarized and stapled package")
101
+ end
96
102
  when 'Invalid'
97
103
  UI.user_error!("Could not notarize package with message '#{notarization_info['statusSummary']}'")
98
104
  else
@@ -102,7 +108,7 @@ module Fastlane
102
108
  temp_file.delete if temp_file
103
109
  end
104
110
 
105
- def self.altool(params, package_path, bundle_id, try_early_stapling, print_log, verbose, api_key, compressed_package_path)
111
+ def self.altool(params, package_path, bundle_id, try_early_stapling, skip_stapling, print_log, verbose, api_key, compressed_package_path)
106
112
  UI.message('Uploading package to notarization service, might take a while')
107
113
 
108
114
  notarization_upload_command = "xcrun altool --notarize-app -t osx -f \"#{compressed_package_path || package_path}\" --primary-bundle-id #{bundle_id} --output-format xml"
@@ -133,7 +139,7 @@ module Fastlane
133
139
  while notarization_info.empty? || (notarization_info['Status'] == 'in progress')
134
140
  if notarization_info.empty?
135
141
  UI.message('Waiting to query request status')
136
- elsif try_early_stapling
142
+ elsif try_early_stapling && !skip_stapling
137
143
  UI.message('Request in progress, trying early staple')
138
144
 
139
145
  begin
@@ -182,11 +188,15 @@ module Fastlane
182
188
 
183
189
  case notarization_info['Status']
184
190
  when 'success'
185
- UI.message('Stapling package')
191
+ if skip_stapling
192
+ UI.success("Successfully notarized artifact#{log_suffix}")
193
+ else
194
+ UI.message('Stapling package')
186
195
 
187
- self.staple(package_path, verbose)
196
+ self.staple(package_path, verbose)
188
197
 
189
- UI.success("Successfully notarized and stapled package#{log_suffix}")
198
+ UI.success("Successfully notarized and stapled package#{log_suffix}")
199
+ end
190
200
  when 'invalid'
191
201
  UI.user_error!("Could not notarize package with message '#{notarization_info['Status Message']}'#{log_suffix}")
192
202
  else
@@ -262,6 +272,14 @@ module Fastlane
262
272
  env_name: 'FL_NOTARIZE_TRY_EARLY_STAPLING',
263
273
  description: 'Whether to try early stapling while the notarization request is in progress',
264
274
  optional: true,
275
+ conflicting_options: [:skip_stapling],
276
+ default_value: false,
277
+ type: Boolean),
278
+ FastlaneCore::ConfigItem.new(key: :skip_stapling,
279
+ env_name: 'FL_NOTARIZE_SKIP_STAPLING',
280
+ description: 'Do not staple the notarization ticket to the artifact; useful for single file executables and ZIP archives',
281
+ optional: true,
282
+ conflicting_options: [:try_early_stapling],
265
283
  default_value: false,
266
284
  type: Boolean),
267
285
  FastlaneCore::ConfigItem.new(key: :bundle_id,
@@ -19,11 +19,12 @@ module Fastlane
19
19
 
20
20
  payload = {
21
21
  'tag_name' => params[:tag_name],
22
- 'name' => params[:name],
23
- 'body' => params[:description],
24
22
  'draft' => !!params[:is_draft],
25
- 'prerelease' => !!params[:is_prerelease]
23
+ 'prerelease' => !!params[:is_prerelease],
24
+ 'generate_release_notes' => !!params[:is_generate_release_notes]
26
25
  }
26
+ payload['name'] = params[:name] if params[:name]
27
+ payload['body'] = params[:description] if params[:description]
27
28
  payload['target_commitish'] = params[:commitish] if params[:commitish]
28
29
 
29
30
  GithubApiAction.run(
@@ -48,8 +49,7 @@ module Fastlane
48
49
  UI.user_error!("You are not authorized to access #{repo_name}, please make sure you provided a valid API token (GITHUB_API_TOKEN)")
49
50
  end,
50
51
  '*' => proc do |result|
51
- UI.error("GitHub responded with #{result[:status]}:#{result[:body]}")
52
- return nil
52
+ UI.user_error!("GitHub responded with #{result[:status]}:#{result[:body]}")
53
53
  end
54
54
  }
55
55
  ) do |result|
@@ -221,6 +221,12 @@ module Fastlane
221
221
  optional: true,
222
222
  default_value: false,
223
223
  type: Boolean),
224
+ FastlaneCore::ConfigItem.new(key: :is_generate_release_notes,
225
+ env_name: "FL_SET_GITHUB_RELEASE_IS_GENERATE_RELEASE_NOTES",
226
+ description: "Whether the name and body of this release should be generated automatically",
227
+ optional: true,
228
+ default_value: false,
229
+ type: Boolean),
224
230
  FastlaneCore::ConfigItem.new(key: :upload_assets,
225
231
  env_name: "FL_SET_GITHUB_RELEASE_UPLOAD_ASSETS",
226
232
  description: "Path to assets to be uploaded with the release",
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.197.0'.freeze
2
+ VERSION = '2.198.0'.freeze
3
3
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
4
4
  MINIMUM_XCODE_RELEASE = "7.0".freeze
5
5
  RUBOCOP_REQUIREMENT = '1.12.1'.freeze
@@ -17,4 +17,4 @@ public class Deliverfile: DeliverfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.197.0
20
+ // Generated with fastlane 2.198.0
@@ -260,4 +260,4 @@ public extension DeliverfileProtocol {
260
260
 
261
261
  // Please don't remove the lines below
262
262
  // They are used to detect outdated files
263
- // FastlaneRunnerAPIVersion [0.9.86]
263
+ // FastlaneRunnerAPIVersion [0.9.87]
@@ -4993,6 +4993,7 @@ public func getManagedPlayStorePublishingRights(jsonKey: OptionalConfigValue<Str
4993
4993
  Ensure a valid push profile is active, creating a new one if needed (via _pem_)
4994
4994
 
4995
4995
  - parameters:
4996
+ - platform: Set certificate's platform. Used for creation of production & development certificates. Supported platforms: ios, macos
4996
4997
  - development: Renew the development push certificate instead of the production one
4997
4998
  - websitePush: Create a Website Push certificate
4998
4999
  - generateP12: Generate a p12 file additionally to a PEM file
@@ -5020,7 +5021,8 @@ public func getManagedPlayStorePublishingRights(jsonKey: OptionalConfigValue<Str
5020
5021
  ```|
5021
5022
  >|
5022
5023
  */
5023
- public func getPushCertificate(development: OptionalConfigValue<Bool> = .fastlaneDefault(false),
5024
+ public func getPushCertificate(platform: String = "ios",
5025
+ development: OptionalConfigValue<Bool> = .fastlaneDefault(false),
5024
5026
  websitePush: OptionalConfigValue<Bool> = .fastlaneDefault(false),
5025
5027
  generateP12: OptionalConfigValue<Bool> = .fastlaneDefault(true),
5026
5028
  activeDaysLimit: Int = 30,
@@ -5035,6 +5037,7 @@ public func getPushCertificate(development: OptionalConfigValue<Bool> = .fastlan
5035
5037
  outputPath: String = ".",
5036
5038
  newProfile: ((String) -> Void)? = nil)
5037
5039
  {
5040
+ let platformArg = RubyCommand.Argument(name: "platform", value: platform, type: nil)
5038
5041
  let developmentArg = development.asRubyArgument(name: "development", type: nil)
5039
5042
  let websitePushArg = websitePush.asRubyArgument(name: "website_push", type: nil)
5040
5043
  let generateP12Arg = generateP12.asRubyArgument(name: "generate_p12", type: nil)
@@ -5049,7 +5052,8 @@ public func getPushCertificate(development: OptionalConfigValue<Bool> = .fastlan
5049
5052
  let pemNameArg = pemName.asRubyArgument(name: "pem_name", type: nil)
5050
5053
  let outputPathArg = RubyCommand.Argument(name: "output_path", value: outputPath, type: nil)
5051
5054
  let newProfileArg = RubyCommand.Argument(name: "new_profile", value: newProfile, type: .stringClosure)
5052
- let array: [RubyCommand.Argument?] = [developmentArg,
5055
+ let array: [RubyCommand.Argument?] = [platformArg,
5056
+ developmentArg,
5053
5057
  websitePushArg,
5054
5058
  generateP12Arg,
5055
5059
  activeDaysLimitArg,
@@ -5078,7 +5082,7 @@ public func getPushCertificate(development: OptionalConfigValue<Bool> = .fastlan
5078
5082
  - target: Target name, optional. Will be needed if you have more than one non-test target to avoid being prompted to select one
5079
5083
  - configuration: Configuration name, optional. Will be needed if you have altered the configurations from the default or your version number depends on the configuration selected
5080
5084
 
5081
- This action will return the current version number set on your project.
5085
+ This action will return the current version number set on your project. It first looks in the plist and then for '$(MARKETING_VERSION)' in the build settings.
5082
5086
  */
5083
5087
  @discardableResult public func getVersionNumber(xcodeproj: OptionalConfigValue<String?> = .fastlaneDefault(nil),
5084
5088
  target: OptionalConfigValue<String?> = .fastlaneDefault(nil),
@@ -7098,6 +7102,7 @@ public func nexusUpload(file: String,
7098
7102
  - package: Path to package to notarize, e.g. .app bundle or disk image
7099
7103
  - useNotarytool: Whether to `xcrun notarytool` or `xcrun altool`
7100
7104
  - tryEarlyStapling: Whether to try early stapling while the notarization request is in progress
7105
+ - skipStapling: Do not staple the notarization ticket to the artifact; useful for single file executables and ZIP archives
7101
7106
  - bundleId: Bundle identifier to uniquely identify the package
7102
7107
  - username: Apple ID username
7103
7108
  - ascProvider: Provider short name for accounts associated with multiple providers
@@ -7109,6 +7114,7 @@ public func nexusUpload(file: String,
7109
7114
  public func notarize(package: String,
7110
7115
  useNotarytool: OptionalConfigValue<Bool> = .fastlaneDefault(true),
7111
7116
  tryEarlyStapling: OptionalConfigValue<Bool> = .fastlaneDefault(false),
7117
+ skipStapling: OptionalConfigValue<Bool> = .fastlaneDefault(false),
7112
7118
  bundleId: OptionalConfigValue<String?> = .fastlaneDefault(nil),
7113
7119
  username: OptionalConfigValue<String?> = .fastlaneDefault(nil),
7114
7120
  ascProvider: OptionalConfigValue<String?> = .fastlaneDefault(nil),
@@ -7120,6 +7126,7 @@ public func notarize(package: String,
7120
7126
  let packageArg = RubyCommand.Argument(name: "package", value: package, type: nil)
7121
7127
  let useNotarytoolArg = useNotarytool.asRubyArgument(name: "use_notarytool", type: nil)
7122
7128
  let tryEarlyStaplingArg = tryEarlyStapling.asRubyArgument(name: "try_early_stapling", type: nil)
7129
+ let skipStaplingArg = skipStapling.asRubyArgument(name: "skip_stapling", type: nil)
7123
7130
  let bundleIdArg = bundleId.asRubyArgument(name: "bundle_id", type: nil)
7124
7131
  let usernameArg = username.asRubyArgument(name: "username", type: nil)
7125
7132
  let ascProviderArg = ascProvider.asRubyArgument(name: "asc_provider", type: nil)
@@ -7130,6 +7137,7 @@ public func notarize(package: String,
7130
7137
  let array: [RubyCommand.Argument?] = [packageArg,
7131
7138
  useNotarytoolArg,
7132
7139
  tryEarlyStaplingArg,
7140
+ skipStaplingArg,
7133
7141
  bundleIdArg,
7134
7142
  usernameArg,
7135
7143
  ascProviderArg,
@@ -7391,6 +7399,7 @@ public func optOutUsage() {
7391
7399
  Alias for the `get_push_certificate` action
7392
7400
 
7393
7401
  - parameters:
7402
+ - platform: Set certificate's platform. Used for creation of production & development certificates. Supported platforms: ios, macos
7394
7403
  - development: Renew the development push certificate instead of the production one
7395
7404
  - websitePush: Create a Website Push certificate
7396
7405
  - generateP12: Generate a p12 file additionally to a PEM file
@@ -7418,7 +7427,8 @@ public func optOutUsage() {
7418
7427
  ```|
7419
7428
  >|
7420
7429
  */
7421
- public func pem(development: OptionalConfigValue<Bool> = .fastlaneDefault(false),
7430
+ public func pem(platform: String = "ios",
7431
+ development: OptionalConfigValue<Bool> = .fastlaneDefault(false),
7422
7432
  websitePush: OptionalConfigValue<Bool> = .fastlaneDefault(false),
7423
7433
  generateP12: OptionalConfigValue<Bool> = .fastlaneDefault(true),
7424
7434
  activeDaysLimit: Int = 30,
@@ -7433,6 +7443,7 @@ public func pem(development: OptionalConfigValue<Bool> = .fastlaneDefault(false)
7433
7443
  outputPath: String = ".",
7434
7444
  newProfile: ((String) -> Void)? = nil)
7435
7445
  {
7446
+ let platformArg = RubyCommand.Argument(name: "platform", value: platform, type: nil)
7436
7447
  let developmentArg = development.asRubyArgument(name: "development", type: nil)
7437
7448
  let websitePushArg = websitePush.asRubyArgument(name: "website_push", type: nil)
7438
7449
  let generateP12Arg = generateP12.asRubyArgument(name: "generate_p12", type: nil)
@@ -7447,7 +7458,8 @@ public func pem(development: OptionalConfigValue<Bool> = .fastlaneDefault(false)
7447
7458
  let pemNameArg = pemName.asRubyArgument(name: "pem_name", type: nil)
7448
7459
  let outputPathArg = RubyCommand.Argument(name: "output_path", value: outputPath, type: nil)
7449
7460
  let newProfileArg = RubyCommand.Argument(name: "new_profile", value: newProfile, type: .stringClosure)
7450
- let array: [RubyCommand.Argument?] = [developmentArg,
7461
+ let array: [RubyCommand.Argument?] = [platformArg,
7462
+ developmentArg,
7451
7463
  websitePushArg,
7452
7464
  generateP12Arg,
7453
7465
  activeDaysLimitArg,
@@ -9438,6 +9450,7 @@ public func setChangelog(apiKeyPath: OptionalConfigValue<String?> = .fastlaneDef
9438
9450
  - description: Description of this release
9439
9451
  - isDraft: Whether the release should be marked as draft
9440
9452
  - isPrerelease: Whether the release should be marked as prerelease
9453
+ - isGenerateReleaseNotes: Whether the name and body of this release should be generated automatically
9441
9454
  - uploadAssets: Path to assets to be uploaded with the release
9442
9455
 
9443
9456
  - returns: A hash containing all relevant information of this release
@@ -9457,6 +9470,7 @@ public func setChangelog(apiKeyPath: OptionalConfigValue<String?> = .fastlaneDef
9457
9470
  description: OptionalConfigValue<String?> = .fastlaneDefault(nil),
9458
9471
  isDraft: OptionalConfigValue<Bool> = .fastlaneDefault(false),
9459
9472
  isPrerelease: OptionalConfigValue<Bool> = .fastlaneDefault(false),
9473
+ isGenerateReleaseNotes: OptionalConfigValue<Bool> = .fastlaneDefault(false),
9460
9474
  uploadAssets: OptionalConfigValue<[String]?> = .fastlaneDefault(nil)) -> [String: Any]
9461
9475
  {
9462
9476
  let repositoryNameArg = RubyCommand.Argument(name: "repository_name", value: repositoryName, type: nil)
@@ -9469,6 +9483,7 @@ public func setChangelog(apiKeyPath: OptionalConfigValue<String?> = .fastlaneDef
9469
9483
  let descriptionArg = description.asRubyArgument(name: "description", type: nil)
9470
9484
  let isDraftArg = isDraft.asRubyArgument(name: "is_draft", type: nil)
9471
9485
  let isPrereleaseArg = isPrerelease.asRubyArgument(name: "is_prerelease", type: nil)
9486
+ let isGenerateReleaseNotesArg = isGenerateReleaseNotes.asRubyArgument(name: "is_generate_release_notes", type: nil)
9472
9487
  let uploadAssetsArg = uploadAssets.asRubyArgument(name: "upload_assets", type: nil)
9473
9488
  let array: [RubyCommand.Argument?] = [repositoryNameArg,
9474
9489
  serverUrlArg,
@@ -9480,6 +9495,7 @@ public func setChangelog(apiKeyPath: OptionalConfigValue<String?> = .fastlaneDef
9480
9495
  descriptionArg,
9481
9496
  isDraftArg,
9482
9497
  isPrereleaseArg,
9498
+ isGenerateReleaseNotesArg,
9483
9499
  uploadAssetsArg]
9484
9500
  let args: [RubyCommand.Argument] = array
9485
9501
  .filter { $0?.value != nil }
@@ -13048,7 +13064,7 @@ public func xcov(workspace: OptionalConfigValue<String?> = .fastlaneDefault(nil)
13048
13064
  coverallsServiceJobId: OptionalConfigValue<String?> = .fastlaneDefault(nil),
13049
13065
  coverallsRepoToken: OptionalConfigValue<String?> = .fastlaneDefault(nil),
13050
13066
  xcconfig: OptionalConfigValue<String?> = .fastlaneDefault(nil),
13051
- ideFoundationPath: String = "/Applications/Xcode.app/Contents/Developer/../Frameworks/IDEFoundation.framework/Versions/A/IDEFoundation",
13067
+ ideFoundationPath: String = "/Applications/Xcode-13.1.0.app/Contents/Developer/../Frameworks/IDEFoundation.framework/Versions/A/IDEFoundation",
13052
13068
  legacySupport: OptionalConfigValue<Bool> = .fastlaneDefault(false))
13053
13069
  {
13054
13070
  let workspaceArg = workspace.asRubyArgument(name: "workspace", type: nil)
@@ -13250,4 +13266,4 @@ public let snapshotfile = Snapshotfile()
13250
13266
 
13251
13267
  // Please don't remove the lines below
13252
13268
  // They are used to detect outdated files
13253
- // FastlaneRunnerAPIVersion [0.9.139]
13269
+ // FastlaneRunnerAPIVersion [0.9.140]
@@ -17,4 +17,4 @@ public class Gymfile: GymfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.197.0
20
+ // Generated with fastlane 2.198.0
@@ -196,4 +196,4 @@ public extension GymfileProtocol {
196
196
 
197
197
  // Please don't remove the lines below
198
198
  // They are used to detect outdated files
199
- // FastlaneRunnerAPIVersion [0.9.89]
199
+ // FastlaneRunnerAPIVersion [0.9.90]
@@ -17,4 +17,4 @@ public class Matchfile: MatchfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.197.0
20
+ // Generated with fastlane 2.198.0
@@ -192,4 +192,4 @@ public extension MatchfileProtocol {
192
192
 
193
193
  // Please don't remove the lines below
194
194
  // They are used to detect outdated files
195
- // FastlaneRunnerAPIVersion [0.9.83]
195
+ // FastlaneRunnerAPIVersion [0.9.84]
@@ -17,4 +17,4 @@ public class Precheckfile: PrecheckfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.197.0
20
+ // Generated with fastlane 2.198.0
@@ -52,4 +52,4 @@ public extension PrecheckfileProtocol {
52
52
 
53
53
  // Please don't remove the lines below
54
54
  // They are used to detect outdated files
55
- // FastlaneRunnerAPIVersion [0.9.82]
55
+ // FastlaneRunnerAPIVersion [0.9.83]
@@ -17,4 +17,4 @@ public class Scanfile: ScanfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.197.0
20
+ // Generated with fastlane 2.198.0
@@ -296,4 +296,4 @@ public extension ScanfileProtocol {
296
296
 
297
297
  // Please don't remove the lines below
298
298
  // They are used to detect outdated files
299
- // FastlaneRunnerAPIVersion [0.9.94]
299
+ // FastlaneRunnerAPIVersion [0.9.95]
@@ -17,4 +17,4 @@ public class Screengrabfile: ScreengrabfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.197.0
20
+ // Generated with fastlane 2.198.0
@@ -96,4 +96,4 @@ public extension ScreengrabfileProtocol {
96
96
 
97
97
  // Please don't remove the lines below
98
98
  // They are used to detect outdated files
99
- // FastlaneRunnerAPIVersion [0.9.84]
99
+ // FastlaneRunnerAPIVersion [0.9.85]
@@ -17,4 +17,4 @@ public class Snapshotfile: SnapshotfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.197.0
20
+ // Generated with fastlane 2.198.0
@@ -200,4 +200,4 @@ public extension SnapshotfileProtocol {
200
200
 
201
201
  // Please don't remove the lines below
202
202
  // They are used to detect outdated files
203
- // FastlaneRunnerAPIVersion [0.9.78]
203
+ // FastlaneRunnerAPIVersion [0.9.79]
@@ -2,30 +2,35 @@
2
2
  "entries": {
3
3
  "brew": {
4
4
  "swiftformat": {
5
- "version": "0.48.17",
5
+ "version": "0.48.18",
6
6
  "bottle": {
7
7
  "rebuild": 0,
8
8
  "root_url": "https://ghcr.io/v2/homebrew/core",
9
9
  "files": {
10
+ "arm64_monterey": {
11
+ "cellar": ":any_skip_relocation",
12
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:adbb11cdda0596a1f40e920f826a2e1ffe6aeb1643c43ddb108f25f30755be39",
13
+ "sha256": "adbb11cdda0596a1f40e920f826a2e1ffe6aeb1643c43ddb108f25f30755be39"
14
+ },
10
15
  "arm64_big_sur": {
11
16
  "cellar": ":any_skip_relocation",
12
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:e19dbc72ddf213203e940708f3de6d9ca9c88663b5176494d04b4c418e16954f",
13
- "sha256": "e19dbc72ddf213203e940708f3de6d9ca9c88663b5176494d04b4c418e16954f"
17
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:74691b21c40d34459c5825306828039bdbdfdd02c80d1cea5c449c3f59760ab1",
18
+ "sha256": "74691b21c40d34459c5825306828039bdbdfdd02c80d1cea5c449c3f59760ab1"
14
19
  },
15
- "big_sur": {
20
+ "monterey": {
16
21
  "cellar": ":any_skip_relocation",
17
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:90056a4e3b03ef31cecfb5b9e278a44bea2abecdd26a202d00bc390dfbbeb352",
18
- "sha256": "90056a4e3b03ef31cecfb5b9e278a44bea2abecdd26a202d00bc390dfbbeb352"
22
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:14e4b90f29b55b06c92f90b6e81e8dd55c54ff258ee8b0bab2bb479ce0cc8daf",
23
+ "sha256": "14e4b90f29b55b06c92f90b6e81e8dd55c54ff258ee8b0bab2bb479ce0cc8daf"
19
24
  },
20
- "catalina": {
25
+ "big_sur": {
21
26
  "cellar": ":any_skip_relocation",
22
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:9647fdbfed2e7e2361974a5bfb99be4a112d914bd3e582afb4cdf7dc81e44cbf",
23
- "sha256": "9647fdbfed2e7e2361974a5bfb99be4a112d914bd3e582afb4cdf7dc81e44cbf"
27
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:73f0497b504f87159bc2d133371014e0372799d89f62bc78068b3b5427ae614f",
28
+ "sha256": "73f0497b504f87159bc2d133371014e0372799d89f62bc78068b3b5427ae614f"
24
29
  },
25
- "mojave": {
30
+ "catalina": {
26
31
  "cellar": ":any_skip_relocation",
27
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:83231c218cca811795688e175d88ac4584d1c424566926f9d6ed36e9dbdfed75",
28
- "sha256": "83231c218cca811795688e175d88ac4584d1c424566926f9d6ed36e9dbdfed75"
32
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:11543d157b589acdf9de93133a68fa32aa00372b574a64c40292aead20f6f6cb",
33
+ "sha256": "11543d157b589acdf9de93133a68fa32aa00372b574a64c40292aead20f6f6cb"
29
34
  }
30
35
  }
31
36
  }
@@ -51,12 +56,12 @@
51
56
  "macOS": "11.6"
52
57
  },
53
58
  "monterey": {
54
- "HOMEBREW_VERSION": "3.2.13-55-ga6959e4",
55
- "HOMEBREW_PREFIX": "/usr/local",
56
- "Homebrew/homebrew-core": "3fb109275770551bba03c7055d75ceec2c38b1b2",
57
- "CLT": "13.0.0.0.1.1628499445",
58
- "Xcode": "13.0",
59
- "macOS": "12.0"
59
+ "HOMEBREW_VERSION": "3.3.4",
60
+ "HOMEBREW_PREFIX": "/opt/homebrew",
61
+ "Homebrew/homebrew-core": "446005a8fbbc1a51d0bd8efd8e03bf82f1f78fab",
62
+ "CLT": "13.1.0.0.1.1633545042",
63
+ "Xcode": "13.1",
64
+ "macOS": "12.0.1"
60
65
  }
61
66
  }
62
67
  }
@@ -1,4 +1,5 @@
1
1
  require 'shellwords'
2
+ require 'tmpdir'
2
3
  require 'fileutils'
3
4
  require 'credentials_manager/account_manager'
4
5
 
@@ -148,6 +149,14 @@ module FastlaneCore
148
149
  end
149
150
  end
150
151
 
152
+ def file_upload_option(source)
153
+ if File.extname(source) == ".itmsp"
154
+ return "-f #{source.shellescape}"
155
+ else
156
+ return "-assetFile #{source.shellescape}"
157
+ end
158
+ end
159
+
151
160
  def additional_upload_parameters
152
161
  # As Apple recommends in Transporter User Guide we shouldn't specify the -t transport parameter
153
162
  # and instead allow Transporter to use automatic transport discovery
@@ -177,7 +186,7 @@ module FastlaneCore
177
186
  ("-u #{username.shellescape}" unless use_jwt),
178
187
  ("-p #{shell_escaped_password(password)}" unless use_jwt),
179
188
  ("-jwt #{jwt}" if use_jwt),
180
- "-f \"#{source}\"",
189
+ file_upload_option(source),
181
190
  additional_upload_parameters, # that's here, because the user might overwrite the -t option
182
191
  "-k 100000",
183
192
  ("-WONoPause true" if Helper.windows?), # Windows only: process instantly returns instead of waiting for key press
@@ -261,7 +270,7 @@ module FastlaneCore
261
270
  ("-u #{username.shellescape}" unless use_jwt),
262
271
  ("-p @env:ITMS_TRANSPORTER_PASSWORD" unless use_jwt),
263
272
  ("-jwt #{jwt}" if use_jwt),
264
- "-f #{source.shellescape}",
273
+ file_upload_option(source),
265
274
  additional_upload_parameters, # that's here, because the user might overwrite the -t option
266
275
  '-k 100000',
267
276
  ("-itc_provider #{provider_short_name}" if jwt.nil? && !provider_short_name.to_s.empty?),
@@ -282,7 +291,7 @@ module FastlaneCore
282
291
  ("-u #{username.shellescape}" unless use_jwt),
283
292
  ("-p #{password.shellescape}" unless use_jwt),
284
293
  ("-jwt #{jwt}" if use_jwt),
285
- "-f #{source.shellescape}",
294
+ file_upload_option(source),
286
295
  additional_upload_parameters, # that's here, because the user might overwrite the -t option
287
296
  '-k 100000',
288
297
  ("-itc_provider #{provider_short_name}" if jwt.nil? && !provider_short_name.to_s.empty?),
@@ -472,12 +481,27 @@ module FastlaneCore
472
481
  # @param app_id [Integer] The unique App ID
473
482
  # @param dir [String] the path in which the package file is located
474
483
  # @param package_path [String] the path to the package file (used instead of app_id and dir)
484
+ # @param asset_path [String] the path to the ipa/dmg/pkg file (used instead of package_path if running on macOS)
475
485
  # @return (Bool) True if everything worked fine
476
486
  # @raise [Deliver::TransporterTransferError] when something went wrong
477
487
  # when transferring
478
- def upload(app_id = nil, dir = nil, package_path: nil)
479
- raise "app_id and dir are required or package_path is required" if (app_id.nil? || dir.nil?) && package_path.nil?
480
- actual_dir = package_path || File.join(dir, "#{app_id}.itmsp")
488
+ def upload(app_id = nil, dir = nil, package_path: nil, asset_path: nil)
489
+ raise "app_id and dir are required or package_path or asset_path is required" if (app_id.nil? || dir.nil?) && package_path.nil? && asset_path.nil?
490
+
491
+ # Transport can upload .ipa, .dmg, and .pkg files directly with -assetFile
492
+ # However, -assetFile requires -assetDescription if Linux or Windows
493
+ # This will give the asset directly if macOS and asset_path exists
494
+ # otherwise it will use the .itmsp package
495
+ actual_dir = if Helper.is_mac? && asset_path
496
+ # The asset gets deleted upon completion so copying to a temp directory
497
+ tmp_asset_path = File.join(Dir.tmpdir, File.basename(asset_path))
498
+ FileUtils.cp(asset_path, tmp_asset_path)
499
+ tmp_asset_path
500
+ elsif package_path
501
+ package_path
502
+ else
503
+ File.join(dir, "#{app_id}.itmsp")
504
+ end
481
505
 
482
506
  UI.message("Going to upload updated app to App Store Connect")
483
507
  UI.success("This might take a few minutes. Please don't interrupt the script.")
@@ -492,7 +516,7 @@ module FastlaneCore
492
516
  result = @transporter_executor.execute(command, ItunesTransporter.hide_transporter_output?)
493
517
  rescue TransporterRequiresApplicationSpecificPasswordError => ex
494
518
  handle_two_step_failure(ex)
495
- return upload(app_id, dir, package_path: package_path)
519
+ return upload(app_id, dir, package_path: package_path, asset_path: asset_path)
496
520
  end
497
521
 
498
522
  if result
@@ -9,7 +9,11 @@ require_relative 'module'
9
9
  require_relative 'storage'
10
10
  require_relative 'encryption'
11
11
 
12
+ require 'tempfile'
13
+ require 'base64'
14
+
12
15
  module Match
16
+ # rubocop:disable Metrics/ClassLength
13
17
  class Nuke
14
18
  attr_accessor :params
15
19
  attr_accessor :type
@@ -67,6 +71,7 @@ module Match
67
71
  title: "Summary for match nuke #{Fastlane::VERSION}")
68
72
 
69
73
  prepare_list
74
+ filter_by_cert
70
75
  print_tables
71
76
 
72
77
  if params[:readonly]
@@ -139,7 +144,7 @@ module Match
139
144
  types = profile_types(prov_type)
140
145
  # Filtering on 'profileType' seems to be undocumented as of 2020-07-30
141
146
  # but works on both web session and official API
142
- self.profiles += Spaceship::ConnectAPI::Profile.all(filter: { profileType: types.join(",") })
147
+ self.profiles += Spaceship::ConnectAPI::Profile.all(filter: { profileType: types.join(",") }, includes: "certificates")
143
148
  end
144
149
 
145
150
  # Gets the main and additional cert types
@@ -173,6 +178,78 @@ module Match
173
178
  self.files = certs + keys + profiles
174
179
  end
175
180
 
181
+ def filter_by_cert
182
+ # Force will continue to revoke and delete all certificates and profiles
183
+ return if self.params[:force] || !UI.interactive?
184
+ return if self.certs.count < 2
185
+
186
+ # Print table showing certificates that can be revoked
187
+ puts("")
188
+ rows = self.certs.each_with_index.collect do |cert, i|
189
+ cert_expiration = cert.expiration_date.nil? ? "Unknown" : Time.parse(cert.expiration_date).strftime("%Y-%m-%d")
190
+ [i + 1, cert.name, cert.id, cert.class.to_s.split("::").last, cert_expiration]
191
+ end
192
+ puts(Terminal::Table.new({
193
+ title: "Certificates that can be revoked".green,
194
+ headings: ["Option", "Name", "ID", "Type", "Expires"],
195
+ rows: FastlaneCore::PrintTable.transform_output(rows)
196
+ }))
197
+ puts("")
198
+
199
+ UI.important("By default, all listed certificates and profiles will be nuked")
200
+ if UI.confirm("Do you want to only nuke specific certificates and their associated profiles?")
201
+ input_indexes = UI.input("Enter the \"Option\" number(s) from the table above? (comma-separated)").split(',')
202
+
203
+ # Get certificates from option indexes
204
+ self.certs = input_indexes.map do |index|
205
+ self.certs[index.to_i - 1]
206
+ end.compact
207
+
208
+ if self.certs.empty?
209
+ UI.user_error!("No certificates were selected based on option number(s) entered")
210
+ end
211
+
212
+ # Do profile selection logic
213
+ cert_ids = self.certs.map(&:id)
214
+ self.profiles = self.profiles.select do |profile|
215
+ profile_cert_ids = profile.certificates.map(&:id)
216
+ (cert_ids & profile_cert_ids).any?
217
+ end
218
+
219
+ # Do file selection logic
220
+ self.files = self.files.select do |f|
221
+ found = false
222
+
223
+ ext = File.extname(f)
224
+ filename = File.basename(f, ".*")
225
+
226
+ # Attempt to find cert based on filename
227
+ if ext == ".cer" || ext == ".p12"
228
+ found ||= self.certs.any? do |cert|
229
+ filename == cert.id.to_s
230
+ end
231
+ end
232
+
233
+ # Attempt to find profile matched on UUIDs in profile
234
+ if ext == ".mobileprovision" || ext == ".provisionprofile"
235
+ storage_uuid = FastlaneCore::ProvisioningProfile.uuid(f)
236
+
237
+ found ||= self.profiles.any? do |profile|
238
+ tmp_file = Tempfile.new
239
+ tmp_file.write(Base64.decode64(profile.profile_content))
240
+ tmp_file.close
241
+
242
+ # Compare profile uuid in storage to profile uuid on developer portal
243
+ portal_uuid = FastlaneCore::ProvisioningProfile.uuid(tmp_file.path)
244
+ storage_uuid == portal_uuid
245
+ end
246
+ end
247
+
248
+ found
249
+ end
250
+ end
251
+ end
252
+
176
253
  # Print tables to ask the user
177
254
  def print_tables
178
255
  puts("")
@@ -351,4 +428,5 @@ module Match
351
428
  end
352
429
  end
353
430
  end
431
+ # rubocop:disable Metrics/ClassLength
354
432
  end
@@ -70,6 +70,7 @@ module Match
70
70
  UI.error("for the user #{username}")
71
71
  UI.error("Make sure to use the same user and team every time you run 'match' for this")
72
72
  UI.error("Git repository. This might be caused by revoking the certificate on the Dev Portal")
73
+ UI.error("If missing certificate is a Developer ID Installer, you may need to auth with Apple ID instead of App Store API Key")
73
74
  UI.user_error!("To reset the certificates of your Apple account, you can use the `fastlane match nuke` feature, more information on https://docs.fastlane.tools/actions/match/")
74
75
  end
75
76
 
@@ -18,7 +18,13 @@ module PEM
18
18
 
19
19
  if existing_certificate
20
20
  remaining_days = (existing_certificate.expires - Time.now) / 60 / 60 / 24
21
- UI.message("Existing push notification profile for '#{existing_certificate.owner_name}' is valid for #{remaining_days.round} more days.")
21
+
22
+ display_platform = ''
23
+ unless PEM.config[:website_push]
24
+ display_platform = "#{PEM.config[:platform]} "
25
+ end
26
+
27
+ UI.message("Existing #{display_platform}push notification profile for '#{existing_certificate.owner_name}' is valid for #{remaining_days.round} more days.")
22
28
  if remaining_days > PEM.config[:active_days_limit]
23
29
  if PEM.config[:force]
24
30
  UI.success("You already have an existing push certificate, but a new one will be created since the --force option has been set.")
@@ -59,7 +65,7 @@ module PEM
59
65
 
60
66
  x509_certificate = cert.download
61
67
 
62
- filename_base = PEM.config[:pem_name] || "#{certificate_type}_#{PEM.config[:app_identifier]}"
68
+ filename_base = PEM.config[:pem_name] || "#{certificate_type}_#{PEM.config[:app_identifier]}_#{PEM.config[:platform]}"
63
69
  filename_base = File.basename(filename_base, ".pem") # strip off the .pem if it was provided.
64
70
 
65
71
  output_path = File.expand_path(PEM.config[:output_path])
@@ -86,12 +92,29 @@ module PEM
86
92
  end
87
93
 
88
94
  def certificate
89
- if PEM.config[:development]
90
- Spaceship.certificate.development_push
91
- elsif PEM.config[:website_push]
95
+ if PEM.config[:website_push]
92
96
  Spaceship.certificate.website_push
93
97
  else
94
- Spaceship.certificate.production_push
98
+ platform = PEM.config[:platform]
99
+ UI.user_error!('platform parameter is unspecified.') unless platform
100
+
101
+ case platform
102
+ when 'ios'
103
+ if PEM.config[:development]
104
+ Spaceship.certificate.development_push
105
+ else
106
+ Spaceship.certificate.production_push
107
+ end
108
+ when 'macos'
109
+ if PEM.config[:development]
110
+ Spaceship.certificate.mac_development_push
111
+ else
112
+ Spaceship.certificate.mac_production_push
113
+ end
114
+ else
115
+ UI.user_error!("Unsupported platform '#{platform}'. Supported platforms for development and production certificates are 'ios' & 'macos'")
116
+ end
117
+
95
118
  end
96
119
  end
97
120
 
@@ -1,5 +1,6 @@
1
1
  require 'fastlane_core/configuration/config_item'
2
2
  require 'credentials_manager/appfile_config'
3
+ require 'fastlane/helper/lane_helper'
3
4
 
4
5
  require_relative 'module'
5
6
 
@@ -10,6 +11,14 @@ module PEM
10
11
  user ||= CredentialsManager::AppfileConfig.try_fetch_value(:apple_id)
11
12
 
12
13
  [
14
+ FastlaneCore::ConfigItem.new(key: :platform,
15
+ description: "Set certificate's platform. Used for creation of production & development certificates. Supported platforms: ios, macos",
16
+ short_option: "-m",
17
+ env_name: "PEM_PLATFORM",
18
+ default_value: "ios",
19
+ verify_block: proc do |value|
20
+ UI.user_error!("The platform can only be ios or macos") unless ['ios', 'macos'].include?(value)
21
+ end),
13
22
  FastlaneCore::ConfigItem.new(key: :development,
14
23
  env_name: "PEM_DEVELOPMENT",
15
24
  description: "Renew the development push certificate instead of the production one",
@@ -38,7 +38,7 @@ module Pilot
38
38
  end
39
39
 
40
40
  transporter = transporter_for_selected_team(options)
41
- result = transporter.upload(package_path: package_path)
41
+ result = transporter.upload(package_path: package_path, asset_path: options[:ipa] || options[:pkg])
42
42
 
43
43
  unless result
44
44
  transporter_errors = transporter.displayable_errors
@@ -226,7 +226,7 @@ module Scan
226
226
  FileUtils.cp(xctestrun_file, output_path)
227
227
  UI.message("Successfully copied xctestrun file: #{output_path}")
228
228
  else
229
- UI.user_error!("Could not find .xctextrun file to copy")
229
+ UI.user_error!("Could not find .xctestrun file to copy")
230
230
  end
231
231
  end
232
232
 
@@ -41,6 +41,9 @@ module Spaceship
41
41
  MAC_APP_DEVELOPMENT = "MAC_APP_DEVELOPMENT"
42
42
  DEVELOPER_ID_KEXT = "DEVELOPER_ID_KEXT"
43
43
  DEVELOPER_ID_APPLICATION = "DEVELOPER_ID_APPLICATION"
44
+
45
+ # As of 2021-11-09, this is only available with Apple ID auth
46
+ DEVELOPER_ID_INSTALLER = "DEVELOPER_ID_INSTALLER"
44
47
  end
45
48
 
46
49
  def self.type
metadata CHANGED
@@ -1,38 +1,38 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.197.0
4
+ version: 2.198.0
5
5
  platform: ruby
6
6
  authors:
7
- - Max Ott
8
- - Danielle Tomlinson
9
- - Jimmy Dee
10
- - Manish Rathi
11
- - Manu Wallner
12
- - Maksym Grebenets
13
7
  - Iulian Onofrei
8
+ - Luka Mirosevic
14
9
  - Felix Krause
15
- - Helmut Januschka
16
- - Jan Piotrowski
10
+ - Manish Rathi
17
11
  - Stefan Natchev
18
- - Luka Mirosevic
19
- - Joshua Liebowitz
12
+ - Jorge Revuelta H
13
+ - Danielle Tomlinson
20
14
  - Fumiya Nakamura
15
+ - Helmut Januschka
16
+ - Maksym Grebenets
17
+ - Andrew McBurney
18
+ - Jimmy Dee
21
19
  - Kohki Miki
20
+ - Josh Holtz
21
+ - Aaron Brager
22
+ - Max Ott
22
23
  - Satoshi Namai
24
+ - Manu Wallner
23
25
  - Jérôme Lacoste
24
- - Daniel Jankowski
25
- - Aaron Brager
26
+ - Jan Piotrowski
26
27
  - Olivier Halligon
27
28
  - Matthew Ellis
28
29
  - Roger Oba
29
- - Andrew McBurney
30
- - Josh Holtz
31
- - Jorge Revuelta H
30
+ - Joshua Liebowitz
31
+ - Daniel Jankowski
32
32
  autorequire:
33
33
  bindir: bin
34
34
  cert_chain: []
35
- date: 2021-10-22 00:00:00.000000000 Z
35
+ date: 2021-11-16 00:00:00.000000000 Z
36
36
  dependencies:
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: xcodeproj
@@ -1654,7 +1654,6 @@ files:
1654
1654
  - spaceship/lib/spaceship/connect_api/client.rb
1655
1655
  - spaceship/lib/spaceship/connect_api/file_uploader.rb
1656
1656
  - spaceship/lib/spaceship/connect_api/model.rb
1657
- - spaceship/lib/spaceship/connect_api/models/.build.rb.swp
1658
1657
  - spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb
1659
1658
  - spaceship/lib/spaceship/connect_api/models/app.rb
1660
1659
  - spaceship/lib/spaceship/connect_api/models/app_category.rb