fastlane 2.96.1 → 2.97.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 +72 -72
- data/deliver/lib/deliver/setup.rb +6 -4
- data/fastlane/lib/fastlane/actions/carthage.rb +12 -2
- data/fastlane/lib/fastlane/actions/docs/create_app_online.md +1 -1
- data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +1 -1
- data/fastlane/lib/fastlane/actions/increment_build_number.rb +10 -13
- data/fastlane/lib/fastlane/actions/say.rb +25 -5
- data/fastlane/lib/fastlane/actions/slack.rb +5 -0
- data/fastlane/lib/fastlane/actions/testfairy.rb +20 -3
- data/fastlane/lib/fastlane/fast_file.rb +3 -6
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/Fastlane.swift +15 -7
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/Matchfile.swift +1 -1
- data/fastlane/swift/Precheckfile.swift +1 -1
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/Screengrabfile.swift +1 -1
- data/fastlane/swift/Snapshotfile.swift +1 -1
- data/fastlane_core/lib/fastlane_core/cert_checker.rb +1 -1
- data/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb +1 -1
- data/spaceship/lib/spaceship/client.rb +0 -8
- data/spaceship/lib/spaceship/portal/ui/select_team.rb +1 -1
- data/spaceship/lib/spaceship/test_flight/client.rb +19 -0
- data/spaceship/lib/spaceship/test_flight/group.rb +6 -0
- data/spaceship/lib/spaceship/test_flight/tester.rb +8 -0
- data/spaceship/lib/spaceship/tunes/tunes_client.rb +4 -4
- metadata +18 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 789d1c33d75287dd610e4e42ef2b5d14840c0fda
|
4
|
+
data.tar.gz: 9046df5851994832385b4cf8ec7c5688a669546a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f615ee64e50c078ec195dbe7ccf0d6cb88ca7cbd936eef9bcda4b971ad4d791a38d6b01a80d750959cf9c1f5218692fedb0fcdfad97dd4c469cb44f44a8aa116
|
7
|
+
data.tar.gz: f81ee001fe680d041bb746a8390a65d512782444b181b62d7386f3173248029b68aa489571f21126356f8cccef8c1d596ccd2f942b5545155257a9a17b4576c7
|
data/README.md
CHANGED
@@ -32,43 +32,55 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
32
32
|
|
33
33
|
<table id='team'>
|
34
34
|
<tr>
|
35
|
-
<td id='
|
36
|
-
<a href='https://github.com/
|
37
|
-
<img src='https://github.com/
|
35
|
+
<td id='olivier-halligon'>
|
36
|
+
<a href='https://github.com/AliSoftware'>
|
37
|
+
<img src='https://github.com/AliSoftware.png?size=140'>
|
38
38
|
</a>
|
39
|
-
<h4 align='center'><a href='https://twitter.com/
|
39
|
+
<h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
|
40
40
|
</td>
|
41
|
-
<td id='
|
42
|
-
<a href='https://github.com/
|
43
|
-
<img src='https://github.com/
|
41
|
+
<td id='jan-piotrowski'>
|
42
|
+
<a href='https://github.com/janpio'>
|
43
|
+
<img src='https://github.com/janpio.png?size=140'>
|
44
44
|
</a>
|
45
|
-
<h4 align='center'><a href='https://twitter.com/
|
45
|
+
<h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
|
46
46
|
</td>
|
47
|
-
<td id='
|
48
|
-
<a href='https://github.com/
|
49
|
-
<img src='https://github.com/
|
47
|
+
<td id='helmut-januschka'>
|
48
|
+
<a href='https://github.com/hjanuschka'>
|
49
|
+
<img src='https://github.com/hjanuschka.png?size=140'>
|
50
50
|
</a>
|
51
|
-
<h4 align='center'><a href='https://twitter.com/
|
51
|
+
<h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
|
52
52
|
</td>
|
53
|
-
<td id='
|
54
|
-
<a href='https://github.com/
|
55
|
-
<img src='https://github.com/
|
53
|
+
<td id='joshua-liebowitz'>
|
54
|
+
<a href='https://github.com/taquitos'>
|
55
|
+
<img src='https://github.com/taquitos.png?size=140'>
|
56
56
|
</a>
|
57
|
-
<h4 align='center'><a href='https://twitter.com/
|
57
|
+
<h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
|
58
58
|
</td>
|
59
|
-
<td id='
|
60
|
-
<a href='https://github.com/
|
61
|
-
<img src='https://github.com/
|
59
|
+
<td id='iulian-onofrei'>
|
60
|
+
<a href='https://github.com/revolter'>
|
61
|
+
<img src='https://github.com/revolter.png?size=140'>
|
62
62
|
</a>
|
63
|
-
<h4 align='center'><a href='https://twitter.com/
|
63
|
+
<h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
|
64
64
|
</td>
|
65
65
|
</tr>
|
66
66
|
<tr>
|
67
|
-
<td id='
|
68
|
-
<a href='https://github.com/
|
69
|
-
<img src='https://github.com/
|
67
|
+
<td id='danielle-tomlinson'>
|
68
|
+
<a href='https://github.com/DanToml'>
|
69
|
+
<img src='https://github.com/DanToml.png?size=140'>
|
70
70
|
</a>
|
71
|
-
<h4 align='center'><a href='https://twitter.com/
|
71
|
+
<h4 align='center'><a href='https://twitter.com/DanToml'>Danielle Tomlinson</a></h4>
|
72
|
+
</td>
|
73
|
+
<td id='luka-mirosevic'>
|
74
|
+
<a href='https://github.com/lmirosevic'>
|
75
|
+
<img src='https://github.com/lmirosevic.png?size=140'>
|
76
|
+
</a>
|
77
|
+
<h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
|
78
|
+
</td>
|
79
|
+
<td id='matthew-ellis'>
|
80
|
+
<a href='https://github.com/matthewellis'>
|
81
|
+
<img src='https://github.com/matthewellis.png?size=140'>
|
82
|
+
</a>
|
83
|
+
<h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
|
72
84
|
</td>
|
73
85
|
<td id='stefan-natchev'>
|
74
86
|
<a href='https://github.com/snatchev'>
|
@@ -82,81 +94,69 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
82
94
|
</a>
|
83
95
|
<h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
|
84
96
|
</td>
|
97
|
+
</tr>
|
98
|
+
<tr>
|
85
99
|
<td id='jorge-revuelta-h'>
|
86
100
|
<a href='https://github.com/minuscorp'>
|
87
101
|
<img src='https://github.com/minuscorp.png?size=140'>
|
88
102
|
</a>
|
89
103
|
<h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
|
90
104
|
</td>
|
91
|
-
<td id='
|
92
|
-
<a href='https://github.com/
|
93
|
-
<img src='https://github.com/
|
94
|
-
</a>
|
95
|
-
<h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
|
96
|
-
</td>
|
97
|
-
</tr>
|
98
|
-
<tr>
|
99
|
-
<td id='kohki-miki'>
|
100
|
-
<a href='https://github.com/giginet'>
|
101
|
-
<img src='https://github.com/giginet.png?size=140'>
|
102
|
-
</a>
|
103
|
-
<h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
|
104
|
-
</td>
|
105
|
-
<td id='helmut-januschka'>
|
106
|
-
<a href='https://github.com/hjanuschka'>
|
107
|
-
<img src='https://github.com/hjanuschka.png?size=140'>
|
108
|
-
</a>
|
109
|
-
<h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
|
110
|
-
</td>
|
111
|
-
<td id='danielle-tomlinson'>
|
112
|
-
<a href='https://github.com/DanToml'>
|
113
|
-
<img src='https://github.com/DanToml.png?size=140'>
|
105
|
+
<td id='josh-holtz'>
|
106
|
+
<a href='https://github.com/joshdholtz'>
|
107
|
+
<img src='https://github.com/joshdholtz.png?size=140'>
|
114
108
|
</a>
|
115
|
-
<h4 align='center'><a href='https://twitter.com/
|
109
|
+
<h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
|
116
110
|
</td>
|
117
|
-
<td id='
|
118
|
-
<a href='https://github.com/
|
119
|
-
<img src='https://github.com/
|
111
|
+
<td id='jérôme-lacoste'>
|
112
|
+
<a href='https://github.com/lacostej'>
|
113
|
+
<img src='https://github.com/lacostej.png?size=140'>
|
120
114
|
</a>
|
121
|
-
<h4 align='center'><a href='https://twitter.com/
|
115
|
+
<h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
|
122
116
|
</td>
|
123
|
-
<td id='
|
124
|
-
<a href='https://github.com/
|
125
|
-
<img src='https://github.com/
|
117
|
+
<td id='maksym-grebenets'>
|
118
|
+
<a href='https://github.com/mgrebenets'>
|
119
|
+
<img src='https://github.com/mgrebenets.png?size=140'>
|
126
120
|
</a>
|
127
|
-
<h4 align='center'><a href='https://twitter.com/
|
121
|
+
<h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
|
128
122
|
</td>
|
129
|
-
</tr>
|
130
|
-
<tr>
|
131
123
|
<td id='felix-krause'>
|
132
124
|
<a href='https://github.com/KrauseFx'>
|
133
125
|
<img src='https://github.com/KrauseFx.png?size=140'>
|
134
126
|
</a>
|
135
127
|
<h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
|
136
128
|
</td>
|
129
|
+
</tr>
|
130
|
+
<tr>
|
131
|
+
<td id='manu-wallner'>
|
132
|
+
<a href='https://github.com/milch'>
|
133
|
+
<img src='https://github.com/milch.png?size=140'>
|
134
|
+
</a>
|
135
|
+
<h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
|
136
|
+
</td>
|
137
|
+
<td id='fumiya-nakamura'>
|
138
|
+
<a href='https://github.com/nafu'>
|
139
|
+
<img src='https://github.com/nafu.png?size=140'>
|
140
|
+
</a>
|
141
|
+
<h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
|
142
|
+
</td>
|
137
143
|
<td id='jimmy-dee'>
|
138
144
|
<a href='https://github.com/jdee'>
|
139
145
|
<img src='https://github.com/jdee.png?size=140'>
|
140
146
|
</a>
|
141
147
|
<h4 align='center'>Jimmy Dee</h4>
|
142
148
|
</td>
|
143
|
-
<td id='
|
144
|
-
<a href='https://github.com/
|
145
|
-
<img src='https://github.com/
|
146
|
-
</a>
|
147
|
-
<h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
|
148
|
-
</td>
|
149
|
-
<td id='luka-mirosevic'>
|
150
|
-
<a href='https://github.com/lmirosevic'>
|
151
|
-
<img src='https://github.com/lmirosevic.png?size=140'>
|
149
|
+
<td id='aaron-brager'>
|
150
|
+
<a href='https://github.com/getaaron'>
|
151
|
+
<img src='https://github.com/getaaron.png?size=140'>
|
152
152
|
</a>
|
153
|
-
<h4 align='center'><a href='https://twitter.com/
|
153
|
+
<h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
|
154
154
|
</td>
|
155
|
-
<td id='
|
156
|
-
<a href='https://github.com/
|
157
|
-
<img src='https://github.com/
|
155
|
+
<td id='kohki-miki'>
|
156
|
+
<a href='https://github.com/giginet'>
|
157
|
+
<img src='https://github.com/giginet.png?size=140'>
|
158
158
|
</a>
|
159
|
-
<h4 align='center'><a href='https://twitter.com/
|
159
|
+
<h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
|
160
160
|
</td>
|
161
161
|
</tr>
|
162
162
|
</table>
|
@@ -24,12 +24,13 @@ module Deliver
|
|
24
24
|
def setup_deliver(file_path, data, deliver_path, options)
|
25
25
|
File.write(file_path, data)
|
26
26
|
|
27
|
+
screenshots_path = options[:screenshots_path] || File.join(deliver_path, 'screenshots')
|
27
28
|
unless options[:skip_screenshots]
|
28
|
-
download_screenshots(
|
29
|
+
download_screenshots(screenshots_path, options)
|
29
30
|
|
30
31
|
# Add a README to the screenshots folder
|
31
|
-
FileUtils.mkdir_p(
|
32
|
-
File.write(File.join(
|
32
|
+
FileUtils.mkdir_p(screenshots_path) # just in case the fetching didn't work
|
33
|
+
File.write(File.join(screenshots_path, 'README.txt'), File.read("#{Deliver::ROOT}/lib/assets/ScreenshotsHelp"))
|
33
34
|
end
|
34
35
|
|
35
36
|
UI.success("Successfully created new Deliverfile at path '#{file_path}'")
|
@@ -39,7 +40,8 @@ module Deliver
|
|
39
40
|
# and screenshots folders
|
40
41
|
def generate_deliver_file(deliver_path, options)
|
41
42
|
v = options[:app].latest_version
|
42
|
-
|
43
|
+
metadata_path = options[:metadata_path] || File.join(deliver_path, 'metadata')
|
44
|
+
generate_metadata_files(v, metadata_path)
|
43
45
|
|
44
46
|
# Generate the final Deliverfile here
|
45
47
|
return File.read(deliverfile_path)
|
@@ -29,6 +29,7 @@ module Fastlane
|
|
29
29
|
cmd << "--project-directory #{params[:project_directory]}" if params[:project_directory]
|
30
30
|
cmd << "--cache-builds" if params[:cache_builds]
|
31
31
|
cmd << "--new-resolver" if params[:new_resolver]
|
32
|
+
cmd << "--log-path #{params[:log_path]}" if params[:log_path]
|
32
33
|
|
33
34
|
Actions.sh(cmd.join(' '))
|
34
35
|
end
|
@@ -42,6 +43,10 @@ module Fastlane
|
|
42
43
|
if command_name != "archive" && params[:output]
|
43
44
|
UI.user_error!("Output option is available only for 'archive' command.")
|
44
45
|
end
|
46
|
+
|
47
|
+
if params[:log_path] && !%w(build bootstrap update).include?(command_name)
|
48
|
+
UI.user_error!("Log path option is available only for 'build', 'bootstrap', and 'update' command.")
|
49
|
+
end
|
45
50
|
end
|
46
51
|
|
47
52
|
def self.description
|
@@ -158,7 +163,11 @@ module Fastlane
|
|
158
163
|
description: "Use new resolver when resolving dependency graph",
|
159
164
|
is_string: false,
|
160
165
|
optional: true,
|
161
|
-
type: Boolean)
|
166
|
+
type: Boolean),
|
167
|
+
FastlaneCore::ConfigItem.new(key: :log_path,
|
168
|
+
env_name: "FL_CARTHAGE_LOG_PATH",
|
169
|
+
description: "Path to the xcode build output",
|
170
|
+
optional: true)
|
162
171
|
]
|
163
172
|
end
|
164
173
|
|
@@ -180,7 +189,8 @@ module Fastlane
|
|
180
189
|
configuration: "Release", # Build configuration to use when building
|
181
190
|
cache_builds: true, # By default Carthage will rebuild a dependency regardless of whether its the same resolved version as before.
|
182
191
|
toolchain: "com.apple.dt.toolchain.Swift_2_3", # Specify the xcodebuild toolchain
|
183
|
-
new_resolver: false
|
192
|
+
new_resolver: false, # Use the new resolver to resolve depdendency graph
|
193
|
+
log_path: "carthage.log" # Path to the xcode build output
|
184
194
|
)'
|
185
195
|
]
|
186
196
|
end
|
@@ -247,7 +247,7 @@ end
|
|
247
247
|
To use the newly generated app in _deliver_, you need to add this line to your `Deliverfile`:
|
248
248
|
|
249
249
|
```ruby-skip-tests
|
250
|
-
apple_id
|
250
|
+
apple_id(ENV['PRODUCE_APPLE_ID'])
|
251
251
|
```
|
252
252
|
|
253
253
|
This will tell _deliver_, which `App ID` to use, since the app is not yet available in the App Store.
|
@@ -684,7 +684,7 @@ Detailed instructions about how to set up _deliver_ and _fastlane_ in `Jenkins`
|
|
684
684
|
|
685
685
|
_deliver_ uses the iTunes Transporter to upload metadata and binaries. In case you are behind a firewall, you can specify a different transporter protocol using
|
686
686
|
|
687
|
-
```
|
687
|
+
```bash
|
688
688
|
DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS="-t DAV" fastlane deliver
|
689
689
|
```
|
690
690
|
|
@@ -30,11 +30,8 @@ module Fastlane
|
|
30
30
|
# https://developer.apple.com/library/ios/qa/qa1827/_index.html
|
31
31
|
# Attention: This is NOT the version number - but the build number
|
32
32
|
|
33
|
-
|
34
|
-
unless
|
35
|
-
agv_enabled = system([command_prefix, 'agvtool what-version', command_suffix].join(' '))
|
36
|
-
raise "Apple Generic Versioning is not enabled." unless agv_enabled
|
37
|
-
end
|
33
|
+
agv_enabled = system([command_prefix, 'agvtool what-version', command_suffix].join(' '))
|
34
|
+
raise "Apple Generic Versioning is not enabled." unless agv_enabled
|
38
35
|
|
39
36
|
command = [
|
40
37
|
command_prefix,
|
@@ -43,16 +40,16 @@ module Fastlane
|
|
43
40
|
command_suffix
|
44
41
|
].join(' ')
|
45
42
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
43
|
+
output = Actions.sh(command)
|
44
|
+
if output.include?('$(SRCROOT)')
|
45
|
+
UI.error('Cannot set build number with plist path containing $(SRCROOT)')
|
46
|
+
UI.error('Please remove $(SRCROOT) in your Xcode target build settings')
|
47
|
+
end
|
50
48
|
|
51
|
-
|
52
|
-
|
49
|
+
# Store the new number in the shared hash
|
50
|
+
build_number = Actions.sh("#{command_prefix} agvtool what-version", log: false).split("\n").last.strip
|
53
51
|
|
54
|
-
|
55
|
-
end
|
52
|
+
return Actions.lane_context[SharedValues::BUILD_NUMBER] = build_number
|
56
53
|
rescue
|
57
54
|
UI.user_error!("Apple Generic Versioning is not enabled in this project.\nBefore being able to increment and read the version number from your Xcode project, you first need to setup your project properly. Please follow the guide at https://developer.apple.com/library/content/qa/qa1827/_index.html")
|
58
55
|
end
|
@@ -2,16 +2,36 @@ module Fastlane
|
|
2
2
|
module Actions
|
3
3
|
class SayAction < Action
|
4
4
|
def self.run(params)
|
5
|
-
text = params
|
6
|
-
text =
|
7
|
-
UI.user_error!("You can't call the `say` action as OneOff") unless text
|
5
|
+
text = params[:text]
|
6
|
+
text = text.join(' ') if text.kind_of?(Array)
|
8
7
|
text = text.tr("'", '"')
|
9
8
|
|
10
|
-
|
9
|
+
if params[:mute]
|
10
|
+
UI.message(text)
|
11
|
+
return text
|
12
|
+
else
|
13
|
+
Actions.sh("say '#{text}'")
|
14
|
+
end
|
11
15
|
end
|
12
16
|
|
13
17
|
def self.description
|
14
|
-
"This action speaks
|
18
|
+
"This action speaks the given text out loud"
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.available_options
|
22
|
+
[
|
23
|
+
FastlaneCore::ConfigItem.new(key: :text,
|
24
|
+
description: 'Text to be spoken out loud (as string or array of strings)',
|
25
|
+
optional: false,
|
26
|
+
is_string: false),
|
27
|
+
FastlaneCore::ConfigItem.new(key: :mute,
|
28
|
+
env_name: "SAY_MUTE",
|
29
|
+
description: 'If say should be muted with text printed out',
|
30
|
+
optional: false,
|
31
|
+
is_string: false,
|
32
|
+
type: Boolean,
|
33
|
+
default_value: false)
|
34
|
+
]
|
15
35
|
end
|
16
36
|
|
17
37
|
def self.is_supported?(platform)
|
@@ -71,6 +71,10 @@ module Fastlane
|
|
71
71
|
env_name: "FL_SLACK_MESSAGE",
|
72
72
|
description: "The message that should be displayed on Slack. This supports the standard Slack markup language",
|
73
73
|
optional: true),
|
74
|
+
FastlaneCore::ConfigItem.new(key: :pretext,
|
75
|
+
env_name: "FL_SLACK_PRETEXT",
|
76
|
+
description: "This is optional text that appears above the message attachment block. This supports the standard Slack markup language",
|
77
|
+
optional: true),
|
74
78
|
FastlaneCore::ConfigItem.new(key: :channel,
|
75
79
|
env_name: "FL_SLACK_CHANNEL",
|
76
80
|
description: "#channel or @username",
|
@@ -185,6 +189,7 @@ module Fastlane
|
|
185
189
|
slack_attachment = {
|
186
190
|
fallback: options[:message],
|
187
191
|
text: options[:message],
|
192
|
+
pretext: options[:pretext],
|
188
193
|
color: color,
|
189
194
|
mrkdwn_in: ["pretext", "text", "fields", "message"],
|
190
195
|
fields: []
|
@@ -75,6 +75,8 @@ module Fastlane
|
|
75
75
|
[key, value]
|
76
76
|
when :ipa
|
77
77
|
[key, value]
|
78
|
+
when :apk
|
79
|
+
[key, value]
|
78
80
|
when :symbols_file
|
79
81
|
[key, value]
|
80
82
|
when :testers_groups
|
@@ -94,9 +96,12 @@ module Fastlane
|
|
94
96
|
end
|
95
97
|
end]
|
96
98
|
|
97
|
-
|
99
|
+
path = params[:ipa] || params[:apk]
|
100
|
+
UI.user_error!("No ipa or apk were given") unless path
|
101
|
+
|
102
|
+
return path if Helper.test?
|
98
103
|
|
99
|
-
response = self.upload_build(params[:upload_url],
|
104
|
+
response = self.upload_build(params[:upload_url], path, client_options)
|
100
105
|
if parse_response(response)
|
101
106
|
UI.success("Build URL: #{Actions.lane_context[SharedValues::TESTFAIRY_BUILD_URL]}")
|
102
107
|
UI.success("Build successfully uploaded to TestFairy.")
|
@@ -144,12 +149,24 @@ module Fastlane
|
|
144
149
|
end),
|
145
150
|
FastlaneCore::ConfigItem.new(key: :ipa,
|
146
151
|
env_name: 'TESTFAIRY_IPA_PATH',
|
147
|
-
description: 'Path to your IPA file for iOS
|
152
|
+
description: 'Path to your IPA file for iOS',
|
148
153
|
default_value: Actions.lane_context[SharedValues::IPA_OUTPUT_PATH],
|
149
154
|
default_value_dynamic: true,
|
155
|
+
optional: true,
|
156
|
+
conflicting_options: [:apk],
|
150
157
|
verify_block: proc do |value|
|
151
158
|
UI.user_error!("Couldn't find ipa file at path '#{value}'") unless File.exist?(value)
|
152
159
|
end),
|
160
|
+
FastlaneCore::ConfigItem.new(key: :apk,
|
161
|
+
env_name: 'TESTFAIRY_APK_PATH',
|
162
|
+
description: 'Path to your APK file for Android',
|
163
|
+
default_value: Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH],
|
164
|
+
default_value_dynamic: true,
|
165
|
+
optional: true,
|
166
|
+
conflicting_options: [:ipa],
|
167
|
+
verify_block: proc do |value|
|
168
|
+
UI.user_error!("Couldn't find apk file at path '#{value}'") unless File.exist?(value)
|
169
|
+
end),
|
153
170
|
# optional
|
154
171
|
FastlaneCore::ConfigItem.new(key: :symbols_file,
|
155
172
|
optional: true,
|
@@ -307,12 +307,9 @@ module Fastlane
|
|
307
307
|
def say(value)
|
308
308
|
# Overwrite this, since there is already a 'say' method defined in the Ruby standard library
|
309
309
|
value ||= yield
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
action_completed('say', status: FastlaneCore::ActionCompletionStatus::SUCCESS)
|
314
|
-
return return_value
|
315
|
-
end
|
310
|
+
|
311
|
+
value = { text: value } if value.kind_of?(String) || value.kind_of?(Array)
|
312
|
+
self.runner.trigger_action_by_name(:say, nil, false, value)
|
316
313
|
end
|
317
314
|
|
318
315
|
def puts(value)
|
@@ -843,7 +843,8 @@ func carthage(command: String = "bootstrap",
|
|
843
843
|
configuration: String? = nil,
|
844
844
|
toolchain: String? = nil,
|
845
845
|
projectDirectory: String? = nil,
|
846
|
-
newResolver: Bool? = nil
|
846
|
+
newResolver: Bool? = nil,
|
847
|
+
logPath: String? = nil) {
|
847
848
|
let command = RubyCommand(commandID: "", methodName: "carthage", className: nil, args: [RubyCommand.Argument(name: "command", value: command),
|
848
849
|
RubyCommand.Argument(name: "dependencies", value: dependencies),
|
849
850
|
RubyCommand.Argument(name: "use_ssh", value: useSsh),
|
@@ -860,7 +861,8 @@ func carthage(command: String = "bootstrap",
|
|
860
861
|
RubyCommand.Argument(name: "configuration", value: configuration),
|
861
862
|
RubyCommand.Argument(name: "toolchain", value: toolchain),
|
862
863
|
RubyCommand.Argument(name: "project_directory", value: projectDirectory),
|
863
|
-
RubyCommand.Argument(name: "new_resolver", value: newResolver)
|
864
|
+
RubyCommand.Argument(name: "new_resolver", value: newResolver),
|
865
|
+
RubyCommand.Argument(name: "log_path", value: logPath)])
|
864
866
|
_ = runner.executeCommand(command)
|
865
867
|
}
|
866
868
|
func cert(development: Bool = false,
|
@@ -2697,8 +2699,10 @@ func s3(ipa: String? = nil,
|
|
2697
2699
|
RubyCommand.Argument(name: "acl", value: acl)])
|
2698
2700
|
_ = runner.executeCommand(command)
|
2699
2701
|
}
|
2700
|
-
func say(
|
2701
|
-
|
2702
|
+
func say(text: String,
|
2703
|
+
mute: Bool = false) {
|
2704
|
+
let command = RubyCommand(commandID: "", methodName: "say", className: nil, args: [RubyCommand.Argument(name: "text", value: text),
|
2705
|
+
RubyCommand.Argument(name: "mute", value: mute)])
|
2702
2706
|
_ = runner.executeCommand(command)
|
2703
2707
|
}
|
2704
2708
|
func scan(workspace: String? = scanfile.workspace,
|
@@ -2992,6 +2996,7 @@ func skipDocs() {
|
|
2992
2996
|
_ = runner.executeCommand(command)
|
2993
2997
|
}
|
2994
2998
|
func slack(message: String? = nil,
|
2999
|
+
pretext: String? = nil,
|
2995
3000
|
channel: String? = nil,
|
2996
3001
|
useWebhookConfiguredUsernameAndIcon: Bool = false,
|
2997
3002
|
slackUrl: String,
|
@@ -3004,6 +3009,7 @@ func slack(message: String? = nil,
|
|
3004
3009
|
failOnError: Bool = true,
|
3005
3010
|
linkNames: Bool = false) {
|
3006
3011
|
let command = RubyCommand(commandID: "", methodName: "slack", className: nil, args: [RubyCommand.Argument(name: "message", value: message),
|
3012
|
+
RubyCommand.Argument(name: "pretext", value: pretext),
|
3007
3013
|
RubyCommand.Argument(name: "channel", value: channel),
|
3008
3014
|
RubyCommand.Argument(name: "use_webhook_configured_username_and_icon", value: useWebhookConfiguredUsernameAndIcon),
|
3009
3015
|
RubyCommand.Argument(name: "slack_url", value: slackUrl),
|
@@ -3350,7 +3356,8 @@ func teamName() {
|
|
3350
3356
|
_ = runner.executeCommand(command)
|
3351
3357
|
}
|
3352
3358
|
func testfairy(apiKey: String,
|
3353
|
-
ipa: String,
|
3359
|
+
ipa: String? = nil,
|
3360
|
+
apk: String? = nil,
|
3354
3361
|
symbolsFile: String? = nil,
|
3355
3362
|
uploadUrl: String = "https://upload.testfairy.com",
|
3356
3363
|
testersGroups: [String] = [],
|
@@ -3361,6 +3368,7 @@ func testfairy(apiKey: String,
|
|
3361
3368
|
options: [String] = []) {
|
3362
3369
|
let command = RubyCommand(commandID: "", methodName: "testfairy", className: nil, args: [RubyCommand.Argument(name: "api_key", value: apiKey),
|
3363
3370
|
RubyCommand.Argument(name: "ipa", value: ipa),
|
3371
|
+
RubyCommand.Argument(name: "apk", value: apk),
|
3364
3372
|
RubyCommand.Argument(name: "symbols_file", value: symbolsFile),
|
3365
3373
|
RubyCommand.Argument(name: "upload_url", value: uploadUrl),
|
3366
3374
|
RubyCommand.Argument(name: "testers_groups", value: testersGroups),
|
@@ -3927,7 +3935,7 @@ func xcov(workspace: String? = nil,
|
|
3927
3935
|
coverallsServiceJobId: String? = nil,
|
3928
3936
|
coverallsRepoToken: String? = nil,
|
3929
3937
|
xcconfig: String? = nil,
|
3930
|
-
ideFoundationPath: String = "/Applications/Xcode.app/Contents/Developer/../Frameworks/IDEFoundation.framework/Versions/A/IDEFoundation",
|
3938
|
+
ideFoundationPath: String = "/Applications/Xcode92/Xcode.app/Contents/Developer/../Frameworks/IDEFoundation.framework/Versions/A/IDEFoundation",
|
3931
3939
|
legacySupport: Bool = false) {
|
3932
3940
|
let command = RubyCommand(commandID: "", methodName: "xcov", className: nil, args: [RubyCommand.Argument(name: "workspace", value: workspace),
|
3933
3941
|
RubyCommand.Argument(name: "project", value: project),
|
@@ -4033,4 +4041,4 @@ let screengrabfile: Screengrabfile = Screengrabfile()
|
|
4033
4041
|
let snapshotfile: Snapshotfile = Snapshotfile()
|
4034
4042
|
// Please don't remove the lines below
|
4035
4043
|
// They are used to detect outdated files
|
4036
|
-
// FastlaneRunnerAPIVersion [0.9.
|
4044
|
+
// FastlaneRunnerAPIVersion [0.9.20]
|
@@ -23,7 +23,7 @@ module FastlaneCore
|
|
23
23
|
def self.installed_identies(in_keychain: nil)
|
24
24
|
install_wwdr_certificate unless wwdr_certificate_installed?
|
25
25
|
|
26
|
-
available = list_available_identities
|
26
|
+
available = list_available_identities(in_keychain: in_keychain)
|
27
27
|
# Match for this text against word boundaries to avoid edge cases around multiples of 10 identities!
|
28
28
|
if /\b0 valid identities found\b/ =~ available
|
29
29
|
UI.error([
|
@@ -90,7 +90,7 @@ module Commander
|
|
90
90
|
raise e
|
91
91
|
else
|
92
92
|
action_completed(@program[:name], status: FastlaneCore::ActionCompletionStatus::INTERRUPTED, exception: e)
|
93
|
-
|
93
|
+
abort("\nCancelled... use --verbose to show the stack trace")
|
94
94
|
end
|
95
95
|
rescue \
|
96
96
|
OptionParser::InvalidOption,
|
@@ -41,8 +41,6 @@ module Spaceship
|
|
41
41
|
|
42
42
|
attr_accessor :provider
|
43
43
|
|
44
|
-
attr_accessor :available_providers
|
45
|
-
|
46
44
|
# legacy support
|
47
45
|
BasicPreferredInfoError = Spaceship::BasicPreferredInfoError
|
48
46
|
InvalidUserCredentialsError = Spaceship::InvalidUserCredentialsError
|
@@ -494,12 +492,6 @@ module Spaceship
|
|
494
492
|
|
495
493
|
provider = body["provider"]
|
496
494
|
self.provider = Spaceship::Provider.new(provider_hash: provider) unless provider.nil?
|
497
|
-
|
498
|
-
available_providers_list = body["availableProviders"].compact
|
499
|
-
|
500
|
-
self.available_providers = available_providers_list.map do |provider_hash|
|
501
|
-
Spaceship::Provider.new(provider_hash: provider_hash)
|
502
|
-
end
|
503
495
|
end
|
504
496
|
end
|
505
497
|
|
@@ -87,7 +87,7 @@ module Spaceship
|
|
87
87
|
teams.each_with_index do |team, i|
|
88
88
|
puts("#{i + 1}) #{team['teamId']} \"#{team['name']}\" (#{team['type']})")
|
89
89
|
end
|
90
|
-
raise "Multiple Teams found; unable to choose, terminal not
|
90
|
+
raise "Multiple Teams found; unable to choose, terminal not interactive!"
|
91
91
|
end
|
92
92
|
|
93
93
|
# User Selection
|
@@ -202,6 +202,17 @@ module Spaceship
|
|
202
202
|
handle_response(response)
|
203
203
|
end
|
204
204
|
|
205
|
+
def remove_testers_from_testflight(app_id: nil, tester_ids: nil)
|
206
|
+
assert_required_params(__method__, binding)
|
207
|
+
url = "providers/#{team_id}/apps/#{app_id}/deleteTesters"
|
208
|
+
response = request(:post) do |req|
|
209
|
+
req.url(url)
|
210
|
+
req.body = tester_ids.map { |i| { "id" => i } }.to_json
|
211
|
+
req.headers['Content-Type'] = 'application/json'
|
212
|
+
end
|
213
|
+
handle_response(response)
|
214
|
+
end
|
215
|
+
|
205
216
|
def search_for_tester_in_app(app_id: nil, text: nil)
|
206
217
|
assert_required_params(__method__, binding)
|
207
218
|
text = CGI.escape(text)
|
@@ -261,6 +272,14 @@ module Spaceship
|
|
261
272
|
handle_response(response)
|
262
273
|
end
|
263
274
|
|
275
|
+
def builds_for_group(app_id: nil, group_id: nil)
|
276
|
+
assert_required_params(__method__, binding)
|
277
|
+
|
278
|
+
url = "providers/#{team_id}/apps/#{app_id}/groups/#{group_id}/builds"
|
279
|
+
response = request(:get, url)
|
280
|
+
handle_response(response)
|
281
|
+
end
|
282
|
+
|
264
283
|
##
|
265
284
|
# @!group AppTestInfo
|
266
285
|
##
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative 'base'
|
2
|
+
require_relative 'build'
|
2
3
|
|
3
4
|
module Spaceship::TestFlight
|
4
5
|
class Group < Base
|
@@ -104,6 +105,11 @@ module Spaceship::TestFlight
|
|
104
105
|
is_active
|
105
106
|
end
|
106
107
|
|
108
|
+
def builds
|
109
|
+
builds = client.builds_for_group(app_id: self.app_id, group_id: self.id)
|
110
|
+
builds.map { |b| Spaceship::TestFlight::Build.new(b) }
|
111
|
+
end
|
112
|
+
|
107
113
|
def self.perform_for_groups_in_app(app: nil, groups: nil, &block)
|
108
114
|
if groups.nil?
|
109
115
|
default_external_group = app.default_external_group
|
@@ -109,6 +109,10 @@ module Spaceship
|
|
109
109
|
return testers_matching_text
|
110
110
|
end
|
111
111
|
|
112
|
+
def self.remove_testers_from_testflight(app_id: nil, tester_ids: nil)
|
113
|
+
client.remove_testers_from_testflight(app_id: app_id, tester_ids: tester_ids)
|
114
|
+
end
|
115
|
+
|
112
116
|
def self.create_app_level_tester(app_id: nil, first_name: nil, last_name: nil, email: nil)
|
113
117
|
client.create_app_level_tester(app_id: app_id,
|
114
118
|
first_name: first_name,
|
@@ -120,6 +124,10 @@ module Spaceship
|
|
120
124
|
client.delete_tester_from_app(app_id: app_id, tester_id: self.tester_id)
|
121
125
|
end
|
122
126
|
|
127
|
+
def remove_from_testflight!(app_id: nil)
|
128
|
+
client.remove_testers_from_testflight(app_id: app_id, tester_ids: [self.tester_id])
|
129
|
+
end
|
130
|
+
|
123
131
|
def resend_invite(app_id: nil)
|
124
132
|
client.resend_invite_to_external_tester(app_id: app_id, tester_id: self.tester_id)
|
125
133
|
end
|
@@ -65,7 +65,7 @@ module Spaceship
|
|
65
65
|
puts("Looking for iTunes Connect Team with name #{t_name}") if Spaceship::Globals.verbose?
|
66
66
|
|
67
67
|
teams.each do |t|
|
68
|
-
t_id = t['contentProvider']['contentProviderId'].to_s if t['contentProvider']['name'].casecmp(t_name
|
68
|
+
t_id = t['contentProvider']['contentProviderId'].to_s if t['contentProvider']['name'].casecmp(t_name).zero?
|
69
69
|
end
|
70
70
|
|
71
71
|
puts("Could not find team with name '#{t_name}', trying to fallback to default team") if t_id.length.zero?
|
@@ -78,7 +78,7 @@ module Spaceship
|
|
78
78
|
|
79
79
|
# actually set the team id here
|
80
80
|
self.team_id = t_id
|
81
|
-
return
|
81
|
+
return self.team_id
|
82
82
|
end
|
83
83
|
|
84
84
|
# user didn't specify a team... #thisiswhywecanthavenicethings
|
@@ -105,7 +105,7 @@ module Spaceship
|
|
105
105
|
unless Spaceship::Client::UserInterface.interactive?
|
106
106
|
puts("Multiple teams found on iTunes Connect, Your Terminal is running in non-interactive mode! Cannot continue from here.")
|
107
107
|
puts("Please check that you set FASTLANE_ITC_TEAM_ID or FASTLANE_ITC_TEAM_NAME to the right value.")
|
108
|
-
raise "Multiple iTunes Connect Teams found; unable to choose, terminal not
|
108
|
+
raise "Multiple iTunes Connect Teams found; unable to choose, terminal not interactive!"
|
109
109
|
end
|
110
110
|
|
111
111
|
selected = ($stdin.gets || '').strip.to_i - 1
|
@@ -113,7 +113,7 @@ module Spaceship
|
|
113
113
|
|
114
114
|
if team_to_use
|
115
115
|
self.team_id = team_to_use['contentProvider']['contentProviderId'].to_s # actually set the team id here
|
116
|
-
|
116
|
+
return self.team_id
|
117
117
|
end
|
118
118
|
end
|
119
119
|
end
|
metadata
CHANGED
@@ -1,33 +1,33 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.97.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Danielle Tomlinson
|
8
|
+
- Joshua Liebowitz
|
8
9
|
- Andrew McBurney
|
9
|
-
-
|
10
|
-
- Matthew Ellis
|
11
|
-
- Helmut Januschka
|
12
|
-
- Olivier Halligon
|
13
|
-
- Luka Mirosevic
|
14
|
-
- Aaron Brager
|
10
|
+
- Manu Wallner
|
15
11
|
- Jérôme Lacoste
|
16
|
-
-
|
12
|
+
- Aaron Brager
|
13
|
+
- Kohki Miki
|
14
|
+
- Felix Krause
|
15
|
+
- Iulian Onofrei
|
17
16
|
- Fumiya Nakamura
|
18
|
-
- Jan Piotrowski
|
19
|
-
- Danielle Tomlinson
|
20
|
-
- Jorge Revuelta H
|
21
17
|
- Maksym Grebenets
|
22
|
-
- Manu Wallner
|
23
|
-
- Iulian Onofrei
|
24
|
-
- Felix Krause
|
25
18
|
- Josh Holtz
|
19
|
+
- Jorge Revuelta H
|
20
|
+
- Matthew Ellis
|
21
|
+
- Jimmy Dee
|
22
|
+
- Luka Mirosevic
|
23
|
+
- Jan Piotrowski
|
26
24
|
- Stefan Natchev
|
25
|
+
- Helmut Januschka
|
26
|
+
- Olivier Halligon
|
27
27
|
autorequire:
|
28
28
|
bindir: bin
|
29
29
|
cert_chain: []
|
30
|
-
date: 2018-
|
30
|
+
date: 2018-06-04 00:00:00.000000000 Z
|
31
31
|
dependencies:
|
32
32
|
- !ruby/object:Gem::Dependency
|
33
33
|
name: slack-notifier
|
@@ -481,7 +481,7 @@ dependencies:
|
|
481
481
|
requirements:
|
482
482
|
- - ">="
|
483
483
|
- !ruby/object:Gem::Version
|
484
|
-
version: 1.1
|
484
|
+
version: 1.2.1
|
485
485
|
- - "<"
|
486
486
|
- !ruby/object:Gem::Version
|
487
487
|
version: 2.0.0
|
@@ -491,7 +491,7 @@ dependencies:
|
|
491
491
|
requirements:
|
492
492
|
- - ">="
|
493
493
|
- !ruby/object:Gem::Version
|
494
|
-
version: 1.1
|
494
|
+
version: 1.2.1
|
495
495
|
- - "<"
|
496
496
|
- !ruby/object:Gem::Version
|
497
497
|
version: 2.0.0
|