fastlane 1.63.0 → 1.63.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/fastlane +7 -1
- data/lib/fastlane/actions/carthage.rb +7 -15
- data/lib/fastlane/actions/notification.rb +16 -4
- data/lib/fastlane/actions/verify_build.rb +183 -0
- data/lib/fastlane/lane_list.rb +31 -0
- data/lib/fastlane/version.rb +1 -1
- metadata +8 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f856d6f6af4e0bf885b9472d0b1d4a935cb74ea4
|
|
4
|
+
data.tar.gz: b578b4713ef937a906cb21eb8851776c0802c9f3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a7356c5fa16111d39248728fe1eac89b4bdad3a1b7647153e9eafd163b0fc8d6284661e454c89024aae2ea7a8d20996a95633b6acfe49bfcab0ba852ff233d1b
|
|
7
|
+
data.tar.gz: 1ab07e603d5a0d08b1fae7ba9d3fe77430850f009fc1ecc9e17586fa207ed910dd6391a22e84f4b522356f0db6a87f62dd871f07dd29445363cf299a8d6aed75
|
data/bin/fastlane
CHANGED
|
@@ -64,11 +64,17 @@ class FastlaneApplication
|
|
|
64
64
|
command :lanes do |c|
|
|
65
65
|
c.syntax = 'fastlane lanes'
|
|
66
66
|
c.description = 'Lists all available lanes and shows their description'
|
|
67
|
+
c.option "-j", "--json", "Output the lanes in JSON instead of text"
|
|
67
68
|
|
|
68
69
|
c.action do |args, options|
|
|
69
70
|
require 'fastlane/lane_list'
|
|
70
71
|
path = File.join(Fastlane::FastlaneFolder.path || '.', 'Fastfile')
|
|
71
|
-
|
|
72
|
+
|
|
73
|
+
if options.json
|
|
74
|
+
Fastlane::LaneList.output_json(path)
|
|
75
|
+
else
|
|
76
|
+
Fastlane::LaneList.output(path)
|
|
77
|
+
end
|
|
72
78
|
end
|
|
73
79
|
end
|
|
74
80
|
|
|
@@ -4,12 +4,7 @@ module Fastlane
|
|
|
4
4
|
def self.run(params)
|
|
5
5
|
cmd = ["carthage"]
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
cmd << "update"
|
|
9
|
-
else
|
|
10
|
-
cmd << "bootstrap"
|
|
11
|
-
end
|
|
12
|
-
|
|
7
|
+
cmd << params[:command]
|
|
13
8
|
cmd << "--use-ssh" if params[:use_ssh]
|
|
14
9
|
cmd << "--use-submodules" if params[:use_submodules]
|
|
15
10
|
cmd << "--no-use-binaries" if params[:use_binaries] == false
|
|
@@ -26,16 +21,13 @@ module Fastlane
|
|
|
26
21
|
|
|
27
22
|
def self.available_options
|
|
28
23
|
[
|
|
29
|
-
FastlaneCore::ConfigItem.new(key: :
|
|
30
|
-
env_name: "
|
|
31
|
-
description: "
|
|
32
|
-
|
|
33
|
-
optional: true,
|
|
34
|
-
default_value: false,
|
|
24
|
+
FastlaneCore::ConfigItem.new(key: :command,
|
|
25
|
+
env_name: "FL_CARTHAGE_COMMAND",
|
|
26
|
+
description: "Carthage command (one of `build`, `bootstrap`, `update`)",
|
|
27
|
+
default_value: 'bootstrap',
|
|
35
28
|
verify_block: proc do |value|
|
|
36
|
-
raise "Please pass a valid
|
|
29
|
+
raise "Please pass a valid command. Use one of the following: build, bootstrap, update" unless %w(build bootstrap update).include? value
|
|
37
30
|
end),
|
|
38
|
-
|
|
39
31
|
FastlaneCore::ConfigItem.new(key: :use_ssh,
|
|
40
32
|
env_name: "FL_CARTHAGE_USE_SSH",
|
|
41
33
|
description: "Use SSH for downloading GitHub repositories",
|
|
@@ -91,7 +83,7 @@ module Fastlane
|
|
|
91
83
|
end
|
|
92
84
|
|
|
93
85
|
def self.authors
|
|
94
|
-
["bassrock", "petester42", "jschmid", "JaviSoto"]
|
|
86
|
+
["bassrock", "petester42", "jschmid", "JaviSoto", "uny"]
|
|
95
87
|
end
|
|
96
88
|
end
|
|
97
89
|
end
|
|
@@ -4,10 +4,19 @@ module Fastlane
|
|
|
4
4
|
def self.run(params)
|
|
5
5
|
require 'terminal-notifier'
|
|
6
6
|
|
|
7
|
-
if params[:subtitle]
|
|
7
|
+
if params[:subtitle] && params[:sound]
|
|
8
8
|
TerminalNotifier.notify(params[:message],
|
|
9
9
|
title: params[:title],
|
|
10
|
-
|
|
10
|
+
subtitle: params[:subtitle],
|
|
11
|
+
sound: params[:sound])
|
|
12
|
+
elsif params[:subtitle]
|
|
13
|
+
TerminalNotifier.notify(params[:message],
|
|
14
|
+
title: params[:title],
|
|
15
|
+
subtitle: params[:subtitle])
|
|
16
|
+
elsif params[:sound]
|
|
17
|
+
TerminalNotifier.notify(params[:message],
|
|
18
|
+
title: params[:title],
|
|
19
|
+
sound: params[:sound])
|
|
11
20
|
else
|
|
12
21
|
# It should look nice without a subtitle too
|
|
13
22
|
TerminalNotifier.notify(params[:message],
|
|
@@ -20,7 +29,7 @@ module Fastlane
|
|
|
20
29
|
end
|
|
21
30
|
|
|
22
31
|
def self.author
|
|
23
|
-
["champo", "cbowns", "KrauseFx"]
|
|
32
|
+
["champo", "cbowns", "KrauseFx", "amarcadet"]
|
|
24
33
|
end
|
|
25
34
|
|
|
26
35
|
def self.available_options
|
|
@@ -33,7 +42,10 @@ module Fastlane
|
|
|
33
42
|
optional: true),
|
|
34
43
|
FastlaneCore::ConfigItem.new(key: :message,
|
|
35
44
|
description: "The message to display in the notification",
|
|
36
|
-
optional: false)
|
|
45
|
+
optional: false),
|
|
46
|
+
FastlaneCore::ConfigItem.new(key: :sound,
|
|
47
|
+
description: "The name of a sound to play when the notification appears (names are listed in Sound Preferences)",
|
|
48
|
+
optional: true)
|
|
37
49
|
]
|
|
38
50
|
end
|
|
39
51
|
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
require 'plist'
|
|
2
|
+
require 'terminal-table'
|
|
3
|
+
|
|
4
|
+
module Fastlane
|
|
5
|
+
module Actions
|
|
6
|
+
module SharedValues
|
|
7
|
+
VERIFY_BUILD_CUSTOM_VALUE = :VERIFY_BUILD_CUSTOM_VALUE
|
|
8
|
+
end
|
|
9
|
+
class VerifyBuildAction < Action
|
|
10
|
+
def self.run(params)
|
|
11
|
+
Dir.mktmpdir do |dir|
|
|
12
|
+
app_path = self.app_path(dir)
|
|
13
|
+
|
|
14
|
+
values = self.gather_cert_info(app_path)
|
|
15
|
+
|
|
16
|
+
values = self.update_with_profile_info(app_path, values)
|
|
17
|
+
|
|
18
|
+
self.print_values(values)
|
|
19
|
+
|
|
20
|
+
self.evaulate(params, values)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.app_path(dir)
|
|
25
|
+
ipa_path = Actions.lane_context[SharedValues::IPA_OUTPUT_PATH] || ''
|
|
26
|
+
raise "Unable to find ipa file '#{ipa_path}'." unless File.exist?(ipa_path)
|
|
27
|
+
ipa_path = File.expand_path(ipa_path)
|
|
28
|
+
|
|
29
|
+
`unzip '#{ipa_path}' -d #{dir}`
|
|
30
|
+
raise "Unable to unzip ipa".red unless $? == 0
|
|
31
|
+
|
|
32
|
+
app_path = File.expand_path("#{dir}/Payload/*.app")
|
|
33
|
+
|
|
34
|
+
app_path
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.gather_cert_info(app_path)
|
|
38
|
+
cert_info = `codesign -vv -d #{app_path} 2>&1`
|
|
39
|
+
raise "Unable to verify code signing".red unless $? == 0
|
|
40
|
+
|
|
41
|
+
values = {}
|
|
42
|
+
|
|
43
|
+
parts = cert_info.strip.split(/\r?\n/)
|
|
44
|
+
parts.each do |part|
|
|
45
|
+
if part =~ /\AAuthority=i(Phone|OS)/
|
|
46
|
+
type = part.split('=')[1].split(':')[0]
|
|
47
|
+
values['provisioning_type'] = type.downcase =~ /distribution/i ? "distribution" : "development"
|
|
48
|
+
end
|
|
49
|
+
if part.start_with? "TeamIdentifier"
|
|
50
|
+
values['team_identifier'] = part.split('=')[1]
|
|
51
|
+
end
|
|
52
|
+
if part.start_with? "Identifier"
|
|
53
|
+
values['bundle_identifier'] = part.split('=')[1]
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
values
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def self.update_with_profile_info(app_path, values)
|
|
61
|
+
profile = `cat #{app_path}/embedded.mobileprovision | security cms -D`
|
|
62
|
+
raise "Unable to extract profile".red unless $? == 0
|
|
63
|
+
|
|
64
|
+
plist = Plist.parse_xml(profile)
|
|
65
|
+
|
|
66
|
+
values['app_name'] = plist['AppIDName']
|
|
67
|
+
values['provisioning_uuid'] = plist['UUID']
|
|
68
|
+
values['team_name'] = plist['TeamName']
|
|
69
|
+
|
|
70
|
+
raise "Inconsistent identifier found" unless plist['Entitlements']['application-identifier'] == "#{values['team_identifier']}.#{values['bundle_identifier']}"
|
|
71
|
+
raise "Inconsistent identifier found" unless plist['Entitlements']['com.apple.developer.team-identifier'] == values['team_identifier']
|
|
72
|
+
|
|
73
|
+
values
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def self.print_values(values)
|
|
77
|
+
table = Terminal::Table.new do |t|
|
|
78
|
+
t.title = 'Summary for VERIFY_BUILD'.green
|
|
79
|
+
t.headings = 'Key', 'Value'
|
|
80
|
+
values.each do |key, value|
|
|
81
|
+
columns = []
|
|
82
|
+
columns << key
|
|
83
|
+
columns << case value
|
|
84
|
+
when Hash
|
|
85
|
+
value.map {|k, v| "#{k}: #{v}"}.join("\n")
|
|
86
|
+
when Array
|
|
87
|
+
value.join("\n")
|
|
88
|
+
else
|
|
89
|
+
value.to_s
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
t << columns
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
puts ""
|
|
97
|
+
puts table
|
|
98
|
+
puts ""
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def self.evaulate(params, values)
|
|
102
|
+
if params[:provisioning_type]
|
|
103
|
+
raise "Mismatched provisioning_type '#{params[:provisioning_type]}'".red unless params[:provisioning_type] == values['provisioning_type']
|
|
104
|
+
end
|
|
105
|
+
if params[:provisioning_uuid]
|
|
106
|
+
raise "Mismatched provisioning_uuid '#{params[:provisioning_uuid]}'".red unless params[:provisioning_uuid] == values['provisioning_uuid']
|
|
107
|
+
end
|
|
108
|
+
if params[:team_identifier]
|
|
109
|
+
raise "Mismatched team_identifier '#{params[:team_identifier]}'".red unless params[:team_identifier] == values['team_identifier']
|
|
110
|
+
end
|
|
111
|
+
if params[:team_name]
|
|
112
|
+
raise "Mismatched team_name '#{params[:team_name]}'".red unless params[:team_name] == values['team_name']
|
|
113
|
+
end
|
|
114
|
+
if params[:app_name]
|
|
115
|
+
raise "Mismatched app_name '#{params[:app_name]}'".red unless params[:app_name] == values['app_name']
|
|
116
|
+
end
|
|
117
|
+
if params[:bundle_identifier]
|
|
118
|
+
raise "Mismatched bundle_identifier '#{params[:bundle_identifier]}'".red unless params[:bundle_identifier] == values['bundle_identifier']
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
UI.success "Build is verified, have a 🍪."
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
#####################################################
|
|
125
|
+
# @!group Documentation
|
|
126
|
+
#####################################################
|
|
127
|
+
|
|
128
|
+
def self.description
|
|
129
|
+
"Able to verify various settings in ipa file"
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def self.details
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def self.available_options
|
|
136
|
+
[
|
|
137
|
+
FastlaneCore::ConfigItem.new(key: :provisioning_type,
|
|
138
|
+
env_name: "FL_VERIFY_BUILD_PROVISIONING_TYPE",
|
|
139
|
+
description: "Required type of provisioning",
|
|
140
|
+
optional: true,
|
|
141
|
+
verify_block: proc do |value|
|
|
142
|
+
av = %w(distribution development)
|
|
143
|
+
raise "Unsupported provisioning_type, must be: #{av}" unless av.include?(value)
|
|
144
|
+
end),
|
|
145
|
+
FastlaneCore::ConfigItem.new(key: :provisioning_uuid,
|
|
146
|
+
env_name: "FL_VERIFY_BUILD_PROVISIONING_UUID",
|
|
147
|
+
description: "Required UUID of provisioning profile",
|
|
148
|
+
optional: true),
|
|
149
|
+
FastlaneCore::ConfigItem.new(key: :team_identifier,
|
|
150
|
+
env_name: "FL_VERIFY_BUILD_TEAM_IDENTIFIER",
|
|
151
|
+
description: "Required team identifier",
|
|
152
|
+
optional: true),
|
|
153
|
+
FastlaneCore::ConfigItem.new(key: :team_name,
|
|
154
|
+
env_name: "FL_VERIFY_BUILD_TEAM_NAME",
|
|
155
|
+
description: "Required team name",
|
|
156
|
+
optional: true),
|
|
157
|
+
FastlaneCore::ConfigItem.new(key: :app_name,
|
|
158
|
+
env_name: "FL_VERIFY_BUILD_APP_NAME",
|
|
159
|
+
description: "Required app name",
|
|
160
|
+
optional: true),
|
|
161
|
+
FastlaneCore::ConfigItem.new(key: :bundle_identifier,
|
|
162
|
+
env_name: "FL_VERIFY_BUILD_BUNDLE_IDENTIFIER",
|
|
163
|
+
description: "Required bundle identifier",
|
|
164
|
+
optional: true)
|
|
165
|
+
]
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def self.output
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def self.return_value
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def self.authors
|
|
175
|
+
["CodeReaper"]
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def self.is_supported?(platform)
|
|
179
|
+
platform == :ios
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
end
|
data/lib/fastlane/lane_list.rb
CHANGED
|
@@ -38,5 +38,36 @@ module Fastlane
|
|
|
38
38
|
|
|
39
39
|
output
|
|
40
40
|
end
|
|
41
|
+
|
|
42
|
+
def self.output_json(path)
|
|
43
|
+
puts JSON.pretty_generate(self.generate_json(path))
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Returns a hash
|
|
47
|
+
def self.generate_json(path)
|
|
48
|
+
ff = Fastlane::FastFile.new(path)
|
|
49
|
+
output = {}
|
|
50
|
+
|
|
51
|
+
all_keys = ff.runner.lanes.keys
|
|
52
|
+
|
|
53
|
+
all_keys.each do |platform|
|
|
54
|
+
next if (ff.runner.lanes[platform] || []).count == 0
|
|
55
|
+
|
|
56
|
+
output[platform] ||= {}
|
|
57
|
+
|
|
58
|
+
value = ff.runner.lanes[platform]
|
|
59
|
+
next unless value
|
|
60
|
+
|
|
61
|
+
value.each do |lane_name, lane|
|
|
62
|
+
next if lane.is_private
|
|
63
|
+
|
|
64
|
+
output[platform][lane_name] = {
|
|
65
|
+
description: lane.description.join("\n")
|
|
66
|
+
}
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
return output
|
|
71
|
+
end
|
|
41
72
|
end
|
|
42
73
|
end
|
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.63.
|
|
4
|
+
version: 1.63.1
|
|
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-02-
|
|
11
|
+
date: 2016-02-25 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: krausefx-shenzhen
|
|
@@ -134,7 +134,7 @@ dependencies:
|
|
|
134
134
|
requirements:
|
|
135
135
|
- - ">="
|
|
136
136
|
- !ruby/object:Gem::Version
|
|
137
|
-
version: 0.36.
|
|
137
|
+
version: 0.36.8
|
|
138
138
|
- - "<"
|
|
139
139
|
- !ruby/object:Gem::Version
|
|
140
140
|
version: 1.0.0
|
|
@@ -144,7 +144,7 @@ dependencies:
|
|
|
144
144
|
requirements:
|
|
145
145
|
- - ">="
|
|
146
146
|
- !ruby/object:Gem::Version
|
|
147
|
-
version: 0.36.
|
|
147
|
+
version: 0.36.8
|
|
148
148
|
- - "<"
|
|
149
149
|
- !ruby/object:Gem::Version
|
|
150
150
|
version: 1.0.0
|
|
@@ -434,7 +434,7 @@ dependencies:
|
|
|
434
434
|
requirements:
|
|
435
435
|
- - ">="
|
|
436
436
|
- !ruby/object:Gem::Version
|
|
437
|
-
version: 0.2.
|
|
437
|
+
version: 0.2.1
|
|
438
438
|
- - "<"
|
|
439
439
|
- !ruby/object:Gem::Version
|
|
440
440
|
version: 1.0.0
|
|
@@ -444,7 +444,7 @@ dependencies:
|
|
|
444
444
|
requirements:
|
|
445
445
|
- - ">="
|
|
446
446
|
- !ruby/object:Gem::Version
|
|
447
|
-
version: 0.2.
|
|
447
|
+
version: 0.2.1
|
|
448
448
|
- - "<"
|
|
449
449
|
- !ruby/object:Gem::Version
|
|
450
450
|
version: 1.0.0
|
|
@@ -768,6 +768,7 @@ files:
|
|
|
768
768
|
- lib/fastlane/actions/update_project_provisioning.rb
|
|
769
769
|
- lib/fastlane/actions/update_project_team.rb
|
|
770
770
|
- lib/fastlane/actions/update_url_schemes.rb
|
|
771
|
+
- lib/fastlane/actions/verify_build.rb
|
|
771
772
|
- lib/fastlane/actions/verify_pod_keys.rb
|
|
772
773
|
- lib/fastlane/actions/verify_xcode.rb
|
|
773
774
|
- lib/fastlane/actions/version_bump_podspec.rb
|
|
@@ -827,7 +828,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
827
828
|
version: '0'
|
|
828
829
|
requirements: []
|
|
829
830
|
rubyforge_project:
|
|
830
|
-
rubygems_version: 2.
|
|
831
|
+
rubygems_version: 2.4.6
|
|
831
832
|
signing_key:
|
|
832
833
|
specification_version: 4
|
|
833
834
|
summary: Connect all iOS deployment tools into one streamlined workflow
|