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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5bf032ee79e5272595f8fad733a84939344e00e1
4
- data.tar.gz: 37cf99462ac600366d32a3996ac93b52f79ffc6e
3
+ metadata.gz: 60bb8f2003e94f587d350a0fd71db4809875fc16
4
+ data.tar.gz: c542b96abc2e3705fa3a6ccb8449bada06f452ea
5
5
  SHA512:
6
- metadata.gz: 6b269f28f9c4dde0b7a5406de95bccf439a27190ee8b1edd0f09f346cc5e337a417ee71627f499223b21250fcde7a8d2bb770591f2bed4969b6845561b8c2675
7
- data.tar.gz: f454bb4f446c1be1e455fb510ff8c61fb96ee81361c4e28e5035e046bbe86b9fe2ffd4783bb0c9ef75b805f550343a37eca2b36a4986bca7a89f13f7cf0d4fba
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 the `fastlane` suite:
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 trigger [lane]'
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.path
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)
@@ -0,0 +1,3 @@
1
+ issuer "[[ISSUER]]" # Follow https://github.com/fastlane/supply#setup to get one
2
+ keyfile "[[KEYFILE]]" # Path to the keyfile
3
+ package_name "[[PACKAGE_NAME]]" # e.g. com.krausefx.app
@@ -77,5 +77,6 @@ platform :ios do
77
77
  end
78
78
 
79
79
 
80
- # More information about multiple platforms in fastlane:
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
- # We need to store it in a file, because the crashlytics CLI says so
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
- notes_path = File.join("/tmp", "#{Time.now.to_i}_changelog.txt")
15
- File.write(notes_path, params[:notes])
16
- params[:notes_path] = notes_path # we can only set it *after* writing the file there
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
- command = []
20
- command << File.join(params[:crashlytics_path], 'submit')
21
- command << params[:api_token]
22
- command << params[:build_secret]
23
- command << "-ipaPath '#{params[:ipa_path]}'"
24
- command << "-emails '#{params[:emails]}'" if params[:emails]
25
- command << "-notesPath '#{params[:notes_path]}'" if params[:notes_path]
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 "No Crashlytics path given or found, pass using `crashlytics_path: 'path'`".red unless File.exist?(value)
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 `ipa` or `xcodebuild` action",
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
@@ -41,6 +41,10 @@ module Fastlane
41
41
  "More information: https://github.com/fastlane/gym"
42
42
  end
43
43
 
44
+ def self.return_value
45
+ "The absolute path to the generated ipa file"
46
+ end
47
+
44
48
  def self.author
45
49
  "KrauseFx"
46
50
  end
@@ -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 `ipa` or `xcodebuild` action. For Mac zip the .app",
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 `ipa` or `xcodebuild` action",
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
- Dir.chdir(params[:snapshot_file_path] || FastlaneFolder.path) do
26
- Snapshot::SnapshotConfig.shared_instance
27
- Snapshot::Runner.new.work(clean: clean, build: build)
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
- results_path = Snapshot::SnapshotConfig.shared_instance.screenshots_path
18
+ Actions.lane_context[SharedValues::SNAPSHOT_SCREENSHOTS_PATH] = File.expand_path(params[:output_directory]) # absolute URL
30
19
 
31
- Actions.lane_context[SharedValues::SNAPSHOT_SCREENSHOTS_PATH] = File.expand_path(results_path) # absolute URL
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
- FastlaneCore::ConfigItem.new(key: :noclean,
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
@@ -18,7 +18,12 @@ module Fastlane
18
18
  "produce",
19
19
  "cert",
20
20
  "codes",
21
- "credentials_manager"
21
+ "credentials_manager",
22
+ "gym",
23
+ "spaceship",
24
+ "pilot",
25
+ "supply",
26
+ "scan"
22
27
  ]
23
28
 
24
29
  def self.run(options)
@@ -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 shouldn't use update_project_provisioning"
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
- generate_app_metadata
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(folder, 'actions'))
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 generate_app_metadata
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'
@@ -1,3 +1,3 @@
1
1
  module Fastlane
2
- VERSION = '1.33.6'
2
+ VERSION = '1.34.0'
3
3
  end
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.33.6
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-20 00:00:00.000000000 Z
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.1
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.1
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.9.1
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.9.1
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.1
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.1
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.2
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.2
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.10.2
259
+ version: 1.0.0
260
260
  - - "<"
261
261
  - !ruby/object:Gem::Version
262
- version: 1.0.0
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.10.2
269
+ version: 1.0.0
270
270
  - - "<"
271
271
  - !ruby/object:Gem::Version
272
- version: 1.0.0
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