fastlane 2.68.0.beta.20171129010003 → 2.68.0.beta.20171130010004
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/fastlane/lib/assets/ActionDetails.md.erb +2 -2
- data/fastlane/lib/fastlane/actions/appstore.rb +3 -32
- data/fastlane/lib/fastlane/actions/build_android_app.rb +14 -0
- data/fastlane/lib/fastlane/actions/build_app.rb +14 -0
- data/fastlane/lib/fastlane/actions/build_ios_app.rb +143 -0
- data/fastlane/lib/fastlane/actions/capture_android_screenshots.rb +57 -0
- data/fastlane/lib/fastlane/actions/capture_ios_screenshots.rb +55 -0
- data/fastlane/lib/fastlane/actions/capture_screenshots.rb +14 -0
- data/fastlane/lib/fastlane/actions/cert.rb +6 -60
- data/fastlane/lib/fastlane/actions/check_app_store_metadata.rb +53 -0
- data/fastlane/lib/fastlane/actions/create_app_online.rb +76 -0
- data/fastlane/lib/fastlane/actions/deliver.rb +6 -56
- data/fastlane/lib/fastlane/actions/docs/frameit.md +2 -1
- data/fastlane/lib/fastlane/actions/frame_screenshots.rb +62 -0
- data/fastlane/lib/fastlane/actions/frameit.rb +6 -53
- data/fastlane/lib/fastlane/actions/get_certificates.rb +69 -0
- data/fastlane/lib/fastlane/actions/get_provisioning_profile.rb +88 -0
- data/fastlane/lib/fastlane/actions/get_push_certificate.rb +82 -0
- data/fastlane/lib/fastlane/actions/gym.rb +6 -133
- data/fastlane/lib/fastlane/actions/match.rb +3 -87
- data/fastlane/lib/fastlane/actions/pem.rb +6 -73
- data/fastlane/lib/fastlane/actions/pilot.rb +3 -55
- data/fastlane/lib/fastlane/actions/precheck.rb +6 -44
- data/fastlane/lib/fastlane/actions/produce.rb +6 -66
- data/fastlane/lib/fastlane/actions/run_tests.rb +105 -0
- data/fastlane/lib/fastlane/actions/scan.rb +6 -96
- data/fastlane/lib/fastlane/actions/screengrab.rb +6 -48
- data/fastlane/lib/fastlane/actions/sigh.rb +6 -79
- data/fastlane/lib/fastlane/actions/snapshot.rb +6 -46
- data/fastlane/lib/fastlane/actions/supply.rb +3 -56
- data/fastlane/lib/fastlane/actions/sync_code_signing.rb +99 -0
- data/fastlane/lib/fastlane/actions/testflight.rb +3 -32
- data/fastlane/lib/fastlane/actions/upload_to_app_store.rb +67 -0
- data/fastlane/lib/fastlane/actions/upload_to_play_store.rb +68 -0
- data/fastlane/lib/fastlane/actions/upload_to_testflight.rb +67 -0
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/spaceship/lib/spaceship/client.rb +1 -1
- metadata +19 -2
@@ -0,0 +1,82 @@
|
|
1
|
+
module Fastlane
|
2
|
+
module Actions
|
3
|
+
class GetPushCertificateAction < Action
|
4
|
+
def self.run(params)
|
5
|
+
require 'pem'
|
6
|
+
require 'pem/options'
|
7
|
+
require 'pem/manager'
|
8
|
+
|
9
|
+
success_block = params[:new_profile]
|
10
|
+
|
11
|
+
PEM.config = params
|
12
|
+
|
13
|
+
if Helper.is_test?
|
14
|
+
profile_path = './test.pem'
|
15
|
+
else
|
16
|
+
profile_path = PEM::Manager.start
|
17
|
+
end
|
18
|
+
|
19
|
+
if success_block and profile_path
|
20
|
+
success_block.call(File.expand_path(profile_path)) if success_block
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.description
|
25
|
+
"Ensure a valid push profile is active, creating a new one if needed (via `pem`)"
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.author
|
29
|
+
"KrauseFx"
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.details
|
33
|
+
[
|
34
|
+
"Additionally to the available options, you can also specify a block that only gets executed if a new",
|
35
|
+
"profile was created. You can use it to upload the new profile to your server.",
|
36
|
+
"Use it like this: ",
|
37
|
+
"get_push_certificate(",
|
38
|
+
" new_profile: proc do ",
|
39
|
+
" # your upload code",
|
40
|
+
" end",
|
41
|
+
")"
|
42
|
+
].join("\n")
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.available_options
|
46
|
+
require 'pem'
|
47
|
+
require 'pem/options'
|
48
|
+
|
49
|
+
@options = PEM::Options.available_options
|
50
|
+
@options << FastlaneCore::ConfigItem.new(key: :new_profile,
|
51
|
+
description: "Block that is called if there is a new profile",
|
52
|
+
optional: true,
|
53
|
+
is_string: false)
|
54
|
+
@options
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.is_supported?(platform)
|
58
|
+
platform == :ios
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.example_code
|
62
|
+
[
|
63
|
+
'get_push_certificate',
|
64
|
+
'pem # alias for "get_push_certificate"',
|
65
|
+
'get_push_certificate(
|
66
|
+
force: true, # create a new profile, even if the old one is still valid
|
67
|
+
app_identifier: "net.sunapps.9", # optional app identifier,
|
68
|
+
save_private_key: true,
|
69
|
+
new_profile: proc do |profile_path| # this block gets called when a new profile was generated
|
70
|
+
puts profile_path # the absolute path to the new PEM file
|
71
|
+
# insert the code to upload the PEM file to the server
|
72
|
+
end
|
73
|
+
)'
|
74
|
+
]
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.category
|
78
|
+
:push
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -1,140 +1,13 @@
|
|
1
1
|
module Fastlane
|
2
2
|
module Actions
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
class GymAction < Action
|
9
|
-
def self.run(values)
|
10
|
-
require 'gym'
|
11
|
-
|
12
|
-
unless Actions.lane_context[SharedValues::SIGH_PROFILE_TYPE].to_s == "development"
|
13
|
-
values[:export_method] ||= Actions.lane_context[SharedValues::SIGH_PROFILE_TYPE]
|
14
|
-
end
|
15
|
-
|
16
|
-
if Actions.lane_context[SharedValues::MATCH_PROVISIONING_PROFILE_MAPPING]
|
17
|
-
# Since Xcode 9 you need to explicitly provide the provisioning profile per app target
|
18
|
-
# If the user is smart and uses match and gym together with fastlane, we can do all
|
19
|
-
# the heavy lifting for them
|
20
|
-
values[:export_options] ||= {}
|
21
|
-
# It's not always a hash, because the user might have passed a string path to a ready plist file
|
22
|
-
# If that's the case, we won't set the provisioning profiles
|
23
|
-
# see https://github.com/fastlane/fastlane/issues/9490
|
24
|
-
if values[:export_options].kind_of?(Hash)
|
25
|
-
match_mapping = (Actions.lane_context[SharedValues::MATCH_PROVISIONING_PROFILE_MAPPING] || {}).dup
|
26
|
-
existing_mapping = (values[:export_options][:provisioningProfiles] || {}).dup
|
27
|
-
|
28
|
-
# Be smart about how we merge those mappings in case there are conflicts
|
29
|
-
mapping_object = Gym::CodeSigningMapping.new
|
30
|
-
hash_to_use = mapping_object.merge_profile_mapping(primary_mapping: existing_mapping,
|
31
|
-
secondary_mapping: match_mapping,
|
32
|
-
export_method: values[:export_method])
|
33
|
-
|
34
|
-
values[:export_options][:provisioningProfiles] = hash_to_use
|
35
|
-
else
|
36
|
-
self.show_xcode_9_warning
|
37
|
-
end
|
38
|
-
elsif Actions.lane_context[SharedValues::SIGH_PROFILE_PATHS]
|
39
|
-
# Since Xcode 9 you need to explicitly provide the provisioning profile per app target
|
40
|
-
# If the user used sigh we can match the profiles from sigh
|
41
|
-
values[:export_options] ||= {}
|
42
|
-
if values[:export_options].kind_of?(Hash)
|
43
|
-
# It's not always a hash, because the user might have passed a string path to a ready plist file
|
44
|
-
# If that's the case, we won't set the provisioning profiles
|
45
|
-
# see https://github.com/fastlane/fastlane/issues/9684
|
46
|
-
values[:export_options][:provisioningProfiles] ||= {}
|
47
|
-
Actions.lane_context[SharedValues::SIGH_PROFILE_PATHS].each do |profile_path|
|
48
|
-
begin
|
49
|
-
profile = FastlaneCore::ProvisioningProfile.parse(profile_path)
|
50
|
-
profile_team_id = profile["TeamIdentifier"].first
|
51
|
-
next if profile_team_id != values[:export_team_id] && !values[:export_team_id].nil?
|
52
|
-
bundle_id = profile["Entitlements"]["application-identifier"].gsub("#{profile_team_id}.", "")
|
53
|
-
values[:export_options][:provisioningProfiles][bundle_id] = profile["Name"]
|
54
|
-
rescue => ex
|
55
|
-
UI.error("Couldn't load profile at path: #{profile_path}")
|
56
|
-
UI.error(ex)
|
57
|
-
UI.verbose(ex.backtrace.join("\n"))
|
58
|
-
end
|
59
|
-
end
|
60
|
-
else
|
61
|
-
self.show_xcode_9_warning
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
gym_output_path = Gym::Manager.new.work(values)
|
66
|
-
if gym_output_path.nil?
|
67
|
-
UI.important("No output path received from gym")
|
68
|
-
return nil
|
69
|
-
end
|
70
|
-
|
71
|
-
absolute_ipa_path = File.expand_path(gym_output_path)
|
72
|
-
absolute_dsym_path = absolute_ipa_path.gsub(".ipa", ".app.dSYM.zip")
|
73
|
-
|
74
|
-
# This might be the mac app path, so we don't want to set it here
|
75
|
-
# https://github.com/fastlane/fastlane/issues/5757
|
76
|
-
if absolute_ipa_path.include?(".ipa")
|
77
|
-
Actions.lane_context[SharedValues::IPA_OUTPUT_PATH] = absolute_ipa_path
|
78
|
-
ENV[SharedValues::IPA_OUTPUT_PATH.to_s] = absolute_ipa_path # for deliver
|
79
|
-
end
|
80
|
-
|
81
|
-
Actions.lane_context[SharedValues::DSYM_OUTPUT_PATH] = absolute_dsym_path if File.exist?(absolute_dsym_path)
|
82
|
-
Actions.lane_context[SharedValues::XCODEBUILD_ARCHIVE] = Gym::BuildCommandGenerator.archive_path
|
83
|
-
ENV[SharedValues::DSYM_OUTPUT_PATH.to_s] = absolute_dsym_path if File.exist?(absolute_dsym_path)
|
84
|
-
|
85
|
-
return absolute_ipa_path
|
86
|
-
end
|
3
|
+
require 'fastlane/actions/build_ios_app'
|
4
|
+
class GymAction < BuildIosAppAction
|
5
|
+
#####################################################
|
6
|
+
# @!group Documentation
|
7
|
+
#####################################################
|
87
8
|
|
88
9
|
def self.description
|
89
|
-
"
|
90
|
-
end
|
91
|
-
|
92
|
-
def self.details
|
93
|
-
"More information: https://fastlane.tools/gym"
|
94
|
-
end
|
95
|
-
|
96
|
-
def self.return_value
|
97
|
-
"The absolute path to the generated ipa file"
|
98
|
-
end
|
99
|
-
|
100
|
-
def self.author
|
101
|
-
"KrauseFx"
|
102
|
-
end
|
103
|
-
|
104
|
-
def self.available_options
|
105
|
-
require 'gym'
|
106
|
-
Gym::Options.available_options
|
107
|
-
end
|
108
|
-
|
109
|
-
def self.is_supported?(platform)
|
110
|
-
[:ios, :mac].include? platform
|
111
|
-
end
|
112
|
-
|
113
|
-
def self.example_code
|
114
|
-
[
|
115
|
-
'gym(scheme: "MyApp", workspace: "MyApp.xcworkspace")',
|
116
|
-
'gym(
|
117
|
-
workspace: "MyApp.xcworkspace",
|
118
|
-
configuration: "Debug",
|
119
|
-
scheme: "MyApp",
|
120
|
-
silent: true,
|
121
|
-
clean: true,
|
122
|
-
output_directory: "path/to/dir", # Destination directory. Defaults to current directory.
|
123
|
-
output_name: "my-app.ipa", # specify the name of the .ipa file to generate (including file extension)
|
124
|
-
sdk: "10.0" # use SDK as the name or path of the base SDK when building the project.
|
125
|
-
)'
|
126
|
-
]
|
127
|
-
end
|
128
|
-
|
129
|
-
def self.category
|
130
|
-
:building
|
131
|
-
end
|
132
|
-
|
133
|
-
def self.show_xcode_9_warning
|
134
|
-
return unless Helper.xcode_at_least?("9.0")
|
135
|
-
UI.message("You passed a path to a custom plist file for exporting the binary.")
|
136
|
-
UI.message("Make sure to include information about what provisioning profiles to use with Xcode 9")
|
137
|
-
UI.message("More information: https://docs.fastlane.tools/codesigning/xcode-project/#xcode-9-and-up")
|
10
|
+
"Alias for the `build_ios_app` action"
|
138
11
|
end
|
139
12
|
end
|
140
13
|
end
|
@@ -1,97 +1,13 @@
|
|
1
1
|
module Fastlane
|
2
2
|
module Actions
|
3
|
-
|
4
|
-
|
5
|
-
end
|
6
|
-
|
7
|
-
class MatchAction < Action
|
8
|
-
def self.run(params)
|
9
|
-
require 'match'
|
10
|
-
|
11
|
-
params.load_configuration_file("Matchfile")
|
12
|
-
Match::Runner.new.run(params)
|
13
|
-
|
14
|
-
define_profile_type(params)
|
15
|
-
define_provisioning_profile_mapping(params)
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.define_profile_type(params)
|
19
|
-
profile_type = "app-store"
|
20
|
-
profile_type = "ad-hoc" if params[:type] == 'adhoc'
|
21
|
-
profile_type = "development" if params[:type] == 'development'
|
22
|
-
profile_type = "enterprise" if params[:type] == 'enterprise'
|
23
|
-
|
24
|
-
UI.message("Setting Provisioning Profile type to '#{profile_type}'")
|
25
|
-
|
26
|
-
Actions.lane_context[SharedValues::SIGH_PROFILE_TYPE] = profile_type
|
27
|
-
end
|
28
|
-
|
29
|
-
# Maps the bundle identifier to the appropriate provisioning profile
|
30
|
-
# This is used in the _gym_ action as part of the export options
|
31
|
-
# e.g.
|
32
|
-
#
|
33
|
-
# export_options: {
|
34
|
-
# provisioningProfiles: { "me.themoji.app.beta": "match AppStore me.themoji.app.beta" }
|
35
|
-
# }
|
36
|
-
#
|
37
|
-
def self.define_provisioning_profile_mapping(params)
|
38
|
-
mapping = Actions.lane_context[SharedValues::MATCH_PROVISIONING_PROFILE_MAPPING] || {}
|
39
|
-
|
40
|
-
# Array (...) to make sure it's an Array, Ruby is magic, try this
|
41
|
-
# Array(1) # => [1]
|
42
|
-
# Array([1, 2]) # => [1, 2]
|
43
|
-
Array(params[:app_identifier]).each do |app_identifier|
|
44
|
-
env_variable_name = Match::Utils.environment_variable_name_profile_name(app_identifier: app_identifier,
|
45
|
-
type: Match.profile_type_sym(params[:type]),
|
46
|
-
platform: params[:platform])
|
47
|
-
mapping[app_identifier] = ENV[env_variable_name]
|
48
|
-
end
|
49
|
-
|
50
|
-
Actions.lane_context[SharedValues::MATCH_PROVISIONING_PROFILE_MAPPING] = mapping
|
51
|
-
end
|
52
|
-
|
3
|
+
require 'fastlane/actions/sync_code_signing'
|
4
|
+
class MatchAction < SyncCodeSigningAction
|
53
5
|
#####################################################
|
54
6
|
# @!group Documentation
|
55
7
|
#####################################################
|
56
8
|
|
57
9
|
def self.description
|
58
|
-
"
|
59
|
-
end
|
60
|
-
|
61
|
-
def self.details
|
62
|
-
"More details https://github.com/fastlane/fastlane/tree/master/match"
|
63
|
-
end
|
64
|
-
|
65
|
-
def self.available_options
|
66
|
-
require 'match'
|
67
|
-
Match::Options.available_options
|
68
|
-
end
|
69
|
-
|
70
|
-
def self.output
|
71
|
-
[]
|
72
|
-
end
|
73
|
-
|
74
|
-
def self.return_value
|
75
|
-
end
|
76
|
-
|
77
|
-
def self.authors
|
78
|
-
["KrauseFx"]
|
79
|
-
end
|
80
|
-
|
81
|
-
def self.is_supported?(platform)
|
82
|
-
platform == :ios
|
83
|
-
end
|
84
|
-
|
85
|
-
def self.example_code
|
86
|
-
[
|
87
|
-
'match(type: "appstore", app_identifier: "tools.fastlane.app")',
|
88
|
-
'match(type: "development", readonly: true)',
|
89
|
-
'match(app_identifier: ["tools.fastlane.app", "tools.fastlane.sleepy"])'
|
90
|
-
]
|
91
|
-
end
|
92
|
-
|
93
|
-
def self.category
|
94
|
-
:code_signing
|
10
|
+
"Alias for the `sync_code_signing` action"
|
95
11
|
end
|
96
12
|
end
|
97
13
|
end
|
@@ -1,80 +1,13 @@
|
|
1
1
|
module Fastlane
|
2
2
|
module Actions
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
success_block = params[:new_profile]
|
10
|
-
|
11
|
-
PEM.config = params
|
12
|
-
|
13
|
-
if Helper.is_test?
|
14
|
-
profile_path = './test.pem'
|
15
|
-
else
|
16
|
-
profile_path = PEM::Manager.start
|
17
|
-
end
|
18
|
-
|
19
|
-
if success_block and profile_path
|
20
|
-
success_block.call(File.expand_path(profile_path)) if success_block
|
21
|
-
end
|
22
|
-
end
|
3
|
+
require 'fastlane/actions/get_push_certificate'
|
4
|
+
class PemAction < GetPushCertificateAction
|
5
|
+
#####################################################
|
6
|
+
# @!group Documentation
|
7
|
+
#####################################################
|
23
8
|
|
24
9
|
def self.description
|
25
|
-
"
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.author
|
29
|
-
"KrauseFx"
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.details
|
33
|
-
[
|
34
|
-
"Additionally to the available options, you can also specify a block that only gets executed if a new",
|
35
|
-
"profile was created. You can use it to upload the new profile to your server.",
|
36
|
-
"Use it like this: ",
|
37
|
-
"pem(",
|
38
|
-
" new_profile: proc do ",
|
39
|
-
" # your upload code",
|
40
|
-
" end",
|
41
|
-
")"
|
42
|
-
].join("\n")
|
43
|
-
end
|
44
|
-
|
45
|
-
def self.available_options
|
46
|
-
require 'pem'
|
47
|
-
require 'pem/options'
|
48
|
-
|
49
|
-
@options = PEM::Options.available_options
|
50
|
-
@options << FastlaneCore::ConfigItem.new(key: :new_profile,
|
51
|
-
description: "Block that is called if there is a new profile",
|
52
|
-
optional: true,
|
53
|
-
is_string: false)
|
54
|
-
@options
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.is_supported?(platform)
|
58
|
-
platform == :ios
|
59
|
-
end
|
60
|
-
|
61
|
-
def self.example_code
|
62
|
-
[
|
63
|
-
'pem',
|
64
|
-
'pem(
|
65
|
-
force: true, # create a new profile, even if the old one is still valid
|
66
|
-
app_identifier: "net.sunapps.9", # optional app identifier,
|
67
|
-
save_private_key: true,
|
68
|
-
new_profile: proc do |profile_path| # this block gets called when a new profile was generated
|
69
|
-
puts profile_path # the absolute path to the new PEM file
|
70
|
-
# insert the code to upload the PEM file to the server
|
71
|
-
end
|
72
|
-
)'
|
73
|
-
]
|
74
|
-
end
|
75
|
-
|
76
|
-
def self.category
|
77
|
-
:push
|
10
|
+
"Alias for the `get_push_certificate` action"
|
78
11
|
end
|
79
12
|
end
|
80
13
|
end
|
@@ -1,65 +1,13 @@
|
|
1
1
|
module Fastlane
|
2
2
|
module Actions
|
3
|
-
|
4
|
-
|
5
|
-
require 'pilot'
|
6
|
-
require 'pilot/options'
|
7
|
-
|
8
|
-
changelog = Actions.lane_context[SharedValues::FL_CHANGELOG]
|
9
|
-
values[:changelog] ||= changelog if changelog
|
10
|
-
|
11
|
-
values[:ipa] ||= Actions.lane_context[SharedValues::IPA_OUTPUT_PATH]
|
12
|
-
values[:ipa] = File.expand_path(values[:ipa]) if values[:ipa]
|
13
|
-
|
14
|
-
return values if Helper.test?
|
15
|
-
|
16
|
-
Pilot::BuildManager.new.upload(values) # we already have the finished config
|
17
|
-
end
|
18
|
-
|
3
|
+
require 'fastlane/actions/upload_to_testflight'
|
4
|
+
class PilotAction < UploadToTestflightAction
|
19
5
|
#####################################################
|
20
6
|
# @!group Documentation
|
21
7
|
#####################################################
|
22
8
|
|
23
9
|
def self.description
|
24
|
-
"
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.details
|
28
|
-
[
|
29
|
-
"More details can be found on https://github.com/fastlane/fastlane/tree/master/pilot",
|
30
|
-
"This integration will only do the TestFlight upload"
|
31
|
-
].join("\n")
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.available_options
|
35
|
-
require "pilot"
|
36
|
-
require "pilot/options"
|
37
|
-
FastlaneCore::CommanderGenerator.new.generate(Pilot::Options.available_options)
|
38
|
-
end
|
39
|
-
|
40
|
-
def self.example_code
|
41
|
-
[
|
42
|
-
'testflight',
|
43
|
-
'pilot # alias for "testflight"',
|
44
|
-
'testflight(skip_submission: true) # to only upload the build',
|
45
|
-
'testflight(
|
46
|
-
username: "felix@krausefx.com",
|
47
|
-
app_identifier: "com.krausefx.app",
|
48
|
-
itc_provider: "abcde12345" # pass a specific value to the iTMSTransporter -itc_provider option
|
49
|
-
)'
|
50
|
-
]
|
51
|
-
end
|
52
|
-
|
53
|
-
def self.category
|
54
|
-
:beta
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.authors
|
58
|
-
["KrauseFx"]
|
59
|
-
end
|
60
|
-
|
61
|
-
def self.is_supported?(platform)
|
62
|
-
[:ios].include?(platform)
|
10
|
+
"Alias for the `upload_to_testflight` action"
|
63
11
|
end
|
64
12
|
end
|
65
13
|
end
|