fastlane 2.47.0.beta.20170712010003 → 2.47.0.beta.20170713010003

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c0f4a46559e73dd4de8e83e1076505d83399e71a
4
- data.tar.gz: 77531e61453a00805597742469287be8157e507a
3
+ metadata.gz: 87fdbf460eea76afd41b155d334da48b710b2d4f
4
+ data.tar.gz: 19ca586cb7f4f518383e8a293c3251a49b22ae49
5
5
  SHA512:
6
- metadata.gz: 636351972e9dc492f3010746e2b1771e3c7287c801b49cb6c245b7c94d3a49d2ccf22164f2ca072c625abfc7f123a2fbabd7d717bd9e6980821688f61db33c67
7
- data.tar.gz: 955c4ee6830323dfb15c3ad8840c943115e508da276971fd370c88b05639b715d086b04d50b938418b8f255f9741ecbff4b6b7ccb84ac00dba696182ad448d62
6
+ metadata.gz: 966fac603239f16233f92dbea02d932a4fc01191ec03d84c3d5a69434aeb8245fab59c050d81fe441e0f611154402899f142b2eab2c17487f27c37c1944783f8
7
+ data.tar.gz: a3b6baab3fd47dbb4b36594300e7446ffbc1cacbf9b575ab1feb015c6c45b2f18a98b2d57cf027a3ecda33e7f683aaa509f0211c2ab0182825f27901e886e80b
data/README.md CHANGED
@@ -95,6 +95,10 @@ Get started distributing your first app with fastlane within minutes:
95
95
  Want to learn more? Explore guides for [iOS](https://docs.fastlane.tools/getting-started/ios/setup/)
96
96
  or [Android](https://docs.fastlane.tools/getting-started/android/setup/).
97
97
 
98
+ ## System Requirements
99
+
100
+ Currently, _fastlane_ is officially supported to run on macOS. Support for other operating systems is limited and untested at this point in time. _fastlane_ uses system APIs that may not be implemented on other platforms, for example, we use the Ruby `fork` method for sub-process management, which isn't available on Windows.
101
+
98
102
  ## Available Commands
99
103
 
100
104
  Typically you'll use `fastlane` by triggering individual lanes:
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.47.0.beta.20170712010003'.freeze
2
+ VERSION = '2.47.0.beta.20170713010003'.freeze
3
3
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
4
4
  MINIMUM_XCODE_RELEASE = "7.0".freeze
5
5
  end
@@ -35,13 +35,13 @@ module FastlaneCore
35
35
  end
36
36
 
37
37
  def report_status(build: nil)
38
- # Due to iTunes Connect, builds disappear from the build list alltogether
38
+ # Due to iTunes Connect, builds disappear from the build list altogether
39
39
  # after they finished processing. Before returning this build, we have to
40
40
  # wait for the build to appear in the build list again
41
41
  # As this method is very often used to wait for a build, and then do something
42
42
  # with it, we have to be sure that the build actually is ready
43
43
  if build.nil?
44
- UI.message("Build doesn't show up in the build list any more, waiting for it to appear again")
44
+ UI.message("Build doesn't show up in the build list anymore, waiting for it to appear again")
45
45
  elsif build.active?
46
46
  UI.success("Build #{build.train_version} - #{build.build_version} is already being tested")
47
47
  elsif build.ready_to_submit? || build.export_compliance_missing?
@@ -51,9 +51,10 @@ module Gym
51
51
  print "For more information visit this stackoverflow answer:"
52
52
  print "https://stackoverflow.com/a/17031697/445598"
53
53
  end
54
- print_full_log_path
55
54
  print_xcode_path_instructions
56
55
  print_xcode_version
56
+ print_full_log_path
57
+ print_build_error_instructions
57
58
  UI.build_failure!("Error building the application - see the log above", error_info: output)
58
59
  end
59
60
 
@@ -89,6 +90,7 @@ module Gym
89
90
  print "provisioning profile and code signing identity."
90
91
  end
91
92
  print_full_log_path
93
+ print_build_error_instructions
92
94
  UI.build_failure!("Error packaging up the application", error_info: output)
93
95
  end
94
96
 
@@ -102,18 +104,8 @@ module Gym
102
104
  UI.build_failure!("Archive invalid")
103
105
  end
104
106
 
105
- def find_standard_output_path(output)
106
- m = /Created bundle at path '(.*)'/.match(output)
107
- return File.join(m[1], 'IDEDistribution.standard.log') unless m.nil?
108
- end
109
-
110
107
  private
111
108
 
112
- def read_standard_output(output)
113
- path = find_standard_output_path output
114
- return File.read(path) if File.exist?(path)
115
- end
116
-
117
109
  # Just to make things easier
118
110
  def print(text)
119
111
  UI.error text
@@ -121,8 +113,21 @@ module Gym
121
113
 
122
114
  def print_full_log_path
123
115
  return if Gym.config[:disable_xcpretty]
116
+
124
117
  log_path = Gym::BuildCommandGenerator.xcodebuild_log_path
125
- UI.important("📋 For a more detailed error log, check the full log at:")
118
+ return unless File.exist?(log_path)
119
+
120
+ # `xcodebuild` doesn't properly mark lines as failure reason or important information
121
+ # so we assume that the last few lines show the error message that's relevant
122
+ # (at least that's what was correct during testing)
123
+ log_content = File.read(log_path).split("\n")[-5..-1]
124
+ log_content.each do |row|
125
+ UI.command_output(row)
126
+ end
127
+
128
+ UI.message("")
129
+ UI.error("⬆️ Check out the few lines of raw `xcodebuild` output above for potential hints on how to solve this error")
130
+ UI.important("📋 For the complete and more detailed error log, check the full log at:")
126
131
  UI.important("📋 #{log_path}")
127
132
  end
128
133
 
@@ -148,25 +153,41 @@ module Gym
148
153
  default_xcode_path = "/Applications/"
149
154
 
150
155
  xcode_installations_in_default_path = Dir[File.join(default_xcode_path, "Xcode*.app")]
151
- if xcode_installations_in_default_path.count > 1
152
- UI.error "Found multiple versions of Xcode in '#{default_xcode_path}'"
153
- UI.error "Make sure you selected the right version for your project"
154
- UI.error "This build process was executed using '#{xcode_path}'"
155
- UI.important "If you want to update your Xcode path, either"
156
- UI.message ""
157
-
158
- UI.message "- Specify the Xcode version in your Fastfile"
159
- UI.command_output "xcversion(version: \"8.1\") # Selects Xcode 8.1.0"
160
- UI.message ""
161
-
162
- UI.message "- Specify an absolute path to your Xcode installation in your Fastfile"
163
- UI.command_output "xcode_select \"/Applications/Xcode8.app\""
164
- UI.message ""
165
-
166
- UI.message "- Manually update the path using"
167
- UI.command_output "sudo xcode-select -s /Applications/Xcode.app"
168
- UI.message ""
169
- end
156
+ return unless xcode_installations_in_default_path.count > 1
157
+ UI.message ""
158
+ UI.important "Maybe the error shown is caused by using the wrong version of Xcode"
159
+ UI.important "Found multiple versions of Xcode in '#{default_xcode_path}'"
160
+ UI.important "Make sure you selected the right version for your project"
161
+ UI.important "This build process was executed using '#{xcode_path}'"
162
+ UI.important "If you want to update your Xcode path, either"
163
+ UI.message ""
164
+
165
+ UI.message "- Specify the Xcode version in your Fastfile"
166
+ UI.command_output "xcversion(version: \"8.1\") # Selects Xcode 8.1.0"
167
+ UI.message ""
168
+
169
+ UI.message "- Specify an absolute path to your Xcode installation in your Fastfile"
170
+ UI.command_output "xcode_select \"/Applications/Xcode8.app\""
171
+ UI.message ""
172
+
173
+ UI.message "- Manually update the path using"
174
+ UI.command_output "sudo xcode-select -s /Applications/Xcode.app"
175
+ UI.message ""
176
+ end
177
+
178
+ # Indicate that code signing errors are not caused by fastlane
179
+ # and that fastlane only runs `xcodebuild` commands
180
+ def print_build_error_instructions
181
+ UI.message("")
182
+ UI.error("Looks like fastlane ran into a build/archive error with your project")
183
+ UI.error("It's hard to tell what's causing the error, so we wrote some guides on how")
184
+ UI.error("to troubleshoot build and signing issues: https://docs.fastlane.tools/codesigning/getting-started/")
185
+ UI.error("Before submitting an issue on GitHub, please follow the guide above and make")
186
+ UI.error("sure your project is set up correctly.")
187
+ UI.error("fastlane uses `xcodebuild` commands to generate your binary, you can see the")
188
+ UI.error("the full commands printed out in yellow in the above log.")
189
+ UI.error("Make sure to inspect the output above, as usually you'll find more error information there")
190
+ UI.message("")
170
191
  end
171
192
  end
172
193
  end
@@ -0,0 +1,99 @@
1
+ module Spaceship
2
+ module Portal
3
+ class Key < PortalBase
4
+ ##
5
+ # data model for managing JWT tokens or "Keys" as the ADP refers to them
6
+
7
+ APNS_ID = 'U27F4V844T'
8
+ DEVICE_CHECK_ID = 'DQ8HTZ7739'
9
+ MUSIC_KIT_ID = '6A7HVUVQ3M'
10
+
11
+ attr_accessor :id
12
+ attr_accessor :name
13
+
14
+ attr_mapping({
15
+ 'keyId' => :id,
16
+ 'keyName' => :name,
17
+ 'services' => :services,
18
+ 'canDownload' => :can_download,
19
+ 'canRevoke' => :can_revoke
20
+ })
21
+
22
+ def self.all
23
+ keys = client.list_keys
24
+ keys.map do |key|
25
+ new(key)
26
+ end
27
+ end
28
+
29
+ def self.find(id)
30
+ key = client.get_key(id: id)
31
+ new(key)
32
+ end
33
+
34
+ ##
35
+ # Creates a new JWT / Key for making requests to services.
36
+ #
37
+ # @param name [String] the name of the key
38
+ # @param apns [Bool] whether the key should be able to make APNs requests
39
+ # @param device_check [Bool] whether the key should be able to make DeviceCheck requests
40
+ # @param music_id [String] the Music Id id (the autogenerated id, not the user specified identifier "music.com.etc...")
41
+ def self.create(name: nil, apns: nil, device_check: nil, music_id: nil)
42
+ service_config = {}
43
+ service_config[APNS_ID] = [] if apns
44
+ service_config[DEVICE_CHECK_ID] = [] if device_check
45
+ service_config[MUSIC_KIT_ID] = [music_id] if music_id
46
+
47
+ key = client.create_key!(name: name, service_configs: service_config)
48
+ new(key)
49
+ end
50
+
51
+ def revoke!
52
+ client.revoke_key!(id: id)
53
+ end
54
+
55
+ def download
56
+ client.download_key(id: id)
57
+ end
58
+
59
+ def services
60
+ raw_data['services'] || reload
61
+ super
62
+ end
63
+
64
+ def service_configs_for(service_id)
65
+ if (service = find_service(service_id))
66
+ service['configurations']
67
+ end
68
+ end
69
+
70
+ def has_apns?
71
+ has_service?(APNS_ID)
72
+ end
73
+
74
+ def has_music_kit?
75
+ has_service?(MUSIC_KIT_ID)
76
+ end
77
+
78
+ def has_device_check?
79
+ has_service?(DEVICE_CHECK_ID)
80
+ end
81
+
82
+ def reload
83
+ self.raw_data = self.class.find(id).raw_data
84
+ end
85
+
86
+ private
87
+
88
+ def find_service(service_id)
89
+ services.find do |service|
90
+ service['id'] == service_id
91
+ end
92
+ end
93
+
94
+ def has_service?(service_id)
95
+ find_service(service_id) != nil
96
+ end
97
+ end
98
+ end
99
+ end
@@ -9,3 +9,4 @@ require 'spaceship/portal/provisioning_profile'
9
9
  require 'spaceship/portal/portal_client'
10
10
  require 'spaceship/portal/persons'
11
11
  require 'spaceship/portal/person'
12
+ require 'spaceship/portal/key'
@@ -560,6 +560,54 @@ module Spaceship
560
560
  parse_response(r, 'provisioningProfile')
561
561
  end
562
562
 
563
+ #####################################################
564
+ # @!group Keys
565
+ #####################################################
566
+
567
+ def list_keys
568
+ paging do |page_number|
569
+ response = request(:post, 'account/auth/key/list', {
570
+ teamId: team_id,
571
+ pageNumber: page_number,
572
+ pageSize: page_size,
573
+ sort: 'name=asc'
574
+ })
575
+ parse_response(response, 'keys')
576
+ end
577
+ end
578
+
579
+ def get_key(id: nil)
580
+ response = request(:post, 'account/auth/key/get', { teamId: team_id, keyId: id })
581
+ # response contains a list of keys with 1 item
582
+ parse_response(response, 'keys').first
583
+ end
584
+
585
+ def download_key(id: nil)
586
+ response = request(:get, 'account/auth/key/download', { teamId: team_id, keyId: id })
587
+ parse_response(response)
588
+ end
589
+
590
+ def create_key!(name: nil, service_configs: nil)
591
+ params = {
592
+ name: name,
593
+ serviceConfigurations: service_configs,
594
+ teamId: team_id
595
+ }
596
+
597
+ response = request(:post, 'account/auth/key/create') do |req|
598
+ req.headers['Content-Type'] = 'application/json'
599
+ req.body = params.to_json
600
+ end
601
+
602
+ # response contains a list of keys with 1 item
603
+ parse_response(response, 'keys').first
604
+ end
605
+
606
+ def revoke_key!(id: nil)
607
+ response = request(:post, 'account/auth/key/revoke', { teamId: team_id, keyId: id })
608
+ parse_response(response)
609
+ end
610
+
563
611
  private
564
612
 
565
613
  # This is a cache of entity type (App, AppGroup, Certificate, Device) to csrf_tokens
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.47.0.beta.20170712010003
4
+ version: 2.47.0.beta.20170713010003
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felix Krause
@@ -15,7 +15,7 @@ authors:
15
15
  autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
- date: 2017-07-12 00:00:00.000000000 Z
18
+ date: 2017-07-13 00:00:00.000000000 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: slack-notifier
@@ -1312,6 +1312,7 @@ files:
1312
1312
  - spaceship/lib/spaceship/portal/app_service.rb
1313
1313
  - spaceship/lib/spaceship/portal/certificate.rb
1314
1314
  - spaceship/lib/spaceship/portal/device.rb
1315
+ - spaceship/lib/spaceship/portal/key.rb
1315
1316
  - spaceship/lib/spaceship/portal/person.rb
1316
1317
  - spaceship/lib/spaceship/portal/persons.rb
1317
1318
  - spaceship/lib/spaceship/portal/portal.rb