fastlane 2.29.0.beta.20170508010014 → 2.29.0.beta.20170509010055
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +17 -2
- data/deliver/lib/deliver/commands_generator.rb +6 -1
- data/fastlane/README.md +0 -6
- data/fastlane/lib/assets/DefaultFastfileTemplate +2 -2
- data/fastlane/lib/assets/FastfileTemplateAndroid +2 -2
- data/fastlane/lib/fastlane/action_collector.rb +2 -2
- data/fastlane/lib/fastlane/actions/opt_out_usage.rb +3 -3
- data/fastlane/lib/fastlane/setup/setup.rb +2 -2
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane_core/lib/fastlane_core/build_watcher.rb +2 -2
- data/fastlane_core/lib/fastlane_core/tool_collector.rb +125 -20
- data/fastlane_core/lib/fastlane_core/ui/interface.rb +2 -2
- data/fastlane_core/lib/fastlane_core/update_checker/update_checker.rb +179 -39
- data/gym/README.md +1 -1
- data/match/lib/match/git_helper.rb +11 -2
- data/match/lib/match/options.rb +5 -0
- data/match/lib/match/runner.rb +7 -1
- data/pilot/lib/pilot/build_manager.rb +1 -1
- data/spaceship/lib/spaceship/tunes/app_version.rb +18 -2
- metadata +13 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 79dab119b6a1692b4ead44f8386323f44ba9292b
|
4
|
+
data.tar.gz: 2eebf681e83782c3db807673b8cac6f579de91aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d7458977c9e7a5458b2576ffb1ffd2896a4d9c4efb1b3c3ff71d6862fc5cacdb3dcf9c05533878adb84c1abb5d66c473cf672a76d0538ce93832e89f99180b6f
|
7
|
+
data.tar.gz: ed1aed4dcd68414efb92d6a435d5ef64c90a7768b56e57bddbb98f62bbc8d92091d79e85bc5196c2c3de905a8133cdaaf702383c17fec717c9df68e7a51a37cb
|
data/README.md
CHANGED
@@ -12,7 +12,7 @@ fastlane
|
|
12
12
|
|
13
13
|
#### ✨ Check out [docs.fastlane.tools](https://docs.fastlane.tools) on how to get started with fastlane ✨
|
14
14
|
|
15
|
-
`fastlane` is a tool for iOS
|
15
|
+
`fastlane` is a tool for iOS and Android developers to automate tedious tasks like generating screenshots, dealing with provisioning profiles, and releasing your application.
|
16
16
|
|
17
17
|
Use a lane to define your process:
|
18
18
|
|
@@ -34,7 +34,7 @@ Then to deploy a new 'beta' version of your app just run
|
|
34
34
|
|
35
35
|
| | fastlane |
|
36
36
|
|----------|------------|
|
37
|
-
:sparkles: | Connect iOS
|
37
|
+
:sparkles: | Connect iOS and Android build tools into one workflow (both _fastlane_ tools and third party tools)
|
38
38
|
:monorail: | Define different `deployment lanes` for App Store deployment, beta builds, or testing
|
39
39
|
:ship: | Deploy from any computer, including a CI server
|
40
40
|
:wrench: | Extend and customise functionality
|
@@ -139,6 +139,21 @@ In addition to `fastlane`'s commands, you also have access to these `fastlane` t
|
|
139
139
|
- [`match`](https://github.com/fastlane/fastlane/tree/master/match): Easily sync your certificates and profiles across your team using Git
|
140
140
|
- [`scan`](https://github.com/fastlane/fastlane/tree/master/scan): The easiest way to run tests for your iOS and Mac apps
|
141
141
|
|
142
|
+
## Metrics
|
143
|
+
|
144
|
+
_fastlane_ tracks a few key metrics to understand how developers are using the tool and to help us know what areas need improvement. No personal/sensitive information is ever collected. Metrics that are collected include:
|
145
|
+
|
146
|
+
* The number of successes, errors, and crashes for _fastlane_ and each action run in a Fastfile
|
147
|
+
* The running time of _fastlane_
|
148
|
+
* The method by which _fastlane_ was installed
|
149
|
+
* Whether _fastlane_ is being run on CI
|
150
|
+
* The platform (e.g. iOS, Android) for which _fastlane_ is run
|
151
|
+
* A hash of the app identifier or package name, which helps us anonymously identify unique usage of _fastlane_
|
152
|
+
|
153
|
+
We have recently changed the destination service to which these metrics are reported, as well as the format of the data, but the data that is collected has not changed.
|
154
|
+
|
155
|
+
You can easily opt-out of metrics collection by adding `opt_out_usage` at the top of your `Fastfile` or by setting the environment variable `FASTLANE_OPT_OUT_USAGE`. Participating helps us provide the best possible support for _fastlane_, so we hope you'll consider it a plus! :heavy_plus_sign:
|
156
|
+
|
142
157
|
## Need Help?
|
143
158
|
|
144
159
|
Please [submit an issue](https://github.com/fastlane/fastlane/issues) on GitHub and provide information about your setup.
|
@@ -28,6 +28,7 @@ module Deliver
|
|
28
28
|
return available_options
|
29
29
|
end
|
30
30
|
|
31
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
31
32
|
def run
|
32
33
|
program :name, 'deliver'
|
33
34
|
program :version, Fastlane::VERSION
|
@@ -50,7 +51,10 @@ module Deliver
|
|
50
51
|
c.action do |args, options|
|
51
52
|
options = FastlaneCore::Configuration.create(deliverfile_options, options.__hash__)
|
52
53
|
loaded = options.load_configuration_file("Deliverfile")
|
53
|
-
|
54
|
+
|
55
|
+
# Check if we already have a deliver setup in the current directory
|
56
|
+
loaded = true if options[:description] || options[:ipa] || options[:pkg]
|
57
|
+
loaded = true if File.exist?(File.join(FastlaneCore::FastlaneFolder.path || ".", "metadata"))
|
54
58
|
unless loaded
|
55
59
|
if UI.confirm("No deliver configuration found in the current directory. Do you want to setup deliver?")
|
56
60
|
require 'deliver/setup'
|
@@ -163,5 +167,6 @@ module Deliver
|
|
163
167
|
|
164
168
|
run!
|
165
169
|
end
|
170
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
166
171
|
end
|
167
172
|
end
|
data/fastlane/README.md
CHANGED
@@ -184,12 +184,6 @@ See how [Wikipedia](https://github.com/fastlane/examples#wikipedia-by-wikimedia-
|
|
184
184
|
- [`gym`](https://github.com/fastlane/fastlane/tree/master/gym): Building your iOS apps has never been easier
|
185
185
|
- [`match`](https://github.com/fastlane/fastlane/tree/master/match): Easily sync your certificates and profiles across your team using git
|
186
186
|
|
187
|
-
## Statistics
|
188
|
-
|
189
|
-
`fastlane` tracks the number of errors for each action to detect integration issues. The data will be sent to [fastlane-enhancer](https://github.com/fastlane/enhancer).
|
190
|
-
|
191
|
-
You can easily opt-out by adding `opt_out_usage` to your `Fastfile` or by setting the environment variable `FASTLANE_OPT_OUT_USAGE`. To also disable update checks, set the `FASTLANE_SKIP_UPDATE_CHECK` variable.
|
192
|
-
|
193
187
|
## Credentials
|
194
188
|
A detailed description about how `fastlane` stores your credentials is available on a [separate repo](https://github.com/fastlane/fastlane/tree/master/credentials_manager).
|
195
189
|
|
@@ -69,5 +69,5 @@ end
|
|
69
69
|
# More information about multiple platforms in fastlane: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Platforms.md
|
70
70
|
# All available actions: https://docs.fastlane.tools/actions
|
71
71
|
|
72
|
-
# fastlane reports which actions are used
|
73
|
-
#
|
72
|
+
# fastlane reports which actions are used. No personal data is recorded.
|
73
|
+
# Learn more at https://github.com/fastlane/fastlane#metrics
|
@@ -62,5 +62,5 @@ end
|
|
62
62
|
# More information about multiple platforms in fastlane: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Platforms.md
|
63
63
|
# All available actions: https://docs.fastlane.tools/actions
|
64
64
|
|
65
|
-
# fastlane reports which actions are used
|
66
|
-
#
|
65
|
+
# fastlane reports which actions are used. No personal data is recorded.
|
66
|
+
# Learn more at https://github.com/fastlane/fastlane#metrics
|
@@ -19,12 +19,12 @@ module Fastlane
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def show_message
|
22
|
-
UI.message("Sending Crash/Success information.
|
22
|
+
UI.message("Sending Crash/Success information. Learn more at https://github.com/fastlane/fastlane#metrics")
|
23
23
|
UI.message("No personal/sensitive data is sent. Only sharing the following:")
|
24
24
|
UI.message(launches)
|
25
25
|
UI.message(@error) if @error
|
26
26
|
UI.message("This information is used to fix failing actions and improve integrations that are often used.")
|
27
|
-
UI.message("You can disable this by adding `opt_out_usage`
|
27
|
+
UI.message("You can disable this by adding `opt_out_usage` at the top of your Fastfile")
|
28
28
|
end
|
29
29
|
|
30
30
|
def determine_version(name)
|
@@ -13,9 +13,9 @@ module Fastlane
|
|
13
13
|
def self.details
|
14
14
|
[
|
15
15
|
"By default, fastlane will track what actions are being used",
|
16
|
-
"No personal information is
|
17
|
-
"https://github.com/fastlane/
|
18
|
-
"Add `opt_out_usage` at the top of your Fastfile"
|
16
|
+
"No personal/sensitive information is recorded.",
|
17
|
+
"Learn more at https://github.com/fastlane/fastlane#metrics",
|
18
|
+
"Add `opt_out_usage` at the top of your Fastfile to disable metrics collection"
|
19
19
|
].join(' ')
|
20
20
|
end
|
21
21
|
|
@@ -47,9 +47,9 @@ module Fastlane
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def show_analytics
|
50
|
-
UI.message("fastlane will
|
51
|
-
UI.message("https://github.com/fastlane/enhancer to detect integration issues")
|
50
|
+
UI.message("fastlane will collect the number of errors for each action to detect integration issues")
|
52
51
|
UI.message("No sensitive/private information will be uploaded")
|
52
|
+
UI.message("Learn more at https://github.com/fastlane/fastlane#metrics")
|
53
53
|
end
|
54
54
|
end
|
55
55
|
end
|
@@ -2,7 +2,7 @@ module FastlaneCore
|
|
2
2
|
class BuildWatcher
|
3
3
|
class << self
|
4
4
|
# @return The build we waited for. This method will always return a build
|
5
|
-
def wait_for_build_processing_to_be_complete(app_id: nil, platform: nil)
|
5
|
+
def wait_for_build_processing_to_be_complete(app_id: nil, platform: nil, poll_interval: 10)
|
6
6
|
# First, find the train and build version we want to watch for
|
7
7
|
watched_build = watching_build(app_id: app_id, platform: platform)
|
8
8
|
UI.crash!("Could not find a build for app: #{app_id} on platform: #{platform}") if watched_build.nil?
|
@@ -16,7 +16,7 @@ module FastlaneCore
|
|
16
16
|
return matched_build
|
17
17
|
end
|
18
18
|
|
19
|
-
sleep
|
19
|
+
sleep poll_interval
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module FastlaneCore
|
2
2
|
class ToolCollector
|
3
|
-
|
3
|
+
# Learn more at https://github.com/fastlane/fastlane#metrics
|
4
4
|
|
5
5
|
# This is the original error reporting mechanism, which has always represented
|
6
6
|
# either controlled (UI.user_error!), or uncontrolled (UI.crash!, anything else)
|
@@ -61,41 +61,72 @@ module FastlaneCore
|
|
61
61
|
show_message
|
62
62
|
end
|
63
63
|
|
64
|
-
# `fastfile_id` helps us track success/failure metrics for Fastfiles we
|
65
|
-
# generate as part of an automated process.
|
66
64
|
require 'excon'
|
67
|
-
url =
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
fastfile_id: ENV["GENERATED_FASTFILE_ID"] || ""
|
74
|
-
)
|
75
|
-
|
76
|
-
if Helper.is_test? # don't send test data
|
77
|
-
return url
|
78
|
-
else
|
65
|
+
url = ENV["FASTLANE_METRICS_URL"] || "https://fastlane-metrics.fabric.io/public"
|
66
|
+
|
67
|
+
analytic_event_body = create_analytic_event_body
|
68
|
+
|
69
|
+
# Never generate web requests during tests
|
70
|
+
unless Helper.test?
|
79
71
|
fork do
|
80
72
|
begin
|
81
|
-
Excon.post(url
|
73
|
+
Excon.post(url,
|
74
|
+
body: analytic_event_body,
|
75
|
+
headers: { "Content-Type" => 'application/json' })
|
82
76
|
rescue
|
83
77
|
# we don't want to show a stack trace if something goes wrong
|
84
78
|
end
|
85
79
|
end
|
86
|
-
return true
|
87
80
|
end
|
81
|
+
|
82
|
+
return true
|
88
83
|
rescue
|
89
84
|
# We don't care about connection errors
|
90
85
|
end
|
91
86
|
|
87
|
+
def create_analytic_event_body
|
88
|
+
analytics = []
|
89
|
+
timestamp_seconds = Time.now.to_i
|
90
|
+
|
91
|
+
# `fastfile_id` helps us track success/failure metrics for Fastfiles we
|
92
|
+
# generate as part of an automated process.
|
93
|
+
fastfile_id = ENV["GENERATED_FASTFILE_ID"]
|
94
|
+
|
95
|
+
if fastfile_id && launches.size == 1 && launches['fastlane']
|
96
|
+
if crash
|
97
|
+
completion_status = 'crash'
|
98
|
+
elsif error
|
99
|
+
completion_status = 'error'
|
100
|
+
else
|
101
|
+
completion_status = 'success'
|
102
|
+
end
|
103
|
+
analytics << event_for_web_onboarding(fastfile_id, completion_status, timestamp_seconds)
|
104
|
+
end
|
105
|
+
|
106
|
+
launches.each do |action, count|
|
107
|
+
action_version = versions[action] || 'unknown'
|
108
|
+
if crash && error == action
|
109
|
+
action_completion_status = 'crash'
|
110
|
+
elsif action == error
|
111
|
+
action_completion_status = 'error'
|
112
|
+
else
|
113
|
+
action_completion_status = 'success'
|
114
|
+
end
|
115
|
+
analytics << event_for_completion(action, action_completion_status, action_version, timestamp_seconds)
|
116
|
+
analytics << event_for_count(action, count, action_version, timestamp_seconds)
|
117
|
+
end
|
118
|
+
|
119
|
+
{ analytics: analytics }.to_json
|
120
|
+
end
|
121
|
+
|
92
122
|
def show_message
|
93
|
-
UI.message("Sending Crash/Success information
|
123
|
+
UI.message("Sending Crash/Success information")
|
124
|
+
UI.message("Learn more at https://github.com/fastlane/fastlane#metrics")
|
94
125
|
UI.message("No personal/sensitive data is sent. Only sharing the following:")
|
95
126
|
UI.message(launches)
|
96
127
|
UI.message(@error) if @error
|
97
128
|
UI.message("This information is used to fix failing tools and improve those that are most often used.")
|
98
|
-
UI.message("You can disable this by
|
129
|
+
UI.message("You can disable this by adding `opt_out_usage` at the top of your Fastfile")
|
99
130
|
end
|
100
131
|
|
101
132
|
def launches
|
@@ -121,7 +152,7 @@ module FastlaneCore
|
|
121
152
|
end
|
122
153
|
|
123
154
|
# Returns nil if we shouldn't track this action
|
124
|
-
# Returns a (maybe modified) name that should be sent to the
|
155
|
+
# Returns a (maybe modified) name that should be sent to the analytic ingester
|
125
156
|
# Modificiation is used to prefix the action name with the name of the plugin
|
126
157
|
def name_to_track(name)
|
127
158
|
return nil unless is_official?(name)
|
@@ -182,5 +213,79 @@ module FastlaneCore
|
|
182
213
|
|
183
214
|
return nil
|
184
215
|
end
|
216
|
+
|
217
|
+
def event_for_web_onboarding(fastfile_id, completion_status, timestamp_seconds)
|
218
|
+
{
|
219
|
+
event_source: {
|
220
|
+
oauth_app_name: 'fastlane-enhancer',
|
221
|
+
product: 'fastlane_web_onboarding'
|
222
|
+
},
|
223
|
+
actor: {
|
224
|
+
name: 'customer',
|
225
|
+
detail: fastfile_id
|
226
|
+
},
|
227
|
+
action: {
|
228
|
+
name: 'fastfile_executed'
|
229
|
+
},
|
230
|
+
primary_target: {
|
231
|
+
name: 'fastlane_completion_status',
|
232
|
+
detail: completion_status
|
233
|
+
},
|
234
|
+
millis_since_epoch: timestamp_seconds * 1000,
|
235
|
+
version: 1
|
236
|
+
}
|
237
|
+
end
|
238
|
+
|
239
|
+
def event_for_completion(action, completion_status, version, timestamp_seconds)
|
240
|
+
{
|
241
|
+
event_source: {
|
242
|
+
oauth_app_name: 'fastlane-enhancer',
|
243
|
+
product: 'fastlane'
|
244
|
+
},
|
245
|
+
actor: {
|
246
|
+
name: 'action',
|
247
|
+
detail: action
|
248
|
+
},
|
249
|
+
action: {
|
250
|
+
name: 'execution_completed'
|
251
|
+
},
|
252
|
+
primary_target: {
|
253
|
+
name: 'completion_status',
|
254
|
+
detail: completion_status
|
255
|
+
},
|
256
|
+
secondary_target: {
|
257
|
+
name: 'version',
|
258
|
+
detail: version
|
259
|
+
},
|
260
|
+
millis_since_epoch: timestamp_seconds * 1000,
|
261
|
+
version: 1
|
262
|
+
}
|
263
|
+
end
|
264
|
+
|
265
|
+
def event_for_count(action, count, version, timestamp_seconds)
|
266
|
+
{
|
267
|
+
event_source: {
|
268
|
+
oauth_app_name: 'fastlane-enhancer',
|
269
|
+
product: 'fastlane'
|
270
|
+
},
|
271
|
+
actor: {
|
272
|
+
name: 'action',
|
273
|
+
detail: action
|
274
|
+
},
|
275
|
+
action: {
|
276
|
+
name: 'execution_counted'
|
277
|
+
},
|
278
|
+
primary_target: {
|
279
|
+
name: 'count',
|
280
|
+
detail: count.to_s || "1"
|
281
|
+
},
|
282
|
+
secondary_target: {
|
283
|
+
name: 'version',
|
284
|
+
detail: version
|
285
|
+
},
|
286
|
+
millis_since_epoch: timestamp_seconds * 1000,
|
287
|
+
version: 1
|
288
|
+
}
|
289
|
+
end
|
185
290
|
end
|
186
291
|
end
|
@@ -153,8 +153,8 @@ module FastlaneCore
|
|
153
153
|
# Use this method to exit the program because of a test failure
|
154
154
|
# that's caused by the source code of the user. Example for this
|
155
155
|
# is that scan will fail when the tests fail.
|
156
|
-
# By using this method we'll
|
157
|
-
# fastlane failures
|
156
|
+
# By using this method we'll have more accurate results about
|
157
|
+
# fastlane failures
|
158
158
|
def test_failure!(error_message)
|
159
159
|
raise FastlaneTestFailure.new, error_message
|
160
160
|
end
|
@@ -6,20 +6,25 @@ require 'fastlane_core/update_checker/changelog'
|
|
6
6
|
module FastlaneCore
|
7
7
|
# Verifies, the user runs the latest version of this gem
|
8
8
|
class UpdateChecker
|
9
|
-
# This web service is fully open source: https://github.com/fastlane/refresher
|
10
|
-
UPDATE_URL = "https://refresher.fastlane.tools/"
|
11
|
-
|
12
9
|
def self.start_looking_for_update(gem_name)
|
13
10
|
return if Helper.is_test?
|
14
11
|
return if FastlaneCore::Env.truthy?("FASTLANE_SKIP_UPDATE_CHECK")
|
15
12
|
|
16
13
|
@start_time = Time.now
|
17
14
|
|
18
|
-
url = generate_fetch_url(gem_name)
|
19
15
|
Thread.new do
|
20
16
|
begin
|
21
|
-
|
17
|
+
send_launch_analytic_events_for(gem_name)
|
18
|
+
rescue
|
19
|
+
# we don't want to show a stack trace if something goes wrong
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
Thread.new do
|
24
|
+
begin
|
25
|
+
server_results[gem_name] = fetch_latest(gem_name)
|
22
26
|
rescue
|
27
|
+
# we don't want to show a stack trace if something goes wrong
|
23
28
|
end
|
24
29
|
end
|
25
30
|
end
|
@@ -28,6 +33,10 @@ module FastlaneCore
|
|
28
33
|
@results ||= {}
|
29
34
|
end
|
30
35
|
|
36
|
+
class << self
|
37
|
+
attr_reader :start_time
|
38
|
+
end
|
39
|
+
|
31
40
|
def self.update_available?(gem_name, current_version)
|
32
41
|
latest = server_results[gem_name]
|
33
42
|
return (latest and Gem::Version.new(latest) > Gem::Version.new(current_version))
|
@@ -36,7 +45,7 @@ module FastlaneCore
|
|
36
45
|
def self.show_update_status(gem_name, current_version)
|
37
46
|
fork do
|
38
47
|
begin
|
39
|
-
|
48
|
+
send_completion_events_for(gem_name)
|
40
49
|
rescue
|
41
50
|
# we don't want to show a stack trace if something goes wrong
|
42
51
|
end
|
@@ -102,38 +111,8 @@ module FastlaneCore
|
|
102
111
|
UI.command("gem sources --add https://rubygems.org")
|
103
112
|
end
|
104
113
|
|
105
|
-
|
106
|
-
|
107
|
-
url = UPDATE_URL + gem_name
|
108
|
-
params = {}
|
109
|
-
params["ci"] = "1" if Helper.is_ci?
|
110
|
-
|
111
|
-
project_hash = p_hash(ARGV, gem_name)
|
112
|
-
params["p_hash"] = project_hash if project_hash
|
113
|
-
params["platform"] = @platform if @platform # this has to be called after `p_hash`
|
114
|
-
|
115
|
-
url += "?" + URI.encode_www_form(params) if params.count > 0
|
116
|
-
return url
|
117
|
-
end
|
118
|
-
|
119
|
-
def self.fetch_latest(url)
|
120
|
-
JSON.parse(Excon.post(url).body).fetch("version", nil)
|
121
|
-
end
|
122
|
-
|
123
|
-
def self.finished_running(gem_name)
|
124
|
-
return if ENV["FASTLANE_OPT_OUT_USAGE"]
|
125
|
-
|
126
|
-
time = (Time.now - @start_time).to_i
|
127
|
-
url = UPDATE_URL + "time/#{gem_name}"
|
128
|
-
url += "?time=#{time}"
|
129
|
-
url += "&ci=1" if Helper.ci?
|
130
|
-
url += "&gem=1" if Helper.rubygems?
|
131
|
-
url += "&bundler=1" if Helper.bundler?
|
132
|
-
url += "&mac_app=1" if Helper.mac_app?
|
133
|
-
url += "&standalone=1" if Helper.contained_fastlane?
|
134
|
-
url += "&homebrew=1" if Helper.homebrew?
|
135
|
-
|
136
|
-
Excon.post(url)
|
114
|
+
def self.fetch_latest(gem_name)
|
115
|
+
JSON.parse(Excon.get("https://rubygems.org/api/v1/gems/#{gem_name}.json").body)["version"]
|
137
116
|
end
|
138
117
|
|
139
118
|
# (optional) Returns the app identifier for the current tool
|
@@ -187,7 +166,7 @@ module FastlaneCore
|
|
187
166
|
end
|
188
167
|
|
189
168
|
# To not count the same projects multiple time for the number of launches
|
190
|
-
#
|
169
|
+
# Learn more at https://github.com/fastlane/fastlane#metrics
|
191
170
|
# Use the `FASTLANE_OPT_OUT_USAGE` variable to opt out
|
192
171
|
# The resulting value is e.g. ce12f8371df11ef6097a83bdf2303e4357d6f5040acc4f76019489fa5deeae0d
|
193
172
|
def self.p_hash(args, gem_name)
|
@@ -212,5 +191,166 @@ module FastlaneCore
|
|
212
191
|
rescue
|
213
192
|
return nil
|
214
193
|
end
|
194
|
+
|
195
|
+
def self.send_launch_analytic_events_for(gem_name)
|
196
|
+
return if FastlaneCore::Env.truthy?("FASTLANE_OPT_OUT_USAGE")
|
197
|
+
|
198
|
+
ci = Helper.is_ci?.to_s
|
199
|
+
project_hash = p_hash(ARGV, gem_name)
|
200
|
+
p_hash = project_hash if project_hash
|
201
|
+
platform = @platform if @platform # this has to be called after `p_hash`
|
202
|
+
|
203
|
+
send_launch_analytic_events(p_hash, gem_name, platform, ci)
|
204
|
+
end
|
205
|
+
|
206
|
+
def self.send_launch_analytic_events(p_hash, tool, platform, ci)
|
207
|
+
timestamp_seconds = Time.now.to_i
|
208
|
+
|
209
|
+
analytics = []
|
210
|
+
analytics << event_for_p_hash(p_hash, tool, platform, timestamp_seconds) if p_hash
|
211
|
+
analytics << event_for_launch(tool, ci, timestamp_seconds)
|
212
|
+
|
213
|
+
send_events(analytics)
|
214
|
+
end
|
215
|
+
|
216
|
+
def self.event_for_p_hash(p_hash, tool, platform, timestamp_seconds)
|
217
|
+
{
|
218
|
+
event_source: {
|
219
|
+
oauth_app_name: 'fastlane-refresher',
|
220
|
+
product: 'fastlane'
|
221
|
+
},
|
222
|
+
actor: {
|
223
|
+
name: 'project',
|
224
|
+
detail: p_hash
|
225
|
+
},
|
226
|
+
action: {
|
227
|
+
name: 'update_checked'
|
228
|
+
},
|
229
|
+
primary_target: {
|
230
|
+
name: 'tool',
|
231
|
+
detail: tool || 'unknown'
|
232
|
+
},
|
233
|
+
secondary_target: {
|
234
|
+
name: 'platform',
|
235
|
+
detail: platform || 'unknown'
|
236
|
+
},
|
237
|
+
millis_since_epoch: timestamp_seconds * 1000,
|
238
|
+
version: 1
|
239
|
+
}
|
240
|
+
end
|
241
|
+
|
242
|
+
def self.event_for_launch(tool, ci, timestamp_seconds)
|
243
|
+
{
|
244
|
+
event_source: {
|
245
|
+
oauth_app_name: 'fastlane-refresher',
|
246
|
+
product: 'fastlane'
|
247
|
+
},
|
248
|
+
actor: {
|
249
|
+
name: 'tool',
|
250
|
+
detail: tool || 'unknown'
|
251
|
+
},
|
252
|
+
action: {
|
253
|
+
name: 'launched'
|
254
|
+
},
|
255
|
+
primary_target: {
|
256
|
+
name: 'ci',
|
257
|
+
detail: ci
|
258
|
+
},
|
259
|
+
millis_since_epoch: timestamp_seconds * 1000,
|
260
|
+
version: 1
|
261
|
+
}
|
262
|
+
end
|
263
|
+
|
264
|
+
def self.send_completion_events_for(gem_name)
|
265
|
+
return if FastlaneCore::Env.truthy?("FASTLANE_OPT_OUT_USAGE")
|
266
|
+
|
267
|
+
ci = Helper.is_ci?.to_s
|
268
|
+
install_method = if Helper.rubygems?
|
269
|
+
'gem'
|
270
|
+
elsif Helper.bundler?
|
271
|
+
'bundler'
|
272
|
+
elsif Helper.mac_app?
|
273
|
+
'mac_app'
|
274
|
+
elsif Helper.contained_fastlane?
|
275
|
+
'standalone'
|
276
|
+
elsif Helper.homebrew?
|
277
|
+
'homebrew'
|
278
|
+
else
|
279
|
+
'unknown'
|
280
|
+
end
|
281
|
+
duration = (Time.now - start_time).to_i
|
282
|
+
timestamp_seconds = Time.now.to_i
|
283
|
+
|
284
|
+
send_completion_events(gem_name, ci, install_method, duration, timestamp_seconds)
|
285
|
+
end
|
286
|
+
|
287
|
+
def self.send_events(analytics)
|
288
|
+
analytic_event_body = { analytics: analytics }.to_json
|
289
|
+
|
290
|
+
url = ENV["FASTLANE_METRICS_URL"] || "https://fastlane-metrics.fabric.io/public"
|
291
|
+
Excon.post(url,
|
292
|
+
body: analytic_event_body,
|
293
|
+
headers: { "Content-Type" => 'application/json' })
|
294
|
+
end
|
295
|
+
|
296
|
+
def self.event_for_completion(tool, ci, duration, timestamp_seconds)
|
297
|
+
{
|
298
|
+
event_source: {
|
299
|
+
oauth_app_name: 'fastlane-refresher',
|
300
|
+
product: 'fastlane'
|
301
|
+
},
|
302
|
+
actor: {
|
303
|
+
name: 'tool',
|
304
|
+
detail: tool || 'unknown'
|
305
|
+
},
|
306
|
+
action: {
|
307
|
+
name: 'completed_with_duration'
|
308
|
+
},
|
309
|
+
primary_target: {
|
310
|
+
name: 'duration',
|
311
|
+
detail: duration.to_s
|
312
|
+
},
|
313
|
+
secondary_target: {
|
314
|
+
name: 'ci',
|
315
|
+
detail: ci
|
316
|
+
},
|
317
|
+
millis_since_epoch: timestamp_seconds * 1000,
|
318
|
+
version: 1
|
319
|
+
}
|
320
|
+
end
|
321
|
+
|
322
|
+
def self.event_for_install_method(tool, ci, install_method, timestamp_seconds)
|
323
|
+
{
|
324
|
+
event_source: {
|
325
|
+
oauth_app_name: 'fastlane-refresher',
|
326
|
+
product: 'fastlane'
|
327
|
+
},
|
328
|
+
actor: {
|
329
|
+
name: 'tool',
|
330
|
+
detail: tool || 'unknown'
|
331
|
+
},
|
332
|
+
action: {
|
333
|
+
name: 'completed_with_install_method'
|
334
|
+
},
|
335
|
+
primary_target: {
|
336
|
+
name: 'install_method',
|
337
|
+
detail: install_method
|
338
|
+
},
|
339
|
+
secondary_target: {
|
340
|
+
name: 'ci',
|
341
|
+
detail: ci
|
342
|
+
},
|
343
|
+
millis_since_epoch: timestamp_seconds * 1000,
|
344
|
+
version: 1
|
345
|
+
}
|
346
|
+
end
|
347
|
+
|
348
|
+
def self.send_completion_events(tool, ci, install_method, duration, timestamp_seconds)
|
349
|
+
analytics = []
|
350
|
+
analytics << event_for_completion(tool, ci, duration, timestamp_seconds)
|
351
|
+
analytics << event_for_install_method(tool, ci, install_method, timestamp_seconds)
|
352
|
+
|
353
|
+
send_events(analytics)
|
354
|
+
end
|
215
355
|
end
|
216
356
|
end
|
data/gym/README.md
CHANGED
@@ -54,7 +54,7 @@ Get in contact with the developer on Twitter: [@FastlaneTools](https://twitter.c
|
|
54
54
|
|
55
55
|
# What's gym?
|
56
56
|
|
57
|
-
`gym` builds and packages iOS
|
57
|
+
`gym` builds and packages iOS apps for you. It takes care of all the heavy lifting and makes it super easy to generate a signed `ipa` or `app` file :muscle:
|
58
58
|
|
59
59
|
`gym` is a replacement for [shenzhen](https://github.com/nomad/shenzhen).
|
60
60
|
|
@@ -1,14 +1,23 @@
|
|
1
1
|
module Match
|
2
2
|
class GitHelper
|
3
|
-
def self.clone(git_url, shallow_clone, manual_password: nil, skip_docs: false, branch: "master", git_full_name: nil, git_user_email: nil)
|
3
|
+
def self.clone(git_url, shallow_clone, manual_password: nil, skip_docs: false, branch: "master", git_full_name: nil, git_user_email: nil, clone_branch_directly: false)
|
4
4
|
return @dir if @dir
|
5
5
|
|
6
6
|
@dir = Dir.mktmpdir
|
7
7
|
|
8
8
|
command = "git clone '#{git_url}' '#{@dir}'"
|
9
|
-
|
9
|
+
if shallow_clone
|
10
|
+
command << " --depth 1 --no-single-branch"
|
11
|
+
elsif clone_branch_directly
|
12
|
+
command += " -b #{branch.shellescape} --single-branch"
|
13
|
+
end
|
10
14
|
|
11
15
|
UI.message "Cloning remote git repo..."
|
16
|
+
|
17
|
+
if branch && !clone_branch_directly
|
18
|
+
UI.message("If cloning the repo takes too long, you can use the `clone_branch_directly` option in match.")
|
19
|
+
end
|
20
|
+
|
12
21
|
begin
|
13
22
|
# GIT_TERMINAL_PROMPT will fail the `git clone` command if user credentials are missing
|
14
23
|
FastlaneCore::CommandExecutor.execute(command: "GIT_TERMINAL_PROMPT=0 #{command}",
|
data/match/lib/match/options.rb
CHANGED
@@ -106,6 +106,11 @@ module Match
|
|
106
106
|
description: "Make a shallow clone of the repository (truncate the history to 1 revision)",
|
107
107
|
is_string: false,
|
108
108
|
default_value: false),
|
109
|
+
FastlaneCore::ConfigItem.new(key: :clone_branch_directly,
|
110
|
+
env_name: "MATCH_CLONE_BRANCH_DIRECTLY",
|
111
|
+
description: "Clone just the branch specified, instead of the whole repo. This requires that the branch already exists. Otherwise the command will fail",
|
112
|
+
is_string: false,
|
113
|
+
default_value: false),
|
109
114
|
FastlaneCore::ConfigItem.new(key: :workspace,
|
110
115
|
description: nil,
|
111
116
|
verify_block: proc do |value|
|
data/match/lib/match/runner.rb
CHANGED
@@ -8,7 +8,13 @@ module Match
|
|
8
8
|
hide_keys: [:workspace],
|
9
9
|
title: "Summary for match #{Fastlane::VERSION}")
|
10
10
|
|
11
|
-
params[:workspace] = GitHelper.clone(params[:git_url],
|
11
|
+
params[:workspace] = GitHelper.clone(params[:git_url],
|
12
|
+
params[:shallow_clone],
|
13
|
+
skip_docs: params[:skip_docs],
|
14
|
+
branch: params[:git_branch],
|
15
|
+
git_full_name: params[:git_full_name],
|
16
|
+
git_user_email: params[:git_user_email],
|
17
|
+
clone_branch_directly: params[:clone_branch_directly])
|
12
18
|
|
13
19
|
unless params[:readonly]
|
14
20
|
self.spaceship = SpaceshipEnsure.new(params[:username])
|
@@ -35,7 +35,7 @@ module Pilot
|
|
35
35
|
end
|
36
36
|
|
37
37
|
UI.message("If you want to skip waiting for the processing to be finished, use the `skip_waiting_for_build_processing` option")
|
38
|
-
latest_build = FastlaneCore::BuildWatcher.wait_for_build_processing_to_be_complete(app_id: app.apple_id, platform: platform)
|
38
|
+
latest_build = FastlaneCore::BuildWatcher.wait_for_build_processing_to_be_complete(app_id: app.apple_id, platform: platform, poll_interval: config[:wait_processing_interval])
|
39
39
|
|
40
40
|
distribute(options, build: latest_build)
|
41
41
|
end
|
@@ -313,9 +313,9 @@ module Spaceship
|
|
313
313
|
|
314
314
|
# Private methods
|
315
315
|
def setup
|
316
|
-
# Properly parse the AppStatus
|
317
316
|
status = raw_data['status']
|
318
317
|
@app_status = Tunes::AppStatus.get_from_string(status)
|
318
|
+
|
319
319
|
setup_large_app_icon
|
320
320
|
setup_watch_app_icon
|
321
321
|
setup_transit_app_file if supports_app_transit?
|
@@ -592,8 +592,24 @@ module Spaceship
|
|
592
592
|
end
|
593
593
|
|
594
594
|
def setup_screenshots
|
595
|
-
|
595
|
+
# Enable Scaling for all screen sizes that don't have at least one screenshot
|
596
|
+
# We automatically disable scaling once we upload at least one screenshot
|
597
|
+
language_details = raw_data_details.each do |current_language|
|
598
|
+
language_details = (current_language["displayFamilies"] || {})["value"]
|
599
|
+
(language_details || []).each do |device_language_details|
|
600
|
+
next if device_language_details["screenshots"].nil?
|
601
|
+
next if device_language_details["screenshots"]["value"].count > 0
|
602
|
+
|
603
|
+
# The current row includes screenshots for all device types
|
604
|
+
# so we need to enable scaling for both iOS and watchOS apps
|
605
|
+
device_language_details["scaled"]["value"] = true if device_language_details["scaled"]
|
606
|
+
device_language_details["messagesScaled"]["value"] = true if device_language_details["messagesScaled"]
|
607
|
+
# we unset `scaled` or `messagesScaled` as soon as we upload a
|
608
|
+
# screenshot for this device/language combination
|
609
|
+
end
|
610
|
+
end
|
596
611
|
|
612
|
+
@screenshots = {}
|
597
613
|
raw_data_details.each do |row|
|
598
614
|
# Now that's one language right here
|
599
615
|
@screenshots[row['language']] = setup_screenshots_for(row) + setup_messages_screenshots_for(row)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.29.0.beta.
|
4
|
+
version: 2.29.0.beta.20170509010055
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
@@ -15,7 +15,7 @@ authors:
|
|
15
15
|
autorequire:
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
|
-
date: 2017-05-
|
18
|
+
date: 2017-05-09 00:00:00.000000000 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: slack-notifier
|
@@ -1357,23 +1357,23 @@ metadata:
|
|
1357
1357
|
post_install_message:
|
1358
1358
|
rdoc_options: []
|
1359
1359
|
require_paths:
|
1360
|
-
- credentials_manager/lib
|
1361
|
-
- pilot/lib
|
1362
|
-
- deliver/lib
|
1363
|
-
- match/lib
|
1364
|
-
- snapshot/lib
|
1365
1360
|
- produce/lib
|
1361
|
+
- gym/lib
|
1366
1362
|
- spaceship/lib
|
1367
|
-
-
|
1368
|
-
- screengrab/lib
|
1363
|
+
- sigh/lib
|
1369
1364
|
- pem/lib
|
1370
|
-
-
|
1371
|
-
-
|
1365
|
+
- match/lib
|
1366
|
+
- cert/lib
|
1367
|
+
- credentials_manager/lib
|
1368
|
+
- screengrab/lib
|
1372
1369
|
- fastlane/lib
|
1373
1370
|
- supply/lib
|
1371
|
+
- snapshot/lib
|
1372
|
+
- pilot/lib
|
1373
|
+
- fastlane_core/lib
|
1374
|
+
- deliver/lib
|
1375
|
+
- frameit/lib
|
1374
1376
|
- scan/lib
|
1375
|
-
- cert/lib
|
1376
|
-
- sigh/lib
|
1377
1377
|
required_ruby_version: !ruby/object:Gem::Requirement
|
1378
1378
|
requirements:
|
1379
1379
|
- - ">="
|