fastlane 1.33.6 → 1.34.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -14
- data/bin/fastlane +2 -2
- data/lib/assets/AppfileTemplateAndroid +3 -0
- data/lib/assets/FastfileTemplate +3 -2
- data/lib/assets/FastfileTemplateAndroid +68 -0
- data/lib/fastlane.rb +1 -1
- data/lib/fastlane/actions/carthage.rb +10 -1
- data/lib/fastlane/actions/crashlytics.rb +41 -25
- data/lib/fastlane/actions/deploygate.rb +1 -1
- data/lib/fastlane/actions/gradle.rb +93 -0
- data/lib/fastlane/actions/gym.rb +4 -0
- data/lib/fastlane/actions/hockey.rb +1 -1
- data/lib/fastlane/actions/resign.rb +1 -1
- data/lib/fastlane/actions/scan.rb +40 -0
- data/lib/fastlane/actions/snapshot.rb +9 -43
- data/lib/fastlane/actions/supply.rb +56 -0
- data/lib/fastlane/actions/update_fastlane.rb +6 -1
- data/lib/fastlane/actions/update_project_provisioning.rb +1 -2
- data/lib/fastlane/helper/crashlytics_helper.rb +96 -0
- data/lib/fastlane/helper/gradle_helper.rb +55 -0
- data/lib/fastlane/setup/setup.rb +50 -0
- data/lib/fastlane/setup/setup_android.rb +79 -0
- data/lib/fastlane/{setup.rb → setup/setup_ios.rb} +7 -20
- data/lib/fastlane/version.rb +1 -1
- metadata +64 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60bb8f2003e94f587d350a0fd71db4809875fc16
|
4
|
+
data.tar.gz: c542b96abc2e3705fa3a6ccb8449bada06f452ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1eb6e7fe364ba12a461a0be7c05ad2140caf93c81c4205db5f007e4038c19d1f581cd2e146991e6bf836e50f64c2b59ae4041fb5ee130adc28b094d492a41d7e
|
7
|
+
data.tar.gz: bbe2065825279b7ec82b74a7397f4681b3c59615a21996579540704d4381a83e67be7bf986252a5157612d12cfa9e4d323455e1fd11e59c0f5182db002733a13
|
data/README.md
CHANGED
@@ -113,6 +113,8 @@ If you experience slow launch times of fastlane, try running
|
|
113
113
|
|
114
114
|
to clean up outdated gems.
|
115
115
|
|
116
|
+
System Requirements: `fastlane` requires Mac OS X or Linux with Ruby 2.0.0 or above.
|
117
|
+
|
116
118
|
|
117
119
|
If you want to take a look at a project, already using `fastlane`, check out the [fastlane-examples](https://github.com/fastlane/examples) with `fastlane` setups by Wikipedia, Product Hunt, MindNode and more.
|
118
120
|
|
@@ -181,20 +183,7 @@ Please submit an issue on GitHub and provide information about your setup
|
|
181
183
|
|
182
184
|
## Special Thanks
|
183
185
|
|
184
|
-
Thanks to all contributors for extending and improving
|
185
|
-
|
186
|
-
- [Product Hunt](https://www.producthunt.com/)
|
187
|
-
- [MindNode](https://mindnode.com)
|
188
|
-
- [Detroit Labs](http://www.detroitlabs.com/)
|
189
|
-
- Josh Holtz ([@joshdholtz](https://twitter.com/joshdholtz))
|
190
|
-
- Ash Furrow ([@ashfurrow](https://twitter.com/ashfurrow))
|
191
|
-
- Dan Trenz ([@dtrenz](https://twitter.com/dtrenz))
|
192
|
-
- Luka Mirosevic ([@lmirosevic](https://twitter.com/lmirosevic))
|
193
|
-
- Almas Sapargali ([@almassapargali](https://twitter.com/almassapargali))
|
194
|
-
- Manuel Wallner ([@milch](https://github.com/milch))
|
195
|
-
- Pawel Dudek ([@eldudi](https://twitter.com/eldudi))
|
196
|
-
|
197
|
-
Check out the project pages of the other tools for more sponsors and contributors.
|
186
|
+
Thanks to all [contributors](https://github.com/KrauseFx/fastlane/graphs/contributors) for extending and improving `fastlane`. Check out the project pages of the other tools for more sponsors and contributors.
|
198
187
|
|
199
188
|
## License
|
200
189
|
This project is licensed under the terms of the MIT license. See the LICENSE file.
|
data/bin/fastlane
CHANGED
@@ -26,12 +26,12 @@ class FastlaneApplication
|
|
26
26
|
always_trace!
|
27
27
|
|
28
28
|
command :trigger do |c|
|
29
|
-
c.syntax = 'fastlane
|
29
|
+
c.syntax = 'fastlane [lane]'
|
30
30
|
c.description = 'Drive the fastlane for a specific environment. Pass the lane name and optionally the platform first'
|
31
31
|
c.option '--env STRING', String, 'Add environment to use with `dotenv`'
|
32
32
|
|
33
33
|
c.action do |args, options|
|
34
|
-
if Fastlane::FastlaneFolder.
|
34
|
+
if Fastlane::FastlaneFolder.setup?
|
35
35
|
Fastlane::CommandLineHandler.handle(args, options)
|
36
36
|
else
|
37
37
|
create = agree('Could not find fastlane in current directory. Would you like to set it up? (y/n)'.yellow, true)
|
data/lib/assets/FastfileTemplate
CHANGED
@@ -77,5 +77,6 @@ platform :ios do
|
|
77
77
|
end
|
78
78
|
|
79
79
|
|
80
|
-
|
81
|
-
# https://github.com/KrauseFx/fastlane/blob/master/docs/Platforms.md
|
80
|
+
|
81
|
+
# More information about multiple platforms in fastlane: https://github.com/KrauseFx/fastlane/blob/master/docs/Platforms.md
|
82
|
+
# All available actions: https://github.com/KrauseFx/fastlane/blob/master/docs/Actions.md
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# Customise this file, documentation can be found here:
|
2
|
+
# https://github.com/KrauseFx/fastlane/tree/master/docs
|
3
|
+
# All available actions: https://github.com/KrauseFx/fastlane/blob/master/docs/Actions.md
|
4
|
+
# can also be listed using the `fastlane actions` command
|
5
|
+
|
6
|
+
# Change the syntax highlighting to Ruby
|
7
|
+
# All lines starting with a # are ignored when running `fastlane`
|
8
|
+
|
9
|
+
# By default, fastlane will send which actions are used
|
10
|
+
# No personal data is shared, more information on https://github.com/fastlane/enhancer
|
11
|
+
# Uncomment the following line to opt out
|
12
|
+
# opt_out_usage
|
13
|
+
|
14
|
+
# If you want to automatically update fastlane if a new version is available:
|
15
|
+
# update_fastlane
|
16
|
+
|
17
|
+
# This is the minimum version number required.
|
18
|
+
# Update this, if you use features of a newer version
|
19
|
+
fastlane_version "[[FASTLANE_VERSION]]"
|
20
|
+
|
21
|
+
default_platform :android
|
22
|
+
|
23
|
+
platform :android do
|
24
|
+
before_all do
|
25
|
+
# ENV["SLACK_URL"] = "https://hooks.slack.com/services/..."
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Runs all the tests"
|
29
|
+
lane :test do
|
30
|
+
gradle(task: "test")
|
31
|
+
end
|
32
|
+
|
33
|
+
desc "Submit a new Beta Build to Crashlytics Beta"
|
34
|
+
lane :beta do
|
35
|
+
gradle(task: "assembleRelease")
|
36
|
+
crashlytics
|
37
|
+
|
38
|
+
# sh "your_script.sh"
|
39
|
+
# You can also use other beta testing services here
|
40
|
+
end
|
41
|
+
|
42
|
+
desc "Deploy a new version to the Google Play"
|
43
|
+
lane :deploy do
|
44
|
+
gradle(task: "assembleRelease")
|
45
|
+
supply
|
46
|
+
end
|
47
|
+
|
48
|
+
# You can define as many lanes as you want
|
49
|
+
|
50
|
+
after_all do |lane|
|
51
|
+
# This block is called, only if the executed lane was successful
|
52
|
+
|
53
|
+
# slack(
|
54
|
+
# message: "Successfully deployed new App Update."
|
55
|
+
# )
|
56
|
+
end
|
57
|
+
|
58
|
+
error do |lane, exception|
|
59
|
+
# slack(
|
60
|
+
# message: exception.message,
|
61
|
+
# success: false
|
62
|
+
# )
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
# More information about multiple platforms in fastlane: https://github.com/KrauseFx/fastlane/blob/master/docs/Platforms.md
|
68
|
+
# All available actions: https://github.com/KrauseFx/fastlane/blob/master/docs/Actions.md
|
data/lib/fastlane.rb
CHANGED
@@ -4,7 +4,7 @@ require 'fastlane/actions/actions_helper' # has to be before fast_file
|
|
4
4
|
require 'fastlane/fast_file'
|
5
5
|
require 'fastlane/dependency_checker'
|
6
6
|
require 'fastlane/runner'
|
7
|
-
require 'fastlane/setup'
|
7
|
+
require 'fastlane/setup/setup'
|
8
8
|
require 'fastlane/lane'
|
9
9
|
require 'fastlane/fastlane_folder'
|
10
10
|
require 'fastlane/junit_generator'
|
@@ -8,6 +8,7 @@ module Fastlane
|
|
8
8
|
cmd << "--use-submodules" if params[:use_submodules]
|
9
9
|
cmd << "--no-use-binaries" if params[:use_binaries] == false
|
10
10
|
cmd << "--no-build" if params[:no_build] == true
|
11
|
+
cmd << "--verbose" if params[:verbose] == true
|
11
12
|
cmd << "--platform #{params[:platform]}" if params[:platform]
|
12
13
|
|
13
14
|
Actions.sh(cmd.join(' '))
|
@@ -51,6 +52,14 @@ module Fastlane
|
|
51
52
|
verify_block: proc do |value|
|
52
53
|
raise "Please pass a valid value for no_build. Use one of the following: true, false" unless value.kind_of?(TrueClass) || value.kind_of?(FalseClass)
|
53
54
|
end),
|
55
|
+
FastlaneCore::ConfigItem.new(key: :verbose,
|
56
|
+
env_name: "FL_CARTHAGE_VERBOSE",
|
57
|
+
description: "Print xcodebuild output inline",
|
58
|
+
is_string: false,
|
59
|
+
optional: true,
|
60
|
+
verify_block: proc do |value|
|
61
|
+
raise "Please pass a valid value for verbose. Use one of the following: true, false" unless value.kind_of?(TrueClass) || value.kind_of?(FalseClass)
|
62
|
+
end),
|
54
63
|
FastlaneCore::ConfigItem.new(key: :platform,
|
55
64
|
env_name: "FL_CARTHAGE_PLATFORM",
|
56
65
|
description: "Define which platform to build for",
|
@@ -66,7 +75,7 @@ module Fastlane
|
|
66
75
|
end
|
67
76
|
|
68
77
|
def self.authors
|
69
|
-
["bassrock", "petester42"]
|
78
|
+
["bassrock", "petester42", "jschmid"]
|
70
79
|
end
|
71
80
|
end
|
72
81
|
end
|
@@ -2,30 +2,32 @@ module Fastlane
|
|
2
2
|
module Actions
|
3
3
|
class CrashlyticsAction < Action
|
4
4
|
def self.run(params)
|
5
|
-
Helper.log.info 'Uploading the IPA to Crashlytics Beta. Time for some ☕️.'.green
|
6
|
-
|
7
5
|
params[:groups] = params[:groups].join(",") if params[:groups].kind_of?(Array)
|
8
6
|
params[:emails] = params[:emails].join(",") if params[:emails].kind_of?(Array)
|
9
7
|
|
8
|
+
params.values # to validate all inputs before looking for the ipa/apk
|
9
|
+
|
10
10
|
if params[:notes]
|
11
|
-
|
11
|
+
require 'tempfile'
|
12
|
+
# We need to store it in a file, because the crashlytics CLI (iOS) says so
|
12
13
|
Helper.log.error "Overwriting :notes_path, because you specified :notes" if params[:notes_path]
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
changelog = Tempfile.new('changelog')
|
16
|
+
changelog.write(params[:notes])
|
17
|
+
changelog.close
|
18
|
+
|
19
|
+
params[:notes_path] = changelog.path # we can only set it *after* writing the file there as it gets validated
|
17
20
|
end
|
18
21
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
command << "-groupAliases '#{params[:groups]}'" if params[:groups]
|
27
|
-
command << "-notifications #{(params[:notifications] ? 'YES' : 'NO')}"
|
22
|
+
if params[:ipa_path]
|
23
|
+
command = Helper::CrashlyticsHelper.generate_ios_command(params)
|
24
|
+
elsif params[:apk_path]
|
25
|
+
command = Helper::CrashlyticsHelper.generate_android_command(params)
|
26
|
+
else
|
27
|
+
raise "You have to either pass an ipa or an apk file to the Crashlytics action".red
|
28
|
+
end
|
28
29
|
|
30
|
+
Helper.log.info 'Uploading the IPA to Crashlytics Beta. Time for some ☕️.'.green
|
29
31
|
Helper.log.debug command.join(" ") if $verbose
|
30
32
|
Actions.sh command.join(" ")
|
31
33
|
|
@@ -40,12 +42,33 @@ module Fastlane
|
|
40
42
|
|
41
43
|
def self.available_options
|
42
44
|
[
|
45
|
+
# iOS Specific
|
46
|
+
FastlaneCore::ConfigItem.new(key: :ipa_path,
|
47
|
+
env_name: "CRASHLYTICS_IPA_PATH",
|
48
|
+
description: "Path to your IPA file. Optional if you use the `gym` or `xcodebuild` action",
|
49
|
+
default_value: Actions.lane_context[SharedValues::IPA_OUTPUT_PATH] || Dir["*.ipa"].last,
|
50
|
+
optional: true,
|
51
|
+
verify_block: proc do |value|
|
52
|
+
raise "Couldn't find ipa file at path '#{value}'".red unless File.exist?(value)
|
53
|
+
end),
|
54
|
+
# Android Specific
|
55
|
+
FastlaneCore::ConfigItem.new(key: :apk_path,
|
56
|
+
env_name: "CRASHLYTICS_APK_PATH",
|
57
|
+
description: "Path to your APK file",
|
58
|
+
default_value: Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH] || Dir["*.apk"].last || Dir[File.join("app", "build", "outputs", "apk", "app-Release.apk")].last,
|
59
|
+
optional: true,
|
60
|
+
verify_block: proc do |value|
|
61
|
+
raise "Couldn't find apk file at path '#{value}'".red unless File.exist?(value)
|
62
|
+
end),
|
63
|
+
|
64
|
+
# General
|
43
65
|
FastlaneCore::ConfigItem.new(key: :crashlytics_path,
|
44
66
|
env_name: "CRASHLYTICS_FRAMEWORK_PATH",
|
45
|
-
description: "Path to the submit binary in the Crashlytics bundle",
|
67
|
+
description: "Path to the submit binary in the Crashlytics bundle (iOS) or `crashlytics-devtools.jar` file (Android)",
|
46
68
|
default_value: Dir["./Pods/Crashlytics/Crashlytics.framework"].last,
|
69
|
+
optional: true,
|
47
70
|
verify_block: proc do |value|
|
48
|
-
raise "
|
71
|
+
raise "Couldn't find crashlytics at path '#{File.expand_path(value)}'`".red unless File.exist?(File.expand_path(value))
|
49
72
|
end),
|
50
73
|
FastlaneCore::ConfigItem.new(key: :api_token,
|
51
74
|
env_name: "CRASHLYTICS_API_TOKEN",
|
@@ -59,13 +82,6 @@ module Fastlane
|
|
59
82
|
verify_block: proc do |value|
|
60
83
|
raise "No build secret for Crashlytics given, pass using `build_secret: 'secret'`".red unless value and !value.empty?
|
61
84
|
end),
|
62
|
-
FastlaneCore::ConfigItem.new(key: :ipa_path,
|
63
|
-
env_name: "CRASHLYTICS_IPA_PATH",
|
64
|
-
description: "Path to your IPA file. Optional if you use the `ipa` or `xcodebuild` action",
|
65
|
-
default_value: Actions.lane_context[SharedValues::IPA_OUTPUT_PATH] || Dir["*.ipa"].last,
|
66
|
-
verify_block: proc do |value|
|
67
|
-
raise "Couldn't find ipa file at path '#{value}'".red unless File.exist?(value)
|
68
|
-
end),
|
69
85
|
FastlaneCore::ConfigItem.new(key: :notes_path,
|
70
86
|
env_name: "CRASHLYTICS_NOTES_PATH",
|
71
87
|
description: "Path to the release notes",
|
@@ -97,7 +113,7 @@ module Fastlane
|
|
97
113
|
end
|
98
114
|
|
99
115
|
def self.is_supported?(platform)
|
100
|
-
[:ios, :mac].include?(platform)
|
116
|
+
[:ios, :mac, :android].include?(platform)
|
101
117
|
end
|
102
118
|
|
103
119
|
def self.author
|
@@ -97,7 +97,7 @@ module Fastlane
|
|
97
97
|
end),
|
98
98
|
FastlaneCore::ConfigItem.new(key: :ipa,
|
99
99
|
env_name: "DEPLOYGATE_IPA_PATH",
|
100
|
-
description: "Path to your IPA file. Optional if you use the `
|
100
|
+
description: "Path to your IPA file. Optional if you use the `gym` or `xcodebuild` action",
|
101
101
|
default_value: Actions.lane_context[SharedValues::IPA_OUTPUT_PATH],
|
102
102
|
verify_block: proc do |value|
|
103
103
|
raise "Couldn't find ipa file at path '#{value}'".red unless File.exist?(value)
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module Fastlane
|
2
|
+
module Actions
|
3
|
+
module SharedValues
|
4
|
+
GRADLE_APK_OUTPUT_PATH = :APK_OUTPUT_PATH
|
5
|
+
GRADLE_FLAVOR = :GRADLE_FLAVOR
|
6
|
+
end
|
7
|
+
|
8
|
+
class GradleAction < Action
|
9
|
+
def self.run(params)
|
10
|
+
task = params[:task]
|
11
|
+
|
12
|
+
gradle = Helper::GradleHelper.new(gradle_path: params[:gradle_path])
|
13
|
+
|
14
|
+
result = gradle.trigger(task: task, flags: params[:flags])
|
15
|
+
|
16
|
+
return result unless task.start_with?("assemble")
|
17
|
+
|
18
|
+
# We built our app. Store the path to the apk
|
19
|
+
flavor = task.match(/assemble(\w*)/)
|
20
|
+
if flavor and flavor[1]
|
21
|
+
flavor = flavor[1].downcase # Release => release
|
22
|
+
apk_path = File.join("app", "build", "outputs", "apk", "app-#{flavor}.apk")
|
23
|
+
if File.exist?(apk_path)
|
24
|
+
Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH] = File.expand_path(apk_path)
|
25
|
+
else
|
26
|
+
Helper.log.info "Couldn't find signed apk file at path '#{apk_path}'...".red
|
27
|
+
if flavor == 'release'
|
28
|
+
Helper.log.info "Make sure to enable code signing in your gradle task: ".red
|
29
|
+
Helper.log.info "https://stackoverflow.com/questions/18328730/how-to-create-a-release-signed-apk-file-using-gradle".red
|
30
|
+
end
|
31
|
+
end
|
32
|
+
Actions.lane_context[SharedValues::GRADLE_FLAVOR] = flavor
|
33
|
+
end
|
34
|
+
|
35
|
+
return result
|
36
|
+
end
|
37
|
+
|
38
|
+
#####################################################
|
39
|
+
# @!group Documentation
|
40
|
+
#####################################################
|
41
|
+
|
42
|
+
def self.description
|
43
|
+
"All gradle related actions, including building and testing your Android app"
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.details
|
47
|
+
[
|
48
|
+
"Run `./gradlew tasks` to get a list of all available gradle tasks for your project"
|
49
|
+
].join("\n")
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.available_options
|
53
|
+
[
|
54
|
+
FastlaneCore::ConfigItem.new(key: :task,
|
55
|
+
env_name: "FL_GRADLE_TASK",
|
56
|
+
description: "The gradle task you want to execute",
|
57
|
+
is_string: true),
|
58
|
+
FastlaneCore::ConfigItem.new(key: :flags,
|
59
|
+
env_name: "FL_GRADLE_FLAGS",
|
60
|
+
description: "All parameter flags you want to pass to the gradle command, e.g. `--exitcode --xml file.xml`",
|
61
|
+
optional: true,
|
62
|
+
is_string: true),
|
63
|
+
FastlaneCore::ConfigItem.new(key: :gradle_path,
|
64
|
+
env_name: "FL_GRADLE_PATH",
|
65
|
+
description: "The path to your `gradlew`",
|
66
|
+
is_string: true,
|
67
|
+
default_value: Dir["./gradlew"].last, # Using Dir to be nil when the file doesn't exist (import for validation)
|
68
|
+
verify_block: proc do |value|
|
69
|
+
raise "Couldn't find gradlew at path '#{File.expand_path(value)}'".red unless File.exist?(value)
|
70
|
+
end)
|
71
|
+
]
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.output
|
75
|
+
[
|
76
|
+
['APK_OUTPUT_PATH', 'The path to the newly generated apk file']
|
77
|
+
]
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.return_value
|
81
|
+
"The output of running the gradle task"
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.authors
|
85
|
+
["KrauseFx"]
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.is_supported?(platform)
|
89
|
+
platform == :android
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
data/lib/fastlane/actions/gym.rb
CHANGED
@@ -72,7 +72,7 @@ module Fastlane
|
|
72
72
|
end),
|
73
73
|
FastlaneCore::ConfigItem.new(key: :ipa,
|
74
74
|
env_name: "FL_HOCKEY_IPA",
|
75
|
-
description: "Path to your IPA file. Optional if you use the `
|
75
|
+
description: "Path to your IPA file. Optional if you use the `gym` or `xcodebuild` action. For Mac zip the .app",
|
76
76
|
default_value: Actions.lane_context[SharedValues::IPA_OUTPUT_PATH],
|
77
77
|
verify_block: proc do |value|
|
78
78
|
raise "Couldn't find ipa file at path '#{value}'".red unless File.exist?(value)
|
@@ -21,7 +21,7 @@ module Fastlane
|
|
21
21
|
[
|
22
22
|
FastlaneCore::ConfigItem.new(key: :ipa,
|
23
23
|
env_name: "FL_RESIGN_IPA",
|
24
|
-
description: "Path to the ipa file to resign. Optional if you use the `
|
24
|
+
description: "Path to the ipa file to resign. Optional if you use the `gym` or `xcodebuild` action",
|
25
25
|
default_value: Actions.lane_context[SharedValues::IPA_OUTPUT_PATH],
|
26
26
|
verify_block: proc do |value|
|
27
27
|
raise "Couldn't find ipa file at path '#{value}'".red unless File.exist?(value)
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Fastlane
|
2
|
+
module Actions
|
3
|
+
class ScanAction < Action
|
4
|
+
def self.run(values)
|
5
|
+
require 'scan'
|
6
|
+
|
7
|
+
begin
|
8
|
+
FastlaneCore::UpdateChecker.start_looking_for_update('scan') unless Helper.is_test?
|
9
|
+
|
10
|
+
Scan::Manager.new.work(values)
|
11
|
+
|
12
|
+
true
|
13
|
+
ensure
|
14
|
+
FastlaneCore::UpdateChecker.show_update_status('scan', Scan::VERSION)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.description
|
19
|
+
"Easily test your app using `scan`"
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.details
|
23
|
+
"More information: https://github.com/fastlane/scan"
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.author
|
27
|
+
"KrauseFx"
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.available_options
|
31
|
+
require 'scan'
|
32
|
+
Scan::Options.available_options
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.is_supported?(platform)
|
36
|
+
[:ios, :mac].include? platform
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -6,30 +6,18 @@ module Fastlane
|
|
6
6
|
|
7
7
|
class SnapshotAction < Action
|
8
8
|
def self.run(params)
|
9
|
-
$verbose = true if params[:verbose]
|
10
|
-
clean = !params[:noclean]
|
11
|
-
build = !params[:nobuild]
|
12
|
-
|
13
|
-
if Helper.test?
|
14
|
-
Actions.lane_context[SharedValues::SNAPSHOT_SCREENSHOTS_PATH] = Dir.pwd
|
15
|
-
return clean
|
16
|
-
end
|
17
|
-
|
18
9
|
require 'snapshot'
|
19
10
|
|
20
|
-
FastlaneCore::UpdateChecker.start_looking_for_update('snapshot') unless Helper.is_test?
|
21
|
-
|
22
|
-
ENV['SNAPSHOT_SKIP_OPEN_SUMMARY'] = "1" # it doesn't make sense to show the HTML page here
|
23
|
-
|
24
11
|
begin
|
25
|
-
|
26
|
-
|
27
|
-
|
12
|
+
FastlaneCore::UpdateChecker.start_looking_for_update('snapshot') unless Helper.is_test?
|
13
|
+
|
14
|
+
Snapshot.config = params
|
15
|
+
Snapshot::DependencyChecker.check_simulators
|
16
|
+
Snapshot::Runner.new.work
|
28
17
|
|
29
|
-
|
18
|
+
Actions.lane_context[SharedValues::SNAPSHOT_SCREENSHOTS_PATH] = File.expand_path(params[:output_directory]) # absolute URL
|
30
19
|
|
31
|
-
|
32
|
-
end
|
20
|
+
true
|
33
21
|
ensure
|
34
22
|
FastlaneCore::UpdateChecker.show_update_status('snapshot', Snapshot::VERSION)
|
35
23
|
end
|
@@ -40,30 +28,8 @@ module Fastlane
|
|
40
28
|
end
|
41
29
|
|
42
30
|
def self.available_options
|
43
|
-
|
44
|
-
|
45
|
-
env_name: "FL_SNAPSHOT_NO_CLEAN",
|
46
|
-
description: "Skips the clean process when building the app",
|
47
|
-
is_string: false,
|
48
|
-
default_value: false),
|
49
|
-
FastlaneCore::ConfigItem.new(key: :verbose,
|
50
|
-
env_name: "FL_SNAPSHOT_VERBOSE",
|
51
|
-
description: "Print out the UI Automation output",
|
52
|
-
is_string: false,
|
53
|
-
default_value: false),
|
54
|
-
FastlaneCore::ConfigItem.new(key: :snapshot_file_path,
|
55
|
-
env_name: "FL_SNAPSHOT_CONFIG_PATH",
|
56
|
-
description: "Specify a path to the directory containing the Snapfile",
|
57
|
-
default_value: FastlaneFolder.path || Dir.pwd, # defaults to fastlane folder
|
58
|
-
verify_block: proc do |value|
|
59
|
-
raise "Couldn't find folder '#{value}'. Make sure to pass the path to the directory not the file!".red unless File.directory?(value)
|
60
|
-
end),
|
61
|
-
FastlaneCore::ConfigItem.new(key: :nobuild,
|
62
|
-
env_name: "FL_SNAPSHOT_NO_BUILD",
|
63
|
-
description: "Skip the build process and use a pre-built .app under your build_dir",
|
64
|
-
is_string: false,
|
65
|
-
default_value: false)
|
66
|
-
]
|
31
|
+
require 'snapshot'
|
32
|
+
Snapshot::Options.available_options
|
67
33
|
end
|
68
34
|
|
69
35
|
def self.author
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Fastlane
|
2
|
+
module Actions
|
3
|
+
class SupplyAction < Action
|
4
|
+
def self.run(params)
|
5
|
+
require 'supply'
|
6
|
+
require 'supply/options'
|
7
|
+
|
8
|
+
begin
|
9
|
+
FastlaneCore::UpdateChecker.start_looking_for_update('supply') unless Helper.is_test?
|
10
|
+
|
11
|
+
params[:apk] ||= Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH]
|
12
|
+
|
13
|
+
Supply.config = params # we already have the finished config
|
14
|
+
|
15
|
+
Supply::Uploader.new.perform_upload
|
16
|
+
ensure
|
17
|
+
FastlaneCore::UpdateChecker.show_update_status('supply', Supply::VERSION)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
#####################################################
|
22
|
+
# @!group Documentation
|
23
|
+
#####################################################
|
24
|
+
|
25
|
+
def self.description
|
26
|
+
"Upload metadata, screenshots and binaries to Google Play"
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.details
|
30
|
+
"More information: https://github.com/fastlane/supply"
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.available_options
|
34
|
+
require 'supply'
|
35
|
+
require 'supply/options'
|
36
|
+
Supply::Options.available_options
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.output
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.return_value
|
43
|
+
# If you method provides a return value, you can describe here what it does
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.authors
|
47
|
+
# So no one will ever forget your contribution to fastlane :) You are awesome btw!
|
48
|
+
["KrauseFx"]
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.is_supported?(platform)
|
52
|
+
platform == :android
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -7,8 +7,7 @@ module Fastlane
|
|
7
7
|
class UpdateProjectProvisioningAction < Action
|
8
8
|
ROOT_CERTIFICATE_URL = "http://www.apple.com/appleca/AppleIncRootCertificate.cer"
|
9
9
|
def self.run(params)
|
10
|
-
Helper.log.info "You
|
11
|
-
Helper.log.info "Have you considered using the recommended way to do code sining?"
|
10
|
+
Helper.log.info "You’re updating provisioning profiles directly in your project, but have you considered easier ways to do code signing?"
|
12
11
|
Helper.log.info "https://github.com/KrauseFx/fastlane/blob/master/docs/CodeSigning.md"
|
13
12
|
|
14
13
|
# assign folder from parameter or search for xcodeproj file
|
@@ -0,0 +1,96 @@
|
|
1
|
+
module Fastlane
|
2
|
+
module Helper
|
3
|
+
class CrashlyticsHelper
|
4
|
+
class << self
|
5
|
+
def generate_ios_command(params)
|
6
|
+
raise "No value found for 'crashlytics_path'" unless params[:crashlytics_path]
|
7
|
+
raise "The crashlytics bundle must be of type .framework" unless params[:crashlytics_path].end_with?(".framework") || Helper.test?
|
8
|
+
|
9
|
+
command = []
|
10
|
+
command << File.join(params[:crashlytics_path], 'submit')
|
11
|
+
command << params[:api_token]
|
12
|
+
command << params[:build_secret]
|
13
|
+
command << "-ipaPath '#{params[:ipa_path]}'"
|
14
|
+
command << "-emails '#{params[:emails]}'" if params[:emails]
|
15
|
+
command << "-notesPath '#{params[:notes_path]}'" if params[:notes_path]
|
16
|
+
command << "-groupAliases '#{params[:groups]}'" if params[:groups]
|
17
|
+
command << "-notifications #{(params[:notifications] ? 'YES' : 'NO')}"
|
18
|
+
|
19
|
+
return command
|
20
|
+
end
|
21
|
+
|
22
|
+
def generate_android_command(params)
|
23
|
+
# We have to generate an empty XML file to make the crashlytics CLI happy :)
|
24
|
+
require 'tempfile'
|
25
|
+
xml = Tempfile.new('xml')
|
26
|
+
xml.write('<?xml version="1.0" encoding="utf-8"?><manifest></manifest>')
|
27
|
+
xml.close
|
28
|
+
|
29
|
+
params[:crashlytics_path] = download_android_tools unless params[:crashlytics_path]
|
30
|
+
|
31
|
+
raise "The `crashlytics_path` must be a jar file for Android" unless params[:crashlytics_path].end_with?(".jar") || Helper.test?
|
32
|
+
|
33
|
+
command = ["java"]
|
34
|
+
command << "-jar #{File.expand_path(params[:crashlytics_path])}"
|
35
|
+
command << "-androidRes ."
|
36
|
+
command << "-apiKey #{params[:api_token]}"
|
37
|
+
command << "-apiSecret #{params[:build_secret]}"
|
38
|
+
command << "-uploadDist '#{File.expand_path(params[:apk_path])}'"
|
39
|
+
command << "-androidManifest '#{xml.path}'"
|
40
|
+
|
41
|
+
# Optional
|
42
|
+
command << "-betaDistributionEmails '#{params[:emails]}'" if params[:emails]
|
43
|
+
command << "-betaDistributionReleaseNotesFilePath '#{params[:notes_path]}'" if params[:notes_path]
|
44
|
+
command << "-betaDistributionGroupAliases '#{params[:groups]}'" if params[:groups]
|
45
|
+
command << "-betaDistributionNotifications #{(params[:notifications] ? 'true' : 'false')}"
|
46
|
+
|
47
|
+
return command
|
48
|
+
end
|
49
|
+
|
50
|
+
def download_android_tools
|
51
|
+
containing = File.join(File.expand_path("~/Library"), "CrashlyticsAndroid")
|
52
|
+
zip_path = File.join(containing, "crashlytics-devtools.zip")
|
53
|
+
jar_path = File.join(containing, "crashlytics-devtools.jar")
|
54
|
+
return jar_path if File.exist?(jar_path)
|
55
|
+
|
56
|
+
url = "https://ssl-download-crashlytics-com.s3.amazonaws.com/android/ant/crashlytics.zip"
|
57
|
+
require 'net/http'
|
58
|
+
|
59
|
+
FileUtils.mkdir_p(containing)
|
60
|
+
|
61
|
+
begin
|
62
|
+
Helper.log.info "Downloading Crashlytics Support Library - this might take a minute...".yellow
|
63
|
+
|
64
|
+
result = Net::HTTP.get(URI(url))
|
65
|
+
File.write(zip_path, result)
|
66
|
+
|
67
|
+
# Now unzip the file
|
68
|
+
Action.sh "unzip '#{zip_path}' -d '#{containing}'"
|
69
|
+
|
70
|
+
raise "Coulnd't find 'crashlytics-devtools.jar'" unless File.exist?(jar_path)
|
71
|
+
|
72
|
+
Helper.log.info "Succesfully downloaded Crashlytics Support Library to '#{jar_path}'".green
|
73
|
+
rescue => ex
|
74
|
+
raise "Error fetching remote file: #{ex}"
|
75
|
+
end
|
76
|
+
|
77
|
+
return jar_path
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# java \
|
85
|
+
# -jar ~/Desktop/crashlytics-devtools.jar \
|
86
|
+
# -androidRes . \
|
87
|
+
# -uploadDist /Users/fkrause/AndroidStudioProjects/AppName/app/build/outputs/apk/app-release.apk \
|
88
|
+
# -androidManifest /Users/fkrause/Downloads/manifest.xml \
|
89
|
+
# -apiKey api_key \
|
90
|
+
# -apiSecret secret_key \
|
91
|
+
|
92
|
+
# -betaDistributionReleaseNotes "Yeah" \
|
93
|
+
# -betaDistributionEmails "something11@krausefx.com" \
|
94
|
+
# -betaDistributionGroupAliases "testgroup" \
|
95
|
+
# -betaDistributionNotifications false
|
96
|
+
# -projectPath . \
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Fastlane
|
2
|
+
module Helper
|
3
|
+
class GradleTask
|
4
|
+
attr_accessor :title
|
5
|
+
|
6
|
+
attr_accessor :description
|
7
|
+
|
8
|
+
def initialize(title: nil, description: nil)
|
9
|
+
self.title = title
|
10
|
+
self.description = description
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class GradleHelper
|
15
|
+
# Path to the gradle script
|
16
|
+
attr_accessor :gradle_path
|
17
|
+
|
18
|
+
# All the available tasks
|
19
|
+
attr_accessor :tasks
|
20
|
+
|
21
|
+
def initialize(gradle_path: nil)
|
22
|
+
self.gradle_path = gradle_path
|
23
|
+
end
|
24
|
+
|
25
|
+
# Run a certain action
|
26
|
+
def trigger(task: nil, flags: nil)
|
27
|
+
# raise "Could not find gradle task '#{task}' in the list of available tasks".red unless task_available?(task)
|
28
|
+
|
29
|
+
command = [gradle_path, task, flags].join(" ")
|
30
|
+
Action.sh(command)
|
31
|
+
end
|
32
|
+
|
33
|
+
def task_available?(task)
|
34
|
+
load_all_tasks
|
35
|
+
return tasks.collect(&:title).include?(task)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def load_all_tasks
|
41
|
+
self.tasks = []
|
42
|
+
|
43
|
+
command = [gradle_path, "tasks", "--console=plain"].join(" ")
|
44
|
+
output = Actions.sh(command, log: false)
|
45
|
+
output.split("\n").each do |line|
|
46
|
+
if (result = line.match(/(\w+)\s\-\s([\w\s]+)/))
|
47
|
+
self.tasks << GradleTask.new(title: result[1], description: result[2])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
self.tasks
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Fastlane
|
2
|
+
class Setup
|
3
|
+
# Start the setup process
|
4
|
+
def run
|
5
|
+
platform = nil
|
6
|
+
if is_ios?
|
7
|
+
Helper.log.info "Detected iOS/Mac project in current directory..."
|
8
|
+
platform = :ios
|
9
|
+
elsif is_android?
|
10
|
+
Helper.log.info "Detected Android project in current directory..."
|
11
|
+
platform = :android
|
12
|
+
else
|
13
|
+
Helper.log.info "Couldn't automatically detect the platform"
|
14
|
+
val = agree("Is this project an iOS project? (y/n) ".yellow, true)
|
15
|
+
platform = (val ? :ios : :android)
|
16
|
+
end
|
17
|
+
|
18
|
+
if platform == :ios
|
19
|
+
SetupIos.new.run
|
20
|
+
elsif platform == :android
|
21
|
+
SetupAndroid.new.run
|
22
|
+
else
|
23
|
+
raise "Couldn't find platform '#{platform}'"
|
24
|
+
end
|
25
|
+
ask_for_crash_reporting
|
26
|
+
end
|
27
|
+
|
28
|
+
def is_ios?
|
29
|
+
(Dir["*.xcodeproj"] + Dir["*.xcworkspace"]).count > 0
|
30
|
+
end
|
31
|
+
|
32
|
+
def is_android?
|
33
|
+
Dir["*.gradle"].count > 0
|
34
|
+
end
|
35
|
+
|
36
|
+
def show_analytics
|
37
|
+
Helper.log.info "fastlane will send the number of errors for each action to"
|
38
|
+
Helper.log.info "https://github.com/fastlane/enhancer to detect integration issues"
|
39
|
+
Helper.log.info "No sensitive/private information will be uploaded"
|
40
|
+
Helper.log.info("You can disable this by adding `opt_out_usage` to your Fastfile")
|
41
|
+
end
|
42
|
+
|
43
|
+
def ask_for_crash_reporting
|
44
|
+
FastlaneCore::CrashReporting.ask_during_setup
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
require 'fastlane/setup/setup_ios'
|
50
|
+
require 'fastlane/setup/setup_android'
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Fastlane
|
2
|
+
class SetupAndroid < Setup
|
3
|
+
def run
|
4
|
+
if FastlaneFolder.setup? and !Helper.is_test?
|
5
|
+
Helper.log.info "Fastlane already set up at path #{folder}".yellow
|
6
|
+
return
|
7
|
+
end
|
8
|
+
|
9
|
+
response = agree('Do you have everything commited in version control? If not please do so now! (y/n)'.yellow, true)
|
10
|
+
return unless response
|
11
|
+
|
12
|
+
FastlaneFolder.create_folder! unless Helper.is_test?
|
13
|
+
FileUtils.mkdir(File.join(folder, 'actions')) unless File.directory?(File.join(folder, 'actions'))
|
14
|
+
generate_appfile
|
15
|
+
generate_fastfile
|
16
|
+
show_analytics
|
17
|
+
|
18
|
+
init_supply
|
19
|
+
|
20
|
+
Helper.log.info 'Successfully finished setting up fastlane'.green
|
21
|
+
end
|
22
|
+
|
23
|
+
def generate_appfile
|
24
|
+
Helper.log.info '------------------------------'
|
25
|
+
Helper.log.info 'To not re-enter your packagename and issuer every time you run one of the fastlane tools or fastlane, these will be stored in a so-called Appfile.'.green
|
26
|
+
|
27
|
+
package_name = ask('Package Name (com.krausefx.app): '.yellow)
|
28
|
+
puts ""
|
29
|
+
puts "To automatically upload builds and metadata to Google Play, fastlane needs an issuer and keyfile".yellow
|
30
|
+
puts "Feel free to just click Enter to skip not provide certain things"
|
31
|
+
puts "Follow the Setup Guide on how to get the Issuer: https://github.com/fastlane/supply#setup".yellow
|
32
|
+
puts "The issuer email looks like this: 137123276006-aaaeltp0aqgn2opfb7tk46ovaaa3hv1g@developer.gserviceaccount.com".yellow
|
33
|
+
issuer = ask('Issuer: '.yellow)
|
34
|
+
keyfile = ask('Path to the key file: '.yellow)
|
35
|
+
|
36
|
+
template = File.read("#{Helper.gem_path('fastlane')}/lib/assets/AppfileTemplateAndroid")
|
37
|
+
template.gsub!('[[ISSUER]]', issuer)
|
38
|
+
template.gsub!('[[KEYFILE]]', keyfile)
|
39
|
+
template.gsub!('[[PACKAGE_NAME]]', package_name)
|
40
|
+
path = File.join(folder, 'Appfile')
|
41
|
+
File.write(path, template)
|
42
|
+
Helper.log.info "Created new file '#{path}'. Edit it to manage your preferred app metadata information.".green
|
43
|
+
end
|
44
|
+
|
45
|
+
def generate_fastfile
|
46
|
+
template = File.read("#{Helper.gem_path('fastlane')}/lib/assets/FastfileTemplateAndroid")
|
47
|
+
|
48
|
+
template.gsub!('[[FASTLANE_VERSION]]', Fastlane::VERSION)
|
49
|
+
|
50
|
+
path = File.join(folder, 'Fastfile')
|
51
|
+
File.write(path, template)
|
52
|
+
Helper.log.info "Created new file '#{path}'. Edit it to manage your own deployment lanes.".green
|
53
|
+
end
|
54
|
+
|
55
|
+
def init_supply
|
56
|
+
Helper.log.info ""
|
57
|
+
question = "Do you plan on uploading metadata, screenshots and builds to Google Play using fastlane?".yellow
|
58
|
+
Helper.log.info question
|
59
|
+
Helper.log.info "This will download your existing metadata and screenshots into the `fastlane` folder"
|
60
|
+
if agree(question + " (y/n) ", true)
|
61
|
+
begin
|
62
|
+
require 'supply'
|
63
|
+
require 'supply/setup'
|
64
|
+
Supply.config = FastlaneCore::Configuration.create(Supply::Options.available_options, {})
|
65
|
+
Supply::Setup.new.perform_download
|
66
|
+
rescue => ex
|
67
|
+
Helper.log.error ex.to_s
|
68
|
+
Helper.log.error "supply failed, but don't worry, you can launch supply using `supply init` whenever you want.".red
|
69
|
+
end
|
70
|
+
else
|
71
|
+
Helper.log.info "You can run `supply init` to do so at a later point.".green
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def folder
|
76
|
+
FastlaneFolder.path
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Fastlane
|
2
|
-
class Setup
|
2
|
+
class SetupIos < Setup
|
3
3
|
# the tools that are already enabled
|
4
4
|
attr_reader :tools
|
5
5
|
|
@@ -12,17 +12,17 @@ module Fastlane
|
|
12
12
|
show_infos
|
13
13
|
response = agree('Do you want to get started? This will move your Deliverfile and Snapfile (if they exist) (y/n)'.yellow, true)
|
14
14
|
return unless response
|
15
|
-
response = agree('Do you have everything commited in version control? If not please do so! (y/n)'.yellow, true)
|
15
|
+
response = agree('Do you have everything commited in version control? If not please do so now! (y/n)'.yellow, true)
|
16
16
|
return unless response
|
17
17
|
|
18
18
|
# rubocop:disable Lint/RescueException
|
19
19
|
begin
|
20
20
|
FastlaneFolder.create_folder! unless Helper.is_test?
|
21
21
|
copy_existing_files
|
22
|
-
|
22
|
+
generate_appfile
|
23
23
|
detect_installed_tools # after copying the existing files
|
24
24
|
ask_to_enable_other_tools
|
25
|
-
FileUtils.mkdir(File.join(
|
25
|
+
FileUtils.mkdir(File.join(FastlaneFolder.path, 'actions'))
|
26
26
|
generate_fastfile
|
27
27
|
show_analytics
|
28
28
|
Helper.log.info 'Successfully finished setting up fastlane'.green
|
@@ -44,13 +44,6 @@ module Fastlane
|
|
44
44
|
Helper.log.info 'the tool automatically for you. Have fun! '.green
|
45
45
|
end
|
46
46
|
|
47
|
-
def show_analytics
|
48
|
-
Helper.log.info "fastlane will send the number of errors for each action to"
|
49
|
-
Helper.log.info "https://github.com/fastlane/enhancer to detect integration issues"
|
50
|
-
Helper.log.info "No sensitive/private information will be uploaded"
|
51
|
-
Helper.log.info("You can disable this by adding `opt_out_usage` to your Fastfile")
|
52
|
-
end
|
53
|
-
|
54
47
|
def files_to_copy
|
55
48
|
['Deliverfile', 'Snapfile', 'deliver', 'snapshot.js', 'snapshot-iPad.js', 'SnapshotHelper.js', 'screenshots']
|
56
49
|
end
|
@@ -66,7 +59,7 @@ module Fastlane
|
|
66
59
|
end
|
67
60
|
end
|
68
61
|
|
69
|
-
def
|
62
|
+
def generate_appfile
|
70
63
|
Helper.log.info '------------------------------'
|
71
64
|
Helper.log.info 'To not re-enter your username and app identifier every time you run one of the fastlane tools or fastlane, these will be stored from now on.'.green
|
72
65
|
|
@@ -92,16 +85,10 @@ module Fastlane
|
|
92
85
|
end
|
93
86
|
|
94
87
|
def ask_to_enable_other_tools
|
95
|
-
if @tools[:deliver]
|
96
|
-
# deliver already enabled
|
97
|
-
Helper.log.info '-------------------------------------------------------------------------------------------'
|
88
|
+
if @tools[:deliver] # deliver already enabled
|
98
89
|
Helper.log.info 'Since all files are moved into the `fastlane` subfolder, you have to adapt your Deliverfile'.yellow
|
99
|
-
Helper.log.info 'Update your `ipa` and `beta_ipa` block of your Deliverfile to go a folder up before building'.yellow
|
100
|
-
Helper.log.info "e.g. `system('cd ..; ipa build')`".yellow
|
101
|
-
Helper.log.info 'Please read the above carefully and hit Enter to confirm.'.green
|
102
|
-
STDIN.gets unless Helper.is_test?
|
103
90
|
else
|
104
|
-
if agree("Do you want to setup 'deliver', which is used to upload app screenshots, app metadata and app updates to the App Store? (y/n)".yellow, true)
|
91
|
+
if agree("Do you want to setup 'deliver', which is used to upload app screenshots, app metadata and app updates to the App Store? This requires the app to be in the App Store already. (y/n)".yellow, true)
|
105
92
|
Helper.log.info "Loading up 'deliver', this might take a few seconds"
|
106
93
|
require 'deliver'
|
107
94
|
require 'deliver/setup'
|
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.34.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: 2015-10-
|
11
|
+
date: 2015-10-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -176,7 +176,7 @@ dependencies:
|
|
176
176
|
requirements:
|
177
177
|
- - ">="
|
178
178
|
- !ruby/object:Gem::Version
|
179
|
-
version: 0.25.
|
179
|
+
version: 0.25.2
|
180
180
|
- - "<"
|
181
181
|
- !ruby/object:Gem::Version
|
182
182
|
version: 1.0.0
|
@@ -186,7 +186,7 @@ dependencies:
|
|
186
186
|
requirements:
|
187
187
|
- - ">="
|
188
188
|
- !ruby/object:Gem::Version
|
189
|
-
version: 0.25.
|
189
|
+
version: 0.25.2
|
190
190
|
- - "<"
|
191
191
|
- !ruby/object:Gem::Version
|
192
192
|
version: 1.0.0
|
@@ -196,7 +196,7 @@ dependencies:
|
|
196
196
|
requirements:
|
197
197
|
- - ">="
|
198
198
|
- !ruby/object:Gem::Version
|
199
|
-
version: 0.
|
199
|
+
version: 0.10.0
|
200
200
|
- - "<"
|
201
201
|
- !ruby/object:Gem::Version
|
202
202
|
version: 1.0.0
|
@@ -206,7 +206,7 @@ dependencies:
|
|
206
206
|
requirements:
|
207
207
|
- - ">="
|
208
208
|
- !ruby/object:Gem::Version
|
209
|
-
version: 0.
|
209
|
+
version: 0.10.0
|
210
210
|
- - "<"
|
211
211
|
- !ruby/object:Gem::Version
|
212
212
|
version: 1.0.0
|
@@ -216,7 +216,7 @@ dependencies:
|
|
216
216
|
requirements:
|
217
217
|
- - ">="
|
218
218
|
- !ruby/object:Gem::Version
|
219
|
-
version: 0.12.
|
219
|
+
version: 0.12.2
|
220
220
|
- - "<"
|
221
221
|
- !ruby/object:Gem::Version
|
222
222
|
version: 1.0.0
|
@@ -226,7 +226,7 @@ dependencies:
|
|
226
226
|
requirements:
|
227
227
|
- - ">="
|
228
228
|
- !ruby/object:Gem::Version
|
229
|
-
version: 0.12.
|
229
|
+
version: 0.12.2
|
230
230
|
- - "<"
|
231
231
|
- !ruby/object:Gem::Version
|
232
232
|
version: 1.0.0
|
@@ -236,7 +236,7 @@ dependencies:
|
|
236
236
|
requirements:
|
237
237
|
- - ">="
|
238
238
|
- !ruby/object:Gem::Version
|
239
|
-
version: 1.3.
|
239
|
+
version: 1.3.3
|
240
240
|
- - "<"
|
241
241
|
- !ruby/object:Gem::Version
|
242
242
|
version: 2.0.0
|
@@ -246,7 +246,7 @@ dependencies:
|
|
246
246
|
requirements:
|
247
247
|
- - ">="
|
248
248
|
- !ruby/object:Gem::Version
|
249
|
-
version: 1.3.
|
249
|
+
version: 1.3.3
|
250
250
|
- - "<"
|
251
251
|
- !ruby/object:Gem::Version
|
252
252
|
version: 2.0.0
|
@@ -256,20 +256,20 @@ dependencies:
|
|
256
256
|
requirements:
|
257
257
|
- - ">="
|
258
258
|
- !ruby/object:Gem::Version
|
259
|
-
version: 0.
|
259
|
+
version: 1.0.0
|
260
260
|
- - "<"
|
261
261
|
- !ruby/object:Gem::Version
|
262
|
-
version:
|
262
|
+
version: 2.0.0
|
263
263
|
type: :runtime
|
264
264
|
prerelease: false
|
265
265
|
version_requirements: !ruby/object:Gem::Requirement
|
266
266
|
requirements:
|
267
267
|
- - ">="
|
268
268
|
- !ruby/object:Gem::Version
|
269
|
-
version: 0.
|
269
|
+
version: 1.0.0
|
270
270
|
- - "<"
|
271
271
|
- !ruby/object:Gem::Version
|
272
|
-
version:
|
272
|
+
version: 2.0.0
|
273
273
|
- !ruby/object:Gem::Dependency
|
274
274
|
name: frameit
|
275
275
|
requirement: !ruby/object:Gem::Requirement
|
@@ -410,6 +410,46 @@ dependencies:
|
|
410
410
|
- - "<"
|
411
411
|
- !ruby/object:Gem::Version
|
412
412
|
version: 2.0.0
|
413
|
+
- !ruby/object:Gem::Dependency
|
414
|
+
name: supply
|
415
|
+
requirement: !ruby/object:Gem::Requirement
|
416
|
+
requirements:
|
417
|
+
- - ">="
|
418
|
+
- !ruby/object:Gem::Version
|
419
|
+
version: 0.1.0
|
420
|
+
- - "<"
|
421
|
+
- !ruby/object:Gem::Version
|
422
|
+
version: 1.0.0
|
423
|
+
type: :runtime
|
424
|
+
prerelease: false
|
425
|
+
version_requirements: !ruby/object:Gem::Requirement
|
426
|
+
requirements:
|
427
|
+
- - ">="
|
428
|
+
- !ruby/object:Gem::Version
|
429
|
+
version: 0.1.0
|
430
|
+
- - "<"
|
431
|
+
- !ruby/object:Gem::Version
|
432
|
+
version: 1.0.0
|
433
|
+
- !ruby/object:Gem::Dependency
|
434
|
+
name: scan
|
435
|
+
requirement: !ruby/object:Gem::Requirement
|
436
|
+
requirements:
|
437
|
+
- - ">="
|
438
|
+
- !ruby/object:Gem::Version
|
439
|
+
version: 0.1.0
|
440
|
+
- - "<"
|
441
|
+
- !ruby/object:Gem::Version
|
442
|
+
version: 1.0.0
|
443
|
+
type: :runtime
|
444
|
+
prerelease: false
|
445
|
+
version_requirements: !ruby/object:Gem::Requirement
|
446
|
+
requirements:
|
447
|
+
- - ">="
|
448
|
+
- !ruby/object:Gem::Version
|
449
|
+
version: 0.1.0
|
450
|
+
- - "<"
|
451
|
+
- !ruby/object:Gem::Version
|
452
|
+
version: 1.0.0
|
413
453
|
- !ruby/object:Gem::Dependency
|
414
454
|
name: bundler
|
415
455
|
requirement: !ruby/object:Gem::Requirement
|
@@ -534,7 +574,9 @@ files:
|
|
534
574
|
- README.md
|
535
575
|
- bin/fastlane
|
536
576
|
- lib/assets/AppfileTemplate
|
577
|
+
- lib/assets/AppfileTemplateAndroid
|
537
578
|
- lib/assets/FastfileTemplate
|
579
|
+
- lib/assets/FastfileTemplateAndroid
|
538
580
|
- lib/assets/custom_action_template.rb
|
539
581
|
- lib/assets/mailgun_html_template.erb
|
540
582
|
- lib/assets/s3_html_template.erb
|
@@ -581,6 +623,7 @@ files:
|
|
581
623
|
- lib/fastlane/actions/git_branch.rb
|
582
624
|
- lib/fastlane/actions/git_commit.rb
|
583
625
|
- lib/fastlane/actions/git_pull.rb
|
626
|
+
- lib/fastlane/actions/gradle.rb
|
584
627
|
- lib/fastlane/actions/gym.rb
|
585
628
|
- lib/fastlane/actions/hg_add_tag.rb
|
586
629
|
- lib/fastlane/actions/hg_commit_version_bump.rb
|
@@ -618,6 +661,7 @@ files:
|
|
618
661
|
- lib/fastlane/actions/restore_file.rb
|
619
662
|
- lib/fastlane/actions/s3.rb
|
620
663
|
- lib/fastlane/actions/say.rb
|
664
|
+
- lib/fastlane/actions/scan.rb
|
621
665
|
- lib/fastlane/actions/set_build_number_repository.rb
|
622
666
|
- lib/fastlane/actions/set_changelog.rb
|
623
667
|
- lib/fastlane/actions/set_github_release.rb
|
@@ -627,6 +671,7 @@ files:
|
|
627
671
|
- lib/fastlane/actions/slather.rb
|
628
672
|
- lib/fastlane/actions/snapshot.rb
|
629
673
|
- lib/fastlane/actions/splunkmint.rb
|
674
|
+
- lib/fastlane/actions/supply.rb
|
630
675
|
- lib/fastlane/actions/team_id.rb
|
631
676
|
- lib/fastlane/actions/team_name.rb
|
632
677
|
- lib/fastlane/actions/testflight.rb
|
@@ -655,8 +700,10 @@ files:
|
|
655
700
|
- lib/fastlane/fast_file.rb
|
656
701
|
- lib/fastlane/fastlane_folder.rb
|
657
702
|
- lib/fastlane/helper/README.md
|
703
|
+
- lib/fastlane/helper/crashlytics_helper.rb
|
658
704
|
- lib/fastlane/helper/gem_helper.rb
|
659
705
|
- lib/fastlane/helper/git_helper.rb
|
706
|
+
- lib/fastlane/helper/gradle_helper.rb
|
660
707
|
- lib/fastlane/helper/podspec_helper.rb
|
661
708
|
- lib/fastlane/helper/sh_helper.rb
|
662
709
|
- lib/fastlane/junit_generator.rb
|
@@ -666,7 +713,9 @@ files:
|
|
666
713
|
- lib/fastlane/new_action.rb
|
667
714
|
- lib/fastlane/one_off.rb
|
668
715
|
- lib/fastlane/runner.rb
|
669
|
-
- lib/fastlane/setup.rb
|
716
|
+
- lib/fastlane/setup/setup.rb
|
717
|
+
- lib/fastlane/setup/setup_android.rb
|
718
|
+
- lib/fastlane/setup/setup_ios.rb
|
670
719
|
- lib/fastlane/supported_platforms.rb
|
671
720
|
- lib/fastlane/version.rb
|
672
721
|
homepage: https://fastlane.tools
|