fastlane 0.6.1 → 0.7.0

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.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/bin/fastlane +25 -7
  3. data/lib/assets/custom_action_template.rb +35 -2
  4. data/lib/fastlane.rb +1 -3
  5. data/lib/fastlane/action.rb +37 -0
  6. data/lib/fastlane/actions/{README → README.md} +1 -1
  7. data/lib/fastlane/actions/add_git_tag.rb +18 -1
  8. data/lib/fastlane/actions/cert.rb +38 -18
  9. data/lib/fastlane/actions/clean_build_artifacts.rb +9 -1
  10. data/lib/fastlane/actions/commit_version_bump.rb +16 -1
  11. data/lib/fastlane/actions/crashlytics.rb +21 -1
  12. data/lib/fastlane/actions/deliver.rb +31 -13
  13. data/lib/fastlane/actions/deploygate.rb +26 -1
  14. data/lib/fastlane/actions/ensure_git_status_clean.rb +15 -1
  15. data/lib/fastlane/actions/fastlane_version.rb +9 -1
  16. data/lib/fastlane/actions/frameit.rb +20 -10
  17. data/lib/fastlane/actions/gcovr.rb +35 -1
  18. data/lib/fastlane/actions/hipchat.rb +19 -1
  19. data/lib/fastlane/actions/hockey.rb +27 -1
  20. data/lib/fastlane/actions/increment_build_number.rb +22 -1
  21. data/lib/fastlane/actions/increment_version_number.rb +30 -1
  22. data/lib/fastlane/actions/install_carthage.rb +9 -1
  23. data/lib/fastlane/actions/install_cocapods.rb +5 -1
  24. data/lib/fastlane/actions/ipa.rb +52 -13
  25. data/lib/fastlane/actions/notify.rb +9 -1
  26. data/lib/fastlane/actions/produce.rb +50 -8
  27. data/lib/fastlane/actions/push_to_git_remote.rb +18 -1
  28. data/lib/fastlane/actions/register_devices.rb +18 -1
  29. data/lib/fastlane/actions/reset_git_repo.rb +24 -1
  30. data/lib/fastlane/actions/resign.rb +17 -1
  31. data/lib/fastlane/actions/s3.rb +30 -2
  32. data/lib/fastlane/actions/say.rb +5 -1
  33. data/lib/fastlane/actions/sigh.rb +22 -6
  34. data/lib/fastlane/actions/slack.rb +19 -4
  35. data/lib/fastlane/actions/snapshot.rb +27 -6
  36. data/lib/fastlane/actions/team_id.rb +9 -1
  37. data/lib/fastlane/actions/team_name.rb +9 -1
  38. data/lib/fastlane/actions/testmunk.rb +17 -4
  39. data/lib/fastlane/actions/typetalk.rb +19 -1
  40. data/lib/fastlane/actions/update_project_code_signing.rb +13 -1
  41. data/lib/fastlane/actions/xcode_select.rb +10 -2
  42. data/lib/fastlane/actions/xcodebuild.rb +88 -8
  43. data/lib/fastlane/actions/xctool.rb +16 -1
  44. data/lib/fastlane/actions_list.rb +130 -0
  45. data/lib/fastlane/core_ext/string.rb +8 -0
  46. data/lib/fastlane/lane_manager.rb +17 -1
  47. data/lib/fastlane/version.rb +1 -1
  48. metadata +35 -19
@@ -4,7 +4,7 @@ module Fastlane
4
4
  PRODUCE_APPLE_ID = :PRODUCE_APPLE_ID
5
5
  end
6
6
 
7
- class ProduceAction
7
+ class ProduceAction < Action
8
8
  def self.run(params)
9
9
  require 'produce'
10
10
 
@@ -17,18 +17,60 @@ module Fastlane
17
17
 
18
18
  return if Helper.test?
19
19
 
20
- Dir.chdir(FastlaneFolder.path || Dir.pwd) do
21
- # This should be executed in the fastlane folder
20
+ FastlaneCore::UpdateChecker.start_looking_for_update('produce')
22
21
 
23
- CredentialsManager::PasswordManager.shared_manager(ENV['PRODUCE_USERNAME']) if ENV['PRODUCE_USERNAME']
24
- Produce::Config.shared_config # to ask for missing information right in the beginning
22
+ begin
23
+ Dir.chdir(FastlaneFolder.path || Dir.pwd) do
24
+ # This should be executed in the fastlane folder
25
25
 
