fastlane 1.86.1 → 1.87.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/fastlane/actions/build_and_upload_to_appetize.rb +3 -3
- data/lib/fastlane/actions/crashlytics.rb +1 -2
- data/lib/fastlane/actions/device_grid/README.md +2 -2
- data/lib/fastlane/actions/device_grid/device_grid.rb +6 -2
- data/lib/fastlane/actions/get_github_release.rb +3 -0
- data/lib/fastlane/actions/get_version_number.rb +46 -10
- data/lib/fastlane/actions/jira.rb +89 -0
- data/lib/fastlane/commands_generator.rb +35 -20
- data/lib/fastlane/fastlane_folder.rb +5 -3
- data/lib/fastlane/helper/crashlytics_helper.rb +4 -1
- data/lib/fastlane/lane_manager.rb +1 -1
- data/lib/fastlane/version.rb +1 -1
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a5d72bde2814ab63746e584edd4778f24f155374
|
4
|
+
data.tar.gz: 32e8447fd23c2d17be8661d2ef014d96467f9ae3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05ebe99710027c088db55eb78c211ec65ebded3bc4866946855584d60ad6c5fb1e47d7088caaae3bc5c2e052bf6edfba0ff1dd72c272ab32629534e90e9d6cfb
|
7
|
+
data.tar.gz: 40b65c9bcbce9d7396d32aaf758e071f35dcc8c099310dc035899c2aef3d679370bef641dbb2b3edc88fa257d1793d5727cdbc5c04488e3ab5401b7b5a5652dc
|
@@ -14,10 +14,10 @@ module Fastlane
|
|
14
14
|
app_path = Dir[File.join(tmp_path, "**", "*.app")].last
|
15
15
|
UI.user_error!("Couldn't find app") unless app_path
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
zipped_bundle = Actions::ZipAction.run(path: app_path,
|
18
|
+
output_path: File.join(tmp_path, "Result.zip"))
|
19
19
|
|
20
|
-
Actions::AppetizeAction.run(path:
|
20
|
+
Actions::AppetizeAction.run(path: zipped_bundle,
|
21
21
|
api_token: params[:api_token])
|
22
22
|
|
23
23
|
public_key = Actions.lane_context[SharedValues::APPETIZE_PUBLIC_KEY]
|
@@ -61,11 +61,10 @@ module Fastlane
|
|
61
61
|
def self.available_options
|
62
62
|
platform = Actions.lane_context[Actions::SharedValues::PLATFORM_NAME]
|
63
63
|
|
64
|
-
ipa_path_default = nil
|
65
64
|
if platform == :ios or platform.nil?
|
66
65
|
ipa_path_default = Dir["*.ipa"].last
|
67
66
|
end
|
68
|
-
|
67
|
+
|
69
68
|
if platform == :android
|
70
69
|
apk_path_default = Dir["*.apk"].last || Dir[File.join("app", "build", "outputs", "apk", "app-release.apk")].last
|
71
70
|
end
|
@@ -139,10 +139,10 @@ xcodebuild(
|
|
139
139
|
app_path = Dir[File.join(tmp_path, "**", "*.app")].last
|
140
140
|
UI.user_error!("Couldn't find app") unless app_path
|
141
141
|
|
142
|
-
|
142
|
+
zipped_bundle = zip(path: app_path, output_path: File.join(tmp_path, "Result.zip"))
|
143
143
|
|
144
144
|
appetize(
|
145
|
-
path:
|
145
|
+
path: zipped_bundle,
|
146
146
|
api_token: 'yourapitoken' # get it from https://appetize.io/docs#request-api-token
|
147
147
|
)
|
148
148
|
|
@@ -19,8 +19,12 @@ module Danger
|
|
19
19
|
|
20
20
|
devices ||= %w(iphone4s iphone5s iphone6s iphone6splus ipadair)
|
21
21
|
languages ||= ["en"]
|
22
|
-
|
22
|
+
|
23
23
|
prefix_command ||= ""
|
24
|
+
prefix_command += " bundle exec " if File.exist?("Gemfile")
|
25
|
+
|
26
|
+
# To use the local fastlane intead of bundle
|
27
|
+
prefix_command = "./bin/" if FastlaneCore::Helper.test?
|
24
28
|
|
25
29
|
deep_link_matches = pr_body.match(/:link:\s(.*)/) # :link: emoji
|
26
30
|
deep_link = deep_link_matches[1] if deep_link_matches
|
@@ -42,7 +46,7 @@ module Danger
|
|
42
46
|
}
|
43
47
|
params[:launch_url] = deep_link if deep_link
|
44
48
|
params_str = params.collect { |k, v| "#{k}:\"#{v}\"" }.join(" ")
|
45
|
-
url =
|
49
|
+
url = Fastlane::Helper.backticks("#{prefix_command}fastlane run appetize_viewing_url_generator #{params_str}")
|
46
50
|
url = url.match(%r{Result:.*(https\:\/\/.*)})[1].strip
|
47
51
|
|
48
52
|
markdown("<a href='#{url}'>")
|
@@ -10,6 +10,9 @@ module Fastlane
|
|
10
10
|
require 'excon'
|
11
11
|
require 'base64'
|
12
12
|
|
13
|
+
# To still get the data when a repo has been moved
|
14
|
+
Excon.defaults[:middlewares] << Excon::Middleware::RedirectFollower
|
15
|
+
|
13
16
|
server_url = params[:server_url]
|
14
17
|
server_url = server_url[0..-2] if server_url.end_with? '/'
|
15
18
|
|
@@ -24,29 +24,57 @@ module Fastlane
|
|
24
24
|
|
25
25
|
line = ""
|
26
26
|
scheme = params[:scheme] || ""
|
27
|
+
target = params[:target] || ""
|
27
28
|
results = []
|
28
29
|
|
29
30
|
if Helper.test?
|
30
31
|
results = [
|
31
|
-
'
|
32
|
-
'"SampleProject.xcodeproj/../
|
33
|
-
'"SampleProject.xcodeproj/../
|
34
|
-
'"SampleProject.xcodeproj/../
|
32
|
+
'$(date +%s)n /usr/libexec/Plistbuddy -c "Set CFBundleVersion $buildnum" "${plist}"n',
|
33
|
+
'"SampleProject.xcodeproj/../TargetA/TargetA-Info.plist"=4.3.2',
|
34
|
+
'"SampleProject.xcodeproj/../TargetATests/Info.plist"=4.3.2',
|
35
|
+
'"SampleProject.xcodeproj/../TargetB/TargetB-Info.plist"=5.4.3',
|
36
|
+
'"SampleProject.xcodeproj/../TargetBTests/Info.plist"=5.4.3',
|
37
|
+
'"SampleProject.xcodeproj/../SampleProject/supporting_files/TargetC_internal-Info.plist"=7.5.2',
|
38
|
+
'"SampleProject.xcodeproj/../SampleProject/supporting_files/TargetC_production-Info.plist"=6.4.9',
|
39
|
+
'"SampleProject.xcodeproj/../SampleProject_tests/Info.plist"=1.0'
|
35
40
|
]
|
36
41
|
else
|
37
42
|
results = (Actions.sh command).split("\n")
|
38
43
|
end
|
39
44
|
|
40
|
-
if scheme.empty?
|
41
|
-
|
42
|
-
|
43
|
-
|
45
|
+
if target.empty? && scheme.empty?
|
46
|
+
# Sometimes the results array contains nonsense as the first element
|
47
|
+
# This iteration finds the first 'real' result and returns that
|
48
|
+
# emulating the actual behavior or the -terse1 flag correctly
|
49
|
+
project_string = ".xcodeproj"
|
44
50
|
results.any? do |result|
|
45
|
-
if result.include?
|
51
|
+
if result.include? project_string
|
46
52
|
line = result
|
47
53
|
break
|
48
54
|
end
|
49
55
|
end
|
56
|
+
else
|
57
|
+
# This iteration finds the first folder structure or info plist
|
58
|
+
# matching the specified target
|
59
|
+
scheme_string = "/#{scheme}"
|
60
|
+
target_string = "/#{target}/"
|
61
|
+
plist_target_string = "/#{target}-"
|
62
|
+
results.any? do |result|
|
63
|
+
if !target.empty?
|
64
|
+
if result.include? target_string
|
65
|
+
line = result
|
66
|
+
break
|
67
|
+
elsif result.include? plist_target_string
|
68
|
+
line = result
|
69
|
+
break
|
70
|
+
end
|
71
|
+
else
|
72
|
+
if result.include? scheme_string
|
73
|
+
line = result
|
74
|
+
break
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
50
78
|
end
|
51
79
|
|
52
80
|
version_number = line.partition('=').last
|
@@ -87,7 +115,15 @@ module Fastlane
|
|
87
115
|
end),
|
88
116
|
FastlaneCore::ConfigItem.new(key: :scheme,
|
89
117
|
env_name: "FL_VERSION_NUMBER_SCHEME",
|
90
|
-
description: "Specify a specific scheme if you have multiple per project, optional
|
118
|
+
description: "Specify a specific scheme if you have multiple per project, optional.
|
119
|
+
This parameter is deprecated and will be removed in a future release.
|
120
|
+
Please use the 'target' parameter instead. The behavior of this parameter
|
121
|
+
is currently undefined if your scheme name doesn't match your target name",
|
122
|
+
optional: true,
|
123
|
+
deprecated: true),
|
124
|
+
FastlaneCore::ConfigItem.new(key: :target,
|
125
|
+
env_name: "FL_VERSION_NUMBER_TARGET",
|
126
|
+
description: "Specify a specific target if you have multiple per project, optional",
|
91
127
|
optional: true)
|
92
128
|
]
|
93
129
|
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module Fastlane
|
2
|
+
module Actions
|
3
|
+
class JiraAction < Action
|
4
|
+
|
5
|
+
def self.run(params)
|
6
|
+
Actions.verify_gem!('jira')
|
7
|
+
require 'jira'
|
8
|
+
|
9
|
+
site = params[:url]
|
10
|
+
context_path = ""
|
11
|
+
auth_type = :basic
|
12
|
+
username = params[:username]
|
13
|
+
password = params[:password]
|
14
|
+
ticket_id = params[:ticket_id]
|
15
|
+
comment_text = params[:comment_text]
|
16
|
+
|
17
|
+
options = {
|
18
|
+
site: site,
|
19
|
+
context_path: context_path,
|
20
|
+
auth_type: auth_type,
|
21
|
+
username: username,
|
22
|
+
password: password
|
23
|
+
}
|
24
|
+
|
25
|
+
client = JIRA::Client.new(options)
|
26
|
+
issue = client.Issue.find(ticket_id)
|
27
|
+
comment = issue.comments.build
|
28
|
+
comment.save({ 'body' => comment_text })
|
29
|
+
end
|
30
|
+
|
31
|
+
#####################################################
|
32
|
+
# @!group Documentation
|
33
|
+
#####################################################
|
34
|
+
|
35
|
+
def self.description
|
36
|
+
"Leave a comment on JIRA tickets"
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.available_options
|
40
|
+
[
|
41
|
+
FastlaneCore::ConfigItem.new(key: :url,
|
42
|
+
env_name: "FL_JIRA_SITE",
|
43
|
+
description: "URL for Jira instance",
|
44
|
+
verify_block: proc do |value|
|
45
|
+
UI.user_error!("No url for Jira given, pass using `url: 'url'`") if value.to_s.length == 0
|
46
|
+
end),
|
47
|
+
FastlaneCore::ConfigItem.new(key: :username,
|
48
|
+
env_name: "FL_JIRA_USERNAME",
|
49
|
+
description: "Username for JIRA instance",
|
50
|
+
verify_block: proc do |value|
|
51
|
+
UI.user_error!("No username") if value.to_s.length == 0
|
52
|
+
end),
|
53
|
+
FastlaneCore::ConfigItem.new(key: :password,
|
54
|
+
env_name: "FL_JIRA_PASSWORD",
|
55
|
+
description: "Password for Jira",
|
56
|
+
verify_block: proc do |value|
|
57
|
+
UI.user_error!("No password") if value.to_s.length == 0
|
58
|
+
end),
|
59
|
+
FastlaneCore::ConfigItem.new(key: :ticket_id,
|
60
|
+
env_name: "FL_JIRA_TICKET_ID",
|
61
|
+
description: "Ticket ID for Jira, i.e. IOS-123",
|
62
|
+
verify_block: proc do |value|
|
63
|
+
UI.user_error!("No Ticket specified") if value.to_s.length == 0
|
64
|
+
end),
|
65
|
+
FastlaneCore::ConfigItem.new(key: :comment_text,
|
66
|
+
env_name: "FL_JIRA_COMMENT_TEXT",
|
67
|
+
description: "Text to add to the ticket as a comment",
|
68
|
+
verify_block: proc do |value|
|
69
|
+
UI.user_error!("No comment specified") if value.to_s.length == 0
|
70
|
+
end)
|
71
|
+
]
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.output
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.return_value
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.authors
|
81
|
+
["iAmChrisTruman"]
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.is_supported?(platform)
|
85
|
+
true
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -34,15 +34,12 @@ module Fastlane
|
|
34
34
|
|
35
35
|
command :trigger do |c|
|
36
36
|
c.syntax = 'fastlane [lane]'
|
37
|
-
c.description = '
|
37
|
+
c.description = 'Run a sepcific lane. Pass the lane name and optionally the platform first.'
|
38
38
|
c.option '--env STRING', String, 'Add environment to use with `dotenv`'
|
39
39
|
|
40
40
|
c.action do |args, options|
|
41
|
-
if
|
41
|
+
if ensure_fastfile
|
42
42
|
Fastlane::CommandLineHandler.handle(args, options)
|
43
|
-
else
|
44
|
-
create = agree('Could not find fastlane in current directory. Would you like to set it up? (y/n)'.yellow, true)
|
45
|
-
Fastlane::Setup.new.run if create
|
46
43
|
end
|
47
44
|
end
|
48
45
|
end
|
@@ -73,13 +70,15 @@ module Fastlane
|
|
73
70
|
c.option "-j", "--json", "Output the lanes in JSON instead of text"
|
74
71
|
|
75
72
|
c.action do |args, options|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
73
|
+
if ensure_fastfile
|
74
|
+
require 'fastlane/lane_list'
|
75
|
+
path = File.join(Fastlane::FastlaneFolder.fastfile_path)
|
76
|
+
|
77
|
+
if options.json
|
78
|
+
Fastlane::LaneList.output_json(path)
|
79
|
+
else
|
80
|
+
Fastlane::LaneList.output(path)
|
81
|
+
end
|
83
82
|
end
|
84
83
|
end
|
85
84
|
end
|
@@ -88,12 +87,14 @@ module Fastlane
|
|
88
87
|
c.syntax = 'fastlane list'
|
89
88
|
c.description = 'Lists all available lanes without description'
|
90
89
|
c.action do |args, options|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
90
|
+
if ensure_fastfile
|
91
|
+
ff = Fastlane::FastFile.new(Fastlane::FastlaneFolder.fastfile_path)
|
92
|
+
UI.message "Available lanes:"
|
93
|
+
ff.runner.available_lanes.each do |lane|
|
94
|
+
UI.message "- #{lane}"
|
95
|
+
end
|
96
|
+
UI.important "Execute using `fastlane [lane_name]`"
|
95
97
|
end
|
96
|
-
UI.important "Execute using `fastlane [lane_name]`"
|
97
98
|
end
|
98
99
|
end
|
99
100
|
|
@@ -103,9 +104,11 @@ module Fastlane
|
|
103
104
|
c.option '-f', '--force', 'Overwrite the existing README.md in the ./fastlane folder'
|
104
105
|
|
105
106
|
c.action do |args, options|
|
106
|
-
|
107
|
-
|
108
|
-
|
107
|
+
if ensure_fastfile
|
108
|
+
ff = Fastlane::FastFile.new(File.join(Fastlane::FastlaneFolder.path || '.', 'Fastfile'))
|
109
|
+
UI.message "You don't need to run `fastlane docs` manually any more, this will be done automatically for you."
|
110
|
+
Fastlane::DocsGenerator.run(ff)
|
111
|
+
end
|
109
112
|
end
|
110
113
|
end
|
111
114
|
|
@@ -172,6 +175,18 @@ module Fastlane
|
|
172
175
|
run!
|
173
176
|
end
|
174
177
|
|
178
|
+
# Makes sure a Fastfile is available
|
179
|
+
# Shows an appropriate message to the user
|
180
|
+
# if that's not the case
|
181
|
+
# return true if the Fastfile is available
|
182
|
+
def ensure_fastfile
|
183
|
+
return true if Fastlane::FastlaneFolder.setup?
|
184
|
+
|
185
|
+
create = UI.confirm('Could not find fastlane in current directory. Would you like to set it up?')
|
186
|
+
Fastlane::Setup.new.run if create
|
187
|
+
return false
|
188
|
+
end
|
189
|
+
|
175
190
|
# rubocop:enable Metrics/AbcSize
|
176
191
|
# rubocop:enable Metrics/MethodLength
|
177
192
|
end
|
@@ -13,14 +13,16 @@ module Fastlane
|
|
13
13
|
return value
|
14
14
|
end
|
15
15
|
|
16
|
+
# Path to the Fastfile inside the fastlane folder. This is nil when none is available
|
16
17
|
def self.fastfile_path
|
17
|
-
|
18
|
-
File.
|
18
|
+
path = File.join(self.path || '.', 'Fastfile')
|
19
|
+
return path if File.exist?(path)
|
20
|
+
return nil
|
19
21
|
end
|
20
22
|
|
21
23
|
# Does a fastlane configuration already exist?
|
22
24
|
def self.setup?
|
23
|
-
return false unless
|
25
|
+
return false unless self.fastfile_path
|
24
26
|
File.exist?(self.fastfile_path)
|
25
27
|
end
|
26
28
|
|
@@ -3,7 +3,10 @@ module Fastlane
|
|
3
3
|
class CrashlyticsHelper
|
4
4
|
class << self
|
5
5
|
def generate_ios_command(params)
|
6
|
-
|
6
|
+
unless params[:crashlytics_path]
|
7
|
+
params[:crashlytics_path] = Dir["./Pods/iOS/Crashlytics/Crashlytics.framework"].last || Dir["./**/Crashlytics.framework"].last
|
8
|
+
end
|
9
|
+
|
7
10
|
UI.user_error!("No value found for 'crashlytics_path'") unless params[:crashlytics_path]
|
8
11
|
submit_binary = Dir[File.join(params[:crashlytics_path], '**', 'submit')].last
|
9
12
|
submit_binary ||= "Crashlytics.framework/submit" if Helper.test?
|
@@ -9,7 +9,7 @@ module Fastlane
|
|
9
9
|
UI.user_error!("platform must be a string") unless platform.kind_of?(String) or platform.nil?
|
10
10
|
UI.user_error!("parameters must be a hash") unless parameters.kind_of?(Hash) or parameters.nil?
|
11
11
|
|
12
|
-
ff = Fastlane::FastFile.new(
|
12
|
+
ff = Fastlane::FastFile.new(Fastlane::FastlaneFolder.fastfile_path)
|
13
13
|
|
14
14
|
is_platform = false
|
15
15
|
begin
|
data/lib/fastlane/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.87.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: krausefx-shenzhen
|
@@ -268,7 +268,7 @@ dependencies:
|
|
268
268
|
requirements:
|
269
269
|
- - ">="
|
270
270
|
- !ruby/object:Gem::Version
|
271
|
-
version: 1.3.
|
271
|
+
version: 1.3.1
|
272
272
|
- - "<"
|
273
273
|
- !ruby/object:Gem::Version
|
274
274
|
version: 2.0.0
|
@@ -278,7 +278,7 @@ dependencies:
|
|
278
278
|
requirements:
|
279
279
|
- - ">="
|
280
280
|
- !ruby/object:Gem::Version
|
281
|
-
version: 1.3.
|
281
|
+
version: 1.3.1
|
282
282
|
- - "<"
|
283
283
|
- !ruby/object:Gem::Version
|
284
284
|
version: 2.0.0
|
@@ -348,7 +348,7 @@ dependencies:
|
|
348
348
|
requirements:
|
349
349
|
- - ">="
|
350
350
|
- !ruby/object:Gem::Version
|
351
|
-
version: 1.6.
|
351
|
+
version: 1.6.3
|
352
352
|
- - "<"
|
353
353
|
- !ruby/object:Gem::Version
|
354
354
|
version: 2.0.0
|
@@ -358,7 +358,7 @@ dependencies:
|
|
358
358
|
requirements:
|
359
359
|
- - ">="
|
360
360
|
- !ruby/object:Gem::Version
|
361
|
-
version: 1.6.
|
361
|
+
version: 1.6.3
|
362
362
|
- - "<"
|
363
363
|
- !ruby/object:Gem::Version
|
364
364
|
version: 2.0.0
|
@@ -765,6 +765,7 @@ files:
|
|
765
765
|
- lib/fastlane/actions/ipa.rb
|
766
766
|
- lib/fastlane/actions/is_ci.rb
|
767
767
|
- lib/fastlane/actions/jazzy.rb
|
768
|
+
- lib/fastlane/actions/jira.rb
|
768
769
|
- lib/fastlane/actions/lane_context.rb
|
769
770
|
- lib/fastlane/actions/last_git_commit.rb
|
770
771
|
- lib/fastlane/actions/last_git_tag.rb
|
@@ -907,9 +908,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
907
908
|
version: '0'
|
908
909
|
requirements: []
|
909
910
|
rubyforge_project:
|
910
|
-
rubygems_version: 2.
|
911
|
+
rubygems_version: 2.5.1
|
911
912
|
signing_key:
|
912
913
|
specification_version: 4
|
913
914
|
summary: The easiest way to automate building and releasing your iOS and Android apps
|
914
915
|
test_files: []
|
915
|
-
has_rdoc:
|