fastlane 2.197.0 → 2.198.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +90 -90
- data/cert/lib/cert/runner.rb +5 -2
- data/deliver/lib/deliver/runner.rb +1 -1
- data/fastlane/lib/fastlane/actions/get_push_certificate.rb +1 -1
- data/fastlane/lib/fastlane/actions/get_version_number.rb +6 -2
- data/fastlane/lib/fastlane/actions/notarize.rb +29 -11
- data/fastlane/lib/fastlane/actions/set_github_release.rb +11 -5
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/DeliverfileProtocol.swift +1 -1
- data/fastlane/swift/Fastlane.swift +23 -7
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/GymfileProtocol.swift +1 -1
- data/fastlane/swift/Matchfile.swift +1 -1
- data/fastlane/swift/MatchfileProtocol.swift +1 -1
- data/fastlane/swift/Precheckfile.swift +1 -1
- data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/ScanfileProtocol.swift +1 -1
- data/fastlane/swift/Screengrabfile.swift +1 -1
- data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
- data/fastlane/swift/Snapshotfile.swift +1 -1
- data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
- data/fastlane/swift/formatting/Brewfile.lock.json +23 -18
- data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +31 -7
- data/match/lib/match/nuke.rb +79 -1
- data/match/lib/match/spaceship_ensure.rb +1 -0
- data/pem/lib/pem/manager.rb +29 -6
- data/pem/lib/pem/options.rb +9 -0
- data/pilot/lib/pilot/build_manager.rb +1 -1
- data/scan/lib/scan/runner.rb +1 -1
- data/spaceship/lib/spaceship/connect_api/models/certificate.rb +3 -0
- metadata +17 -18
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34ffaaedeedaf54aea167114b6be61500026da48a419856dbf15de2453425e90
|
4
|
+
data.tar.gz: 7ab613d2b2c4d94cdc1a49b092af2e15c6f9beb99edbdfa714a2f851704f46cf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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='
|
39
|
-
<a href='https://github.com/
|
40
|
-
<img src='https://github.com/
|
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/
|
42
|
+
<h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
|
43
43
|
</td>
|
44
|
-
<td id='
|
45
|
-
<a href='https://github.com/
|
46
|
-
<img src='https://github.com/
|
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/
|
48
|
+
<h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
|
49
49
|
</td>
|
50
|
-
<td id='
|
51
|
-
<a href='https://github.com/
|
52
|
-
<img src='https://github.com/
|
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/
|
54
|
+
<h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
|
55
55
|
</td>
|
56
|
-
<td id='
|
57
|
-
<a href='https://github.com/
|
58
|
-
<img src='https://github.com/
|
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/
|
60
|
+
<h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
|
61
61
|
</td>
|
62
|
-
<td id='
|
63
|
-
<a href='https://github.com/
|
64
|
-
<img src='https://github.com/
|
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/
|
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='
|
71
|
-
<a href='https://github.com/
|
72
|
-
<img src='https://github.com/
|
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/
|
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='
|
89
|
-
<a href='https://github.com/
|
90
|
-
<img src='https://github.com/
|
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/
|
112
|
+
<h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
|
93
113
|
</td>
|
94
|
-
<td id='
|
95
|
-
<a href='https://github.com/
|
96
|
-
<img src='https://github.com/
|
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/
|
118
|
+
<h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
|
99
119
|
</td>
|
100
|
-
|
101
|
-
<
|
102
|
-
<
|
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/
|
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='
|
121
|
-
<a href='https://github.com/
|
122
|
-
<img src='https://github.com/
|
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/
|
144
|
+
<h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
|
139
145
|
</td>
|
140
|
-
<td id='
|
141
|
-
<a href='https://github.com/
|
142
|
-
<img src='https://github.com/
|
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/
|
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='
|
153
|
-
<a href='https://github.com/
|
154
|
-
<img src='https://github.com/
|
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/
|
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='
|
167
|
-
<a href='https://github.com/
|
168
|
-
<img src='https://github.com/
|
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/
|
170
|
+
<h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
|
171
171
|
</td>
|
172
|
-
<td id='
|
173
|
-
<a href='https://github.com/
|
174
|
-
<img src='https://github.com/
|
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/
|
176
|
+
<h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
|
177
177
|
</td>
|
178
|
-
<td id='
|
179
|
-
<a href='https://github.com/
|
180
|
-
<img src='https://github.com/
|
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/
|
182
|
+
<h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
|
183
183
|
</td>
|
184
|
-
<td id='
|
185
|
-
<a href='https://github.com/
|
186
|
-
<img src='https://github.com/
|
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/
|
188
|
+
<h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
|
189
189
|
</td>
|
190
|
-
<td id='
|
191
|
-
<a href='https://github.com/
|
192
|
-
<img src='https://github.com/
|
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/
|
194
|
+
<h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
|
195
195
|
</td>
|
196
196
|
</tr>
|
197
197
|
</table>
|
data/cert/lib/cert/runner.rb
CHANGED
@@ -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
|
-
|
158
|
-
|
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
|
@@ -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
|
-
|
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,
|
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,
|
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
|
-
|
93
|
-
|
93
|
+
if skip_stapling
|
94
|
+
UI.success("Successfully notarized artifact")
|
95
|
+
else
|
96
|
+
UI.message('Stapling package')
|
94
97
|
|
95
|
-
|
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
|
-
|
191
|
+
if skip_stapling
|
192
|
+
UI.success("Successfully notarized artifact#{log_suffix}")
|
193
|
+
else
|
194
|
+
UI.message('Stapling package')
|
186
195
|
|
187
|
-
|
196
|
+
self.staple(package_path, verbose)
|
188
197
|
|
189
|
-
|
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.
|
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",
|
@@ -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(
|
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?] = [
|
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(
|
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?] = [
|
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.
|
13269
|
+
// FastlaneRunnerAPIVersion [0.9.140]
|
@@ -2,30 +2,35 @@
|
|
2
2
|
"entries": {
|
3
3
|
"brew": {
|
4
4
|
"swiftformat": {
|
5
|
-
"version": "0.48.
|
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:
|
13
|
-
"sha256": "
|
17
|
+
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:74691b21c40d34459c5825306828039bdbdfdd02c80d1cea5c449c3f59760ab1",
|
18
|
+
"sha256": "74691b21c40d34459c5825306828039bdbdfdd02c80d1cea5c449c3f59760ab1"
|
14
19
|
},
|
15
|
-
"
|
20
|
+
"monterey": {
|
16
21
|
"cellar": ":any_skip_relocation",
|
17
|
-
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:
|
18
|
-
"sha256": "
|
22
|
+
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:14e4b90f29b55b06c92f90b6e81e8dd55c54ff258ee8b0bab2bb479ce0cc8daf",
|
23
|
+
"sha256": "14e4b90f29b55b06c92f90b6e81e8dd55c54ff258ee8b0bab2bb479ce0cc8daf"
|
19
24
|
},
|
20
|
-
"
|
25
|
+
"big_sur": {
|
21
26
|
"cellar": ":any_skip_relocation",
|
22
|
-
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:
|
23
|
-
"sha256": "
|
27
|
+
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:73f0497b504f87159bc2d133371014e0372799d89f62bc78068b3b5427ae614f",
|
28
|
+
"sha256": "73f0497b504f87159bc2d133371014e0372799d89f62bc78068b3b5427ae614f"
|
24
29
|
},
|
25
|
-
"
|
30
|
+
"catalina": {
|
26
31
|
"cellar": ":any_skip_relocation",
|
27
|
-
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:
|
28
|
-
"sha256": "
|
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.
|
55
|
-
"HOMEBREW_PREFIX": "/
|
56
|
-
"Homebrew/homebrew-core": "
|
57
|
-
"CLT": "13.
|
58
|
-
"Xcode": "13.
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
data/match/lib/match/nuke.rb
CHANGED
@@ -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
|
|
data/pem/lib/pem/manager.rb
CHANGED
@@ -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
|
-
|
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[:
|
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
|
-
|
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
|
|
data/pem/lib/pem/options.rb
CHANGED
@@ -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
|
data/scan/lib/scan/runner.rb
CHANGED
@@ -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 .
|
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.
|
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
|
-
-
|
16
|
-
- Jan Piotrowski
|
10
|
+
- Manish Rathi
|
17
11
|
- Stefan Natchev
|
18
|
-
-
|
19
|
-
-
|
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
|
-
-
|
25
|
-
- Aaron Brager
|
26
|
+
- Jan Piotrowski
|
26
27
|
- Olivier Halligon
|
27
28
|
- Matthew Ellis
|
28
29
|
- Roger Oba
|
29
|
-
-
|
30
|
-
-
|
31
|
-
- Jorge Revuelta H
|
30
|
+
- Joshua Liebowitz
|
31
|
+
- Daniel Jankowski
|
32
32
|
autorequire:
|
33
33
|
bindir: bin
|
34
34
|
cert_chain: []
|
35
|
-
date: 2021-
|
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
|
Binary file
|