26
- apple_id = Produce::Manager.start_producing.to_s
26
+ CredentialsManager::PasswordManager.shared_manager(ENV['PRODUCE_USERNAME']) if ENV['PRODUCE_USERNAME']
27
+ Produce::Config.shared_config # to ask for missing information right in the beginning
27
28
 
28
- Actions.lane_context[SharedValues::PRODUCE_APPLE_ID] = apple_id
29
- ENV['PRODUCE_APPLE_ID'] = apple_id
29
+ apple_id = Produce::Manager.start_producing.to_s
30
+
31
+ Actions.lane_context[SharedValues::PRODUCE_APPLE_ID] = apple_id
32
+ ENV['PRODUCE_APPLE_ID'] = apple_id
33
+ end
34
+ ensure
35
+ FastlaneCore::UpdateChecker.show_update_status('produce', Produce::VERSION)
30
36
  end
31
37
  end
38
+
39
+ def self.description
40
+ "Makes sure the given app identifier is created on the Dev Portal"
41
+ end
42
+
43
+ def details
44
+ [
45
+ 'For more information about produce, visit its GitHub page:',
46
+ 'https://github.com/KrauseFx/produce'
47
+ ].join(' ')
48
+ end
49
+
50
+ def self.available_options
51
+ [
52
+ ['produce_app_identifier', 'The App Identifier of your app', 'PRODUCE_APP_IDENTIFIER'],
53
+ ['produce_app_name', 'The name of your app', 'PRODUCE_APP_NAME'],
54
+ ['produce_language', 'The app\'s default language', 'PRODUCE_LANGUAGE'],
55
+ ['produce_version', 'The initial version of your app', 'PRODUCE_VERSION'],
56
+ ['produce_sku', 'The SKU number of the app if it gets created', 'PRODUCE_SKU'],
57
+ ['produce_team_name', 'optional: the name of your team', 'PRODUCE_TEAM_NAME'],
58
+ ['produce_team_id', 'optional: the ID of your team', 'PRODUCE_TEAM_ID'],
59
+ ['produce_username', 'optional: your Apple ID', 'PRODUCE_USERNAME'],
60
+ ['skip_itc', 'Skip the creation on iTunes Connect', 'PRODUCE_SKIP_ITC'],
61
+ ['skip_devcenter', 'Skip the creation on the Apple Developer Portal', 'PRODUCE_SKIP_DEVCENTER']
62
+ ]
63
+ end
64
+
65
+ def self.output
66
+ [
67
+ ['PRODUCE_APPLE_ID', 'The Apple ID of the newly created app. You probably need it for `deliver`']
68
+ ]
69
+ end
70
+
71
+ def self.author
72
+ "KrauseFx"
73
+ end
32
74
  end
33
75
  end
34
76
  end
@@ -1,7 +1,7 @@
1
1
  module Fastlane
2
2
  module Actions
3
3
  # Adds a git tag to the current commit
4
- class PushToGitRemoteAction
4
+ class PushToGitRemoteAction < Action
5
5
  def self.run(params)
6
6
  options = params.first
7
7
 
@@ -28,6 +28,23 @@ module Fastlane
28
28
 
29
29
  Helper.log.info 'Sucesfully pushed to remote.'
30
30
  end
31
+
32
+ def self.description
33
+ "Push local changes to the remote branch"
34
+ end
35
+
36
+ def self.available_options
37
+ [
38
+ ['remote', 'The remote to push to. Defaults to `origin`'],
39
+ ['branch', 'The local branch to push from. Defaults to the current branch'],
40
+ ['branch', 'The remote branch to push to. Defaults to the local branch'],
41
+ ['force', 'Force push to remote. Defaults to false']
42
+ ]
43
+ end
44
+
45
+ def self.author
46
+ "lmirosevic"
47
+ end
31
48
  end
32
49
  end
33
50
  end
@@ -1,6 +1,6 @@
1
1
  module Fastlane
2
2
  module Actions
3
- class RegisterDevicesAction
3
+ class RegisterDevicesAction < Action
4
4
  UDID_REGEXP = /^\h{40}$/
5
5
 
6
6
  def self.run(params)
