fastlane 1.63.0 → 1.63.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|