@@ -58,6 +58,23 @@ module Fastlane
58
58
  Helper.log.info "Device list up to date, all #{device_objs.count} devices are already registered. Total devices registed: #{existing_devices.count}.".green
59
59
  end
60
60
  end
61
+
62
+ def self.description
63
+ "Registers new devices to the Apple Dev Portal"
64
+ end
65
+
66
+ def self.available_options
67
+ [
68
+ ['devices', 'A hash of devices, with the name as key and the UDID as value'],
69
+ ['device_file', 'Instead, you can proide a path containing all UDIDs'],
70
+ ['team_id', 'optional: Your team ID'],
71
+ ['username', 'optional: Your Apple ID']
72
+ ]
73
+ end
74
+
75
+ def self.author
76
+ "lmirosevic"
77
+ end
61
78
  end
62
79
  end
63
80
  end
@@ -1,7 +1,7 @@
1
1
  module Fastlane
2
2
  module Actions
3
3
  # Does a hard reset and clean on the repo
4
- class ResetGitRepoAction
4
+ class ResetGitRepoAction < Action
5
5
  def self.run(params)
6
6
  hash = params.first
7
7
  if params.include?(:force) || hash[:force] || Actions.lane_context[SharedValues::GIT_REPO_WAS_CLEAN_ON_START]
@@ -22,6 +22,29 @@ module Fastlane
22
22
  raise 'This is a destructive and potentially dangerous action. To protect from data loss, please add the `ensure_git_status_clean` action to the beginning of your lane, or if you\'re absolutely sure of what you\'re doing then call this action with the :force option.'.red
23
23
  end
24
24
  end
25
+
26
+ def self.description
27
+ "Resets git repo to a clean state by discarding uncommited changes"
28
+ end
29
+
30
+ def self.details
31
+ [
32
+ "This action will reset your git repo to a clean state, discarding any uncommitted and untracked changes. Useful in case you need to revert the repo back to a clean state, e.g. after the fastlane run.",
33
+ "It's a pretty drastic action so it comes with a sort of safety latch. It will only proceed with the reset if either of these conditions are met:",
34
+ "You have called the ensure_git_status_clean action prior to calling this action. This ensures that your repo started off in a clean state, so the only things that will get destroyed by this action are files that are created as a byproduct of the fastlane run."
35
+ ].join(' ')
36
+ end
37
+
38
+ def self.available_options
39
+ [
40
+ ['files', 'Array of files the changes should be discarded from. If not given, all files will be discarded'],
41
+ ['force', 'Skip verifying of previously clean state of repo. Only recommended in combination with `files` option']
42
+ ]
43
+ end
44
+
45
+ def self.author
46
+ 'lmirosevic'
47
+ end
25
48
  end
26
49
  end
27
50
  end
@@ -1,7 +1,7 @@
1
1
  module Fastlane
2
2
  module Actions
3
3
  # Resigns the ipa
4
- class ResignAction
4
+ class ResignAction < Action
5
5
  def self.run(params)
6
6
  require 'sigh'
7
7
 
@@ -24,6 +24,22 @@ module Fastlane
24
24
  raise 'Failed to re-sign .ipa'.red
25
25
  end
26
26
  end
27
+
28
+ def self.description
29
+ "Code sign an existing API"
30
+ end
31
+
32
+ def self.available_options
33
+ [
34
+ ['ipa', 'Path to the ipa file to resign. Optional if you use the `ipa` or `xcodebuild` action'],
35
+ ['signing_identity', 'Code signing identity to use. e.g. "iPhone Distribution: Luka Mirosevic (0123456789)"'],
36
+ ['provisioning_profile', 'Path to your provisioning_profile. Optional if you use `sigh`']
37
+ ]
38
+ end
39
+
40
+ def self.author
41
+ "lmirosevic"
42
+ end
27
43
  end
28
44
  end
29
45
  end
@@ -36,7 +36,7 @@ module Fastlane
36
36
  path: '-P',
37
37
  }
38
38
 
39
- class S3Action
39
+ class S3Action < Action
40
40
  def self.run(params)
41
41
 
42
42
  params[0] ||= {}
@@ -241,8 +241,36 @@ module Fastlane
241
241
  return bundle_id, bundle_version, title
242
242
  end
243
243
 
244
- end
244
+ def self.description
245
+ "Generates a plist file and uploads all to AWS S3"
246
+ end
247
+
248
+ def self.available_options
249
+ [
250
+ ['access_key', 'AWS S3 Access Key', 'S3_ACCESS_KEY'],
251
+ ['secret_access_key', 'AWS S3 Secret Key', 'S3_SECRET_ACCESS_KEY'],
252
+ ['bucket', 'The bucket to store the ipa and plist in', 'S3_BUCKET'],
253
+ ['region', 'The region of your S3 server', 'S3_REGION'],
254
+ ['file', 'Path the ipa file to upload'],
255
+ ['dsym', 'Path to your dsym file'],
256
+ ['path', 'The path how it\'s used on S3']
257
+ # TODO: there are more options
258
+ ]
259
+ end
245
260
 
261
+ def self.output
262
+ [
263
+ ['S3_IPA_OUTPUT_PATH', 'Direct HTTP link to the uploaded ipa file'],
264
+ ['S3_DSYM_OUTPUT_PATH', 'Direct HTTP link to the uploaded dsym file'],
265
+ ['S3_PLIST_OUTPUT_PATH', 'Direct HTTP link to the uploaded plist file'],
266
+ ['S3_HTML_OUTPUT_PATH', 'Direct HTTP link to the uploaded HTML file']
267
+ ]
268
+ end
269
+
270
+ def self.author
271
+ "joshdholtz"
272
+ end
273
+ end
246
274
  end
247
275
  end
248
276
 
@@ -1,10 +1,14 @@
1
1
  module Fastlane
2
2
  module Actions
3
- class SayAction
3
+ class SayAction < Action
4
4
  def self.run(params)
5
5
  text = params.join(' ')
6
6
  Actions.sh("say '#{text}'")
7
7
  end
8
+
9
+ def self.description
10
+ "This action speaks out loud the given text"
11
+ end
8
12
  end
9
13
  end
10
14
  end
@@ -5,7 +5,7 @@ module Fastlane
5
5
  SIGH_UDID = :SIGH_UDID
6
6
  end
7
7
 
8
- class SighAction
8
+ class SighAction < Action
9
9
  def self.run(params)
10
10
  require 'sigh'
11
11
  require 'sigh/options'
@@ -22,12 +22,28 @@ module Fastlane
22
22
  end
23
23
  end
24
24
 
25
- Sigh.config = FastlaneCore::Configuration.create(Sigh::Options.available_options, (values || {}))
26
-
27
- path = Sigh::Manager.start
25
+ begin
26
+ FastlaneCore::UpdateChecker.start_looking_for_update('sigh')
28
27
 
29
- Actions.lane_context[SharedValues::SIGH_PROFILE_PATH] = path # absolute path
30
- Actions.lane_context[SharedValues::SIGH_UDID] = ENV["SIGH_UDID"] if ENV["SIGH_UDID"] # The UDID of the new profile
28
+ Sigh.config = FastlaneCore::Configuration.create(Sigh::Options.available_options, (values || {}))
29
+
30
+ path = Sigh::Manager.start
31
+
32
+ Actions.lane_context[SharedValues::SIGH_PROFILE_PATH] = path # absolute path
33
+ Actions.lane_context[SharedValues::SIGH_UDID] = ENV["SIGH_UDID"] if ENV["SIGH_UDID"] # The UDID of the new profile
34
+ ensure
35
+ FastlaneCore::UpdateChecker.show_update_status('sigh', Sigh::VERSION)
36
+ end
37
+ end
38
+
39
+ def self.description
40
+ "Generates a provisioning profile. Stores the profile in the current folder"
41
+ end
42
+
43
+ def self.available_options
44
+ require 'sigh'
45
+ require 'sigh/options'
46
+ Sigh::Options.available_options
31
47
  end
32
48
  end
33
49
  end
@@ -1,9 +1,6 @@
1
1
  module Fastlane
2
2
  module Actions
3
- module SharedValues
4
- end
5
-
6
- class SlackAction
3
+ class SlackAction < Action
7
4
  def self.git_author
8
5
  s = `git log --name-status HEAD^..HEAD`
9
6
  s = s.match(/Author:.*<(.*)>/)[1]
@@ -125,6 +122,24 @@ module Fastlane
125
122
  Helper.log.info 'Successfully sent Slack notification'.green
126
123
  end
127
124
  end
125
+
126
+ def self.description
127
+ "Send a success/error message to your Slack group"
128
+ end
129
+
130
+ def self.available_options
131
+ [
132
+ ['message', 'The message that should be displayed on Slack. This supports the standard Slack markup language'],
133
+ ['channel', '#channel or @username'],
134
+ ['success', 'Success or error?'],
135
+ ['payload', 'Add additional information to this post. payload must be a hash containg any key with any value'],
136
+ ['default_payloads', 'Remove some of the default payloads. More information about the available payloads GitHub']
137
+ ]
138
+ end
139
+
140
+ def self.author
141
+ "KrauseFx"
142
+ end
128
143
  end
129
144
  end
130
145
  end
@@ -4,7 +4,7 @@ module Fastlane
4
4
  SNAPSHOT_SCREENSHOTS_PATH = :SNAPSHOT_SCREENSHOTS_PATH
5
5
  end
6
6
 
7
- class SnapshotAction
7
+ class SnapshotAction < Action
8
8
  def self.run(params)
9
9
  clean = true
10
10
  clean = false if params.include?(:noclean)
@@ -17,15 +17,36 @@ module Fastlane
17
17
 
18
18
  require 'snapshot'
19
19
 
20
- Dir.chdir(FastlaneFolder.path) do
21
- Snapshot::SnapshotConfig.shared_instance
22
- Snapshot::Runner.new.work(clean: clean)
20
+ FastlaneCore::UpdateChecker.start_looking_for_update('snapshot')
23
21
 
24
- results_path = Snapshot::SnapshotConfig.shared_instance.screenshots_path
22
+ begin
23
+ Dir.chdir(FastlaneFolder.path) do
24
+ Snapshot::SnapshotConfig.shared_instance
25
+ Snapshot::Runner.new.work(clean: clean)
25
26
 
26
- Actions.lane_context[SharedValues::SNAPSHOT_SCREENSHOTS_PATH] = File.expand_path(results_path) # absolute URL
27
+ results_path = Snapshot::SnapshotConfig.shared_instance.screenshots_path
28
+
29
+ Actions.lane_context[SharedValues::SNAPSHOT_SCREENSHOTS_PATH] = File.expand_path(results_path) # absolute URL
30
+ end
31
+ ensure
32
+ FastlaneCore::UpdateChecker.show_update_status('snapshot', Snapshot::VERSION)
27
33
  end
28
34
  end
35
+
36
+ def self.description
37
+ "Generate new localised screenshots on multiple devices"
38
+ end
39
+
40
+ def self.available_options
41
+ [
42
+ ['noclean', 'Skips the clean process when building the app'],
43
+ ['verbose', 'Print out the UI Automation output']
44
+ ]
45
+ end
46
+
47
+ def self.author
48
+ "KrauseFx"
49
+ end
29
50
  end
30
51
  end
31
52
  end
@@ -3,7 +3,7 @@ module Fastlane
3
3
  module SharedValues
4
4
  end
5
5
 
6
- class TeamIdAction
6
+ class TeamIdAction < Action
7
7
  def self.run(params)
8
8
  team = params.first
9
9
  raise "Please pass your Team ID (e.g. team_id 'Q2CBPK58CA')".red unless team.to_s.length > 0
@@ -14,6 +14,14 @@ module Fastlane
14
14
  ENV[current.to_s] = team
15
15
  end
16
16
  end
17
+
18
+ def self.author
19
+ "KrauseFx"
20
+ end
21
+
22
+ def self.description
23
+ "Specify the Team ID you want to use for the Apple Developer Portal"
24
+ end
17
25
  end
18
26
  end
19
27
  end
@@ -3,7 +3,7 @@ module Fastlane
3
3
  module SharedValues
4
4
  end
5
5
 
6
- class TeamNameAction
6
+ class TeamNameAction < Action
7
7
  def self.run(params)
8
8
  team = params.first
9
9
  raise "Please pass your Team Name (e.g. team_name 'Felix Krause')".red unless team.to_s.length > 0
@@ -14,6 +14,14 @@ module Fastlane
14
14
  ENV[current.to_s] = team
15
15
  end
16
16
  end
17
+
18
+ def self.description
19
+ "Set a team to use by its name"
20
+ end
21
+
22
+ def self.author
23
+ "KrauseFx"
24
+ end
17
25
  end
18
26
  end
19
27
  end