fastlane 2.115.0.beta.20190126200102 → 2.115.0.beta.20190127200030
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/deliver/lib/deliver/options.rb +7 -0
- data/deliver/lib/deliver/upload_metadata.rb +25 -2
- data/fastlane/lib/fastlane/actions/create_keychain.rb +22 -2
- data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +26 -3
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/Fastlane.swift +2 -0
- data/frameit/lib/frameit/editor.rb +27 -4
- data/frameit/lib/frameit/options.rb +6 -1
- data/frameit/lib/frameit/runner.rb +1 -1
- data/match/lib/match/migrate.rb +2 -1
- data/match/lib/match/nuke.rb +2 -1
- data/match/lib/match/options.rb +4 -0
- data/match/lib/match/runner.rb +2 -1
- data/match/lib/match/storage/google_cloud_storage.rb +47 -16
- metadata +14 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2f690dd41314c5c114efcfe3d8bcef7645e54a8
|
4
|
+
data.tar.gz: 5835afcaad7a7aee734131ada28166971d6da86b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aec640eec8630de7a4755af11b2afbd16763b6c6d8c79246965da54c3a3a5f3d175f4352b6eafa6820bf8a3578eea1782b999819d361b7c50c8d033ac8820d93
|
7
|
+
data.tar.gz: b2390dea0e1655717f6ec83972f86e0824495c9123966c024cbe12b7300a1aa0cf43b3309eca3b9109430f6d637c8b4e2088d49d9b172f2a6a87fd8be57577db
|
@@ -257,6 +257,13 @@ module Deliver
|
|
257
257
|
default_value: :warn),
|
258
258
|
|
259
259
|
# App Metadata
|
260
|
+
FastlaneCore::ConfigItem.new(key: :individual_metadata_items,
|
261
|
+
env_name: "DELIVER_INDIVUDAL_METADATA_ITEMS",
|
262
|
+
description: "An array of localized metadata items to upload individually by language so that errors can be identified. E.g. ['name', 'keywords', 'description']. Note: slow",
|
263
|
+
is_string: false,
|
264
|
+
type: Array,
|
265
|
+
default_value: []),
|
266
|
+
|
260
267
|
# Non Localised
|
261
268
|
FastlaneCore::ConfigItem.new(key: :app_icon,
|
262
269
|
description: "Metadata: The path to the app icon",
|
@@ -94,6 +94,7 @@ module Deliver
|
|
94
94
|
non_localised_options = (NON_LOCALISED_VERSION_VALUES + NON_LOCALISED_APP_VALUES)
|
95
95
|
end
|
96
96
|
|
97
|
+
individual = options[:individual_metadata_items] || []
|
97
98
|
localised_options.each do |key|
|
98
99
|
current = options[key]
|
99
100
|
next unless current
|
@@ -106,8 +107,12 @@ module Deliver
|
|
106
107
|
current.each do |language, value|
|
107
108
|
next unless value.to_s.length > 0
|
108
109
|
strip_value = value.to_s.strip
|
109
|
-
|
110
|
-
|
110
|
+
if individual.include?(key.to_s)
|
111
|
+
upload_individual_item(app, v, language, key, strip_value)
|
112
|
+
else
|
113
|
+
v.send(key)[language] = strip_value if LOCALISED_VERSION_VALUES.include?(key)
|
114
|
+
details.send(key)[language] = strip_value if LOCALISED_APP_VALUES.include?(key)
|
115
|
+
end
|
111
116
|
end
|
112
117
|
end
|
113
118
|
|
@@ -137,6 +142,7 @@ module Deliver
|
|
137
142
|
# If another string needs to be checked here we should
|
138
143
|
# figure out a more generic way to handle these cases.
|
139
144
|
if e.message.include?('App Name cannot be longer than 50 characters') || e.message.include?('The app name you entered is already being used')
|
145
|
+
UI.error("Error in app name. Try using 'individual_metadata_items' to identify the problem language.")
|
140
146
|
UI.user_error!(e.message)
|
141
147
|
else
|
142
148
|
raise e
|
@@ -144,6 +150,23 @@ module Deliver
|
|
144
150
|
end
|
145
151
|
end
|
146
152
|
|
153
|
+
# Uploads metadata individually by language to help identify exactly which items have issues
|
154
|
+
def upload_individual_item(app, version, language, key, value)
|
155
|
+
details = app.details
|
156
|
+
version.send(key)[language] = value if LOCALISED_VERSION_VALUES.include?(key)
|
157
|
+
details.send(key)[language] = value if LOCALISED_APP_VALUES.include?(key)
|
158
|
+
Helper.show_loading_indicator("Uploading #{language} #{key} to App Store Connect")
|
159
|
+
version.save!
|
160
|
+
Helper.hide_loading_indicator
|
161
|
+
begin
|
162
|
+
details.save!
|
163
|
+
UI.success("Successfully uploaded #{language} #{key} to App Store Connect")
|
164
|
+
rescue Spaceship::TunesClient::ITunesConnectError => e
|
165
|
+
UI.error("Error in #{language} #{key}: \n#{value}")
|
166
|
+
UI.error(e.message) # Don't use user_error to allow all values to get checked
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
147
170
|
# rubocop:enable Metrics/PerceivedComplexity
|
148
171
|
|
149
172
|
# If the user is using the 'default' language, then assign values where they are needed
|
@@ -22,7 +22,15 @@ module Fastlane
|
|
22
22
|
end
|
23
23
|
|
24
24
|
commands = []
|
25
|
-
|
25
|
+
|
26
|
+
if !exists?(keychain_path)
|
27
|
+
commands << Fastlane::Actions.sh("security create-keychain -p #{escaped_password} #{keychain_path}", log: false)
|
28
|
+
elsif params[:require_create]
|
29
|
+
UI.abort_with_message!("`require_create` option passed, but found keychain '#{keychain_path}', failing create_keychain action")
|
30
|
+
else
|
31
|
+
UI.important("Found keychain '#{keychain_path}', creation skipped")
|
32
|
+
UI.important("If creating a new Keychain DB is required please set the `require_create` option true to cause the action to fail")
|
33
|
+
end
|
26
34
|
|
27
35
|
if params[:default_keychain]
|
28
36
|
# if there is no default keychain - setting the original will fail - silent this error
|
@@ -52,6 +60,14 @@ module Fastlane
|
|
52
60
|
commands
|
53
61
|
end
|
54
62
|
|
63
|
+
def self.exists?(keychain_path)
|
64
|
+
keychain_path = File.expand_path(keychain_path)
|
65
|
+
|
66
|
+
# Creating Keychains using the security
|
67
|
+
# CLI appends `-db` to the file name.
|
68
|
+
File.exist?("#{keychain_path}-db") || File.exist?(keychain_path)
|
69
|
+
end
|
70
|
+
|
55
71
|
def self.description
|
56
72
|
"Create a new Keychain"
|
57
73
|
end
|
@@ -98,7 +114,11 @@ module Fastlane
|
|
98
114
|
FastlaneCore::ConfigItem.new(key: :add_to_search_list,
|
99
115
|
description: 'Add keychain to search list',
|
100
116
|
is_string: false,
|
101
|
-
default_value: true)
|
117
|
+
default_value: true),
|
118
|
+
FastlaneCore::ConfigItem.new(key: :require_create,
|
119
|
+
description: 'Fail the action if the Keychain already exists',
|
120
|
+
is_string: false,
|
121
|
+
default_value: false)
|
102
122
|
]
|
103
123
|
end
|
104
124
|
|
@@ -201,13 +201,36 @@ fastlane match migrate
|
|
201
201
|
|
202
202
|
After a successful migration you can safely delete your git repo.
|
203
203
|
|
204
|
-
#### Google Cloud
|
204
|
+
#### Google Cloud access control
|
205
205
|
|
206
206
|
*Google Cloud Storage only*
|
207
207
|
|
208
|
-
|
208
|
+
There are two cases for reading and writing certificates stored in a Google Cloud storage bucket:
|
209
209
|
|
210
|
-
|
210
|
+
1. Continuous integration jobs. These will authenticate to your Google Cloud project via a service account, and use a `gc_keys.json` file as credentials.
|
211
|
+
1. Developers on a local workstation. In this case, you should choose whether everyone on your team will create their own `gc_keys.json` file, or whether you want to manage access to the bucket directly using your developers' Google accounts.
|
212
|
+
|
213
|
+
When running `fastlane match init` the first time, the setup process will give you the option to create your `gc_keys.json` file. This file contains the auth credentials needed to access your Google Cloud storage bucket. Make sure to keep that file secret and never add it to version control. We recommend adding `gc_keys.json` to your `.gitignore`
|
214
|
+
|
215
|
+
##### Managing developer access via keys
|
216
|
+
If you want to manage developer access to your certificates via authentication keys, every developer should create their own `gc_keys.json` and add the file to all their work machines. This will give the admin full control over who has read/write access to the given Storage bucket. At the same time it allows your team to revoke a single key if a file gets compromised.
|
217
|
+
|
218
|
+
##### Managing developer acess via Google accounts
|
219
|
+
If your developers already have Google accounts and access to your Google Cloud project, you can also manage access to the storage bucket via [Cloud Identity and Access Management (IAM)](https://cloud.google.com/storage/docs/access-control/iam). Just [set up](https://cloud.google.com/storage/docs/access-control/lists) individual developer accounts or an entire Google Group containing your team as readers and writers on your storage bucket.
|
220
|
+
|
221
|
+
You can then specify the Google Cloud project id containing your storage bucket in your `Matchfile`:
|
222
|
+
|
223
|
+
```ruby-skip-tests
|
224
|
+
storage_mode("google_cloud")
|
225
|
+
google_cloud_bucket_name("my-app-certificates")
|
226
|
+
google_cloud_project_id("my-app-project")
|
227
|
+
```
|
228
|
+
|
229
|
+
This lets developers on your team use [Application Default Credentials](https://cloud.google.com/docs/authentication/production) when accessing your storage bucket. After installing the [Google Cloud SDK](https://cloud.google.com/sdk/), they only need to run the following command once:
|
230
|
+
```no-highlight
|
231
|
+
gcloud auth application-default login
|
232
|
+
```
|
233
|
+
... and log in with their Google account. Then, when they run `fastlane match`, _match_ will use these credentials to read from and write to the storage bucket.
|
211
234
|
|
212
235
|
#### New machine
|
213
236
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Fastlane
|
2
|
-
VERSION = '2.115.0.beta.
|
2
|
+
VERSION = '2.115.0.beta.20190127200030'.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
|
RUBOCOP_REQUIREMENT = '0.49.1'.freeze
|
@@ -2146,6 +2146,7 @@ func match(type: String = matchfile.type,
|
|
2146
2146
|
cloneBranchDirectly: Bool = matchfile.cloneBranchDirectly,
|
2147
2147
|
googleCloudBucketName: String? = matchfile.googleCloudBucketName,
|
2148
2148
|
googleCloudKeysFile: String? = matchfile.googleCloudKeysFile,
|
2149
|
+
googleCloudProjectId: String? = matchfile.googleCloudProjectId,
|
2149
2150
|
keychainName: String = matchfile.keychainName,
|
2150
2151
|
keychainPassword: String? = matchfile.keychainPassword,
|
2151
2152
|
force: Bool = matchfile.force,
|
@@ -2170,6 +2171,7 @@ func match(type: String = matchfile.type,
|
|
2170
2171
|
RubyCommand.Argument(name: "clone_branch_directly", value: cloneBranchDirectly),
|
2171
2172
|
RubyCommand.Argument(name: "google_cloud_bucket_name", value: googleCloudBucketName),
|
2172
2173
|
RubyCommand.Argument(name: "google_cloud_keys_file", value: googleCloudKeysFile),
|
2174
|
+
RubyCommand.Argument(name: "google_cloud_project_id", value: googleCloudProjectId),
|
2173
2175
|
RubyCommand.Argument(name: "keychain_name", value: keychainName),
|
2174
2176
|
RubyCommand.Argument(name: "keychain_password", value: keychainPassword),
|
2175
2177
|
RubyCommand.Argument(name: "force", value: force),
|
@@ -12,20 +12,23 @@ module Frameit
|
|
12
12
|
# Currently the class is 2 lines too long. Reevaluate refactoring when it's length changes significantly
|
13
13
|
class Editor # rubocop:disable Metrics/ClassLength
|
14
14
|
attr_accessor :screenshot # reference to the screenshot object to fetch the path, title, etc.
|
15
|
+
attr_accessor :debug_mode
|
16
|
+
attr_accessor :frame_path
|
15
17
|
attr_accessor :frame # the frame of the device
|
16
18
|
attr_accessor :image # the current image used for editing
|
17
19
|
attr_accessor :space_to_device
|
18
20
|
|
19
|
-
def initialize(screenshot)
|
21
|
+
def initialize(screenshot, debug_mode = false)
|
20
22
|
@screenshot = screenshot
|
23
|
+
self.debug_mode = debug_mode
|
21
24
|
end
|
22
25
|
|
23
26
|
def frame!
|
24
27
|
prepare_image
|
25
28
|
|
26
|
-
|
27
|
-
if
|
28
|
-
self.frame = MiniMagick::Image.open(
|
29
|
+
@frame_path = load_frame
|
30
|
+
if @frame_path # Mac doesn't need a frame
|
31
|
+
self.frame = MiniMagick::Image.open(@frame_path)
|
29
32
|
# Rotate the frame according to the device orientation
|
30
33
|
self.frame.rotate(self.rotation_for_device_orientation)
|
31
34
|
elsif self.class == Editor
|
@@ -85,6 +88,26 @@ module Frameit
|
|
85
88
|
frame.rotate(-rotation)
|
86
89
|
@image.rotate(-rotation)
|
87
90
|
|
91
|
+
# Debug Mode: Add filename to frame
|
92
|
+
if self.debug_mode
|
93
|
+
filename = File.basename(@frame_path, ".*")
|
94
|
+
filename.sub!('Apple', '') # remove 'Apple'
|
95
|
+
|
96
|
+
width = screenshot.size[0]
|
97
|
+
font_size = width / 20 # magic number that works well
|
98
|
+
|
99
|
+
offset_top = offset['offset'].split("+")[2].to_f
|
100
|
+
annotate_offset = "+0+#{offset_top}" # magic number that works semi well
|
101
|
+
|
102
|
+
frame.combine_options do |c|
|
103
|
+
c.gravity('North')
|
104
|
+
c.undercolor('#00000080')
|
105
|
+
c.fill('white')
|
106
|
+
c.pointsize(font_size)
|
107
|
+
c.annotate(annotate_offset.to_s, filename.to_s)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
88
111
|
@image = frame.composite(image, "png") do |c|
|
89
112
|
c.compose("DstOver")
|
90
113
|
c.geometry(offset['offset'])
|
@@ -65,7 +65,12 @@ module Frameit
|
|
65
65
|
:landscape_right
|
66
66
|
end
|
67
67
|
end,
|
68
|
-
default_value_dynamic: true)
|
68
|
+
default_value_dynamic: true),
|
69
|
+
FastlaneCore::ConfigItem.new(key: :debug_mode,
|
70
|
+
env_name: "FRAMEIT_DEBUG_MODE",
|
71
|
+
description: "Output debug information in framed screenshots",
|
72
|
+
default_value: false,
|
73
|
+
type: Boolean)
|
69
74
|
]
|
70
75
|
end
|
71
76
|
end
|
@@ -40,7 +40,7 @@ module Frameit
|
|
40
40
|
if screenshot.mac?
|
41
41
|
editor = MacEditor.new(screenshot)
|
42
42
|
else
|
43
|
-
editor = Editor.new(screenshot)
|
43
|
+
editor = Editor.new(screenshot, Frameit.config[:debug_mode])
|
44
44
|
end
|
45
45
|
if editor.should_skip?
|
46
46
|
UI.message("Skipping framing of screenshot #{screenshot.path}. No title provided in your Framefile.json or title.strings.")
|
data/match/lib/match/migrate.rb
CHANGED
@@ -17,7 +17,8 @@ module Match
|
|
17
17
|
# to ask for all the missing inputs *before* cloning the git repo
|
18
18
|
google_cloud_storage = Storage.for_mode("google_cloud", {
|
19
19
|
google_cloud_bucket_name: params[:google_cloud_bucket_name],
|
20
|
-
google_cloud_keys_file: params[:google_cloud_keys_file]
|
20
|
+
google_cloud_keys_file: params[:google_cloud_keys_file],
|
21
|
+
google_cloud_project_id: params[:google_cloud_project_id]
|
21
22
|
})
|
22
23
|
|
23
24
|
git_storage = Storage.for_mode("git", {
|
data/match/lib/match/nuke.rb
CHANGED
@@ -36,7 +36,8 @@ module Match
|
|
36
36
|
git_user_email: params[:git_user_email],
|
37
37
|
clone_branch_directly: params[:clone_branch_directly],
|
38
38
|
google_cloud_bucket_name: params[:google_cloud_bucket_name].to_s,
|
39
|
-
google_cloud_keys_file: params[:google_cloud_keys_file].to_s
|
39
|
+
google_cloud_keys_file: params[:google_cloud_keys_file].to_s,
|
40
|
+
google_cloud_project_id: params[:google_cloud_project_id].to_s
|
40
41
|
})
|
41
42
|
self.storage.download
|
42
43
|
|
data/match/lib/match/options.rb
CHANGED
@@ -123,6 +123,10 @@ module Match
|
|
123
123
|
verify_block: proc do |value|
|
124
124
|
UI.user_error!("Could not find keys file at path '#{File.expand_path(value)}'") unless File.exist?(value)
|
125
125
|
end),
|
126
|
+
FastlaneCore::ConfigItem.new(key: :google_cloud_project_id,
|
127
|
+
env_name: "MATCH_GOOGLE_CLOUD_PROJECT_ID",
|
128
|
+
description: "ID of the Google Cloud project to use for authentication",
|
129
|
+
optional: true),
|
126
130
|
|
127
131
|
# Keychain
|
128
132
|
FastlaneCore::ConfigItem.new(key: :keychain_name,
|
data/match/lib/match/runner.rb
CHANGED
@@ -46,7 +46,8 @@ module Match
|
|
46
46
|
type: params[:type].to_s,
|
47
47
|
platform: params[:platform].to_s,
|
48
48
|
google_cloud_bucket_name: params[:google_cloud_bucket_name].to_s,
|
49
|
-
google_cloud_keys_file: params[:google_cloud_keys_file].to_s
|
49
|
+
google_cloud_keys_file: params[:google_cloud_keys_file].to_s,
|
50
|
+
google_cloud_project_id: params[:google_cloud_project_id].to_s
|
50
51
|
})
|
51
52
|
storage.download
|
52
53
|
|
@@ -17,7 +17,7 @@ module Match
|
|
17
17
|
attr_reader :platform
|
18
18
|
attr_reader :bucket_name
|
19
19
|
attr_reader :google_cloud_keys_file
|
20
|
-
attr_reader :
|
20
|
+
attr_reader :google_cloud_project_id
|
21
21
|
|
22
22
|
# Managed values
|
23
23
|
attr_accessor :gc_storage
|
@@ -34,26 +34,34 @@ module Match
|
|
34
34
|
type: params[:type].to_s,
|
35
35
|
platform: params[:platform].to_s,
|
36
36
|
google_cloud_bucket_name: params[:google_cloud_bucket_name],
|
37
|
-
google_cloud_keys_file: params[:google_cloud_keys_file]
|
37
|
+
google_cloud_keys_file: params[:google_cloud_keys_file],
|
38
|
+
google_cloud_project_id: params[:google_cloud_project_id]
|
38
39
|
)
|
39
40
|
end
|
40
41
|
|
41
42
|
def initialize(type: nil,
|
42
43
|
platform: nil,
|
43
44
|
google_cloud_bucket_name: nil,
|
44
|
-
google_cloud_keys_file: nil
|
45
|
+
google_cloud_keys_file: nil,
|
46
|
+
google_cloud_project_id: nil)
|
45
47
|
@type = type if type
|
46
48
|
@platform = platform if platform
|
49
|
+
@google_cloud_project_id = google_cloud_project_id if google_cloud_project_id
|
47
50
|
@bucket_name = google_cloud_bucket_name
|
48
51
|
|
49
|
-
@google_cloud_keys_file = ensure_keys_file_exists(google_cloud_keys_file)
|
52
|
+
@google_cloud_keys_file = ensure_keys_file_exists(google_cloud_keys_file, google_cloud_project_id)
|
50
53
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
54
|
+
if self.google_cloud_keys_file.to_s.length > 0
|
55
|
+
# Extract the Project ID from the `JSON` file
|
56
|
+
# so the user doesn't have to provide it manually
|
57
|
+
keys_file_content = JSON.parse(File.read(self.google_cloud_keys_file))
|
58
|
+
if google_cloud_project_id.to_s.length > 0 && google_cloud_project_id != keys_file_content["project_id"]
|
59
|
+
UI.important("The google_cloud_keys_file's project ID ('#{keys_file_content['project_id']}') doesn't match the google_cloud_project_id ('#{google_cloud_project_id}'). This may be the wrong keys file.")
|
60
|
+
end
|
61
|
+
@google_cloud_project_id = keys_file_content["project_id"]
|
62
|
+
if self.google_cloud_project_id.to_s.length == 0
|
63
|
+
UI.user_error!("Provided keys file on path #{File.expand_path(self.google_cloud_keys_file)} doesn't include required value for `project_id`")
|
64
|
+
end
|
57
65
|
end
|
58
66
|
|
59
67
|
# Create the Google Cloud Storage client
|
@@ -62,7 +70,7 @@ module Match
|
|
62
70
|
begin
|
63
71
|
self.gc_storage = Google::Cloud::Storage.new(
|
64
72
|
credentials: self.google_cloud_keys_file,
|
65
|
-
project_id: self.
|
73
|
+
project_id: self.google_cloud_project_id
|
66
74
|
)
|
67
75
|
rescue => ex
|
68
76
|
UI.error(ex)
|
@@ -101,7 +109,7 @@ module Match
|
|
101
109
|
end
|
102
110
|
|
103
111
|
def human_readable_description
|
104
|
-
"Google Cloud Bucket [#{self.
|
112
|
+
"Google Cloud Bucket [#{self.google_cloud_project_id}/#{self.bucket_name}]"
|
105
113
|
end
|
106
114
|
|
107
115
|
def upload_files(files_to_upload: [], custom_message: nil)
|
@@ -149,7 +157,7 @@ module Match
|
|
149
157
|
|
150
158
|
# This method will make sure the keys file exists
|
151
159
|
# If it's missing, it will help the user set things up
|
152
|
-
def ensure_keys_file_exists(google_cloud_keys_file)
|
160
|
+
def ensure_keys_file_exists(google_cloud_keys_file, google_cloud_project_id)
|
153
161
|
if google_cloud_keys_file && File.exist?(google_cloud_keys_file)
|
154
162
|
return google_cloud_keys_file
|
155
163
|
end
|
@@ -159,8 +167,31 @@ module Match
|
|
159
167
|
fastlane_folder_gc_keys_path = File.join(FastlaneCore::FastlaneFolder.path, DEFAULT_KEYS_FILE_NAME)
|
160
168
|
return fastlane_folder_gc_keys_path if File.exist?(fastlane_folder_gc_keys_path)
|
161
169
|
|
162
|
-
|
163
|
-
|
170
|
+
if google_cloud_project_id.to_s.length > 0
|
171
|
+
# Check to see if this system has application default keys installed.
|
172
|
+
# These are the default keys that the Google Cloud APIs use when no other keys are specified.
|
173
|
+
# Users with the Google Cloud SDK installed can generate them by running...
|
174
|
+
# `gcloud auth application-default login`
|
175
|
+
# ...and then they'll be automatically available.
|
176
|
+
# The nice thing about these keys is they can be associated with the user's login in GCP
|
177
|
+
# (e.g. my_account@gmail.com), so teams can control access to the certificate bucket
|
178
|
+
# using a mailing list of developer logins instead of generating service accounts
|
179
|
+
# and keys.
|
180
|
+
application_default_keys = nil
|
181
|
+
begin
|
182
|
+
application_default_keys = Google::Auth.get_application_default
|
183
|
+
rescue
|
184
|
+
# This means no application default keys have been installed. That's perfectly OK,
|
185
|
+
# we can continue and ask the user if they want to use a keys file.
|
186
|
+
end
|
187
|
+
|
188
|
+
if application_default_keys && UI.confirm("Do you want to use this system's Google Cloud application default keys?")
|
189
|
+
return nil
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
# User doesn't seem to have provided a keys file.
|
194
|
+
UI.message("Looks like you don't have a Google Cloud #{DEFAULT_KEYS_FILE_NAME.cyan} file")
|
164
195
|
UI.message("If you have one, make sure to put it into the '#{Dir.pwd}' directory and call it '#{DEFAULT_KEYS_FILE_NAME.cyan}'")
|
165
196
|
unless UI.confirm("Do you want fastlane to help you to create a #{DEFAULT_KEYS_FILE_NAME} file?")
|
166
197
|
UI.user_error!("Process stopped, run fastlane again to start things up again")
|
@@ -217,7 +248,7 @@ module Match
|
|
217
248
|
if available_bucket_identifiers.count > 0
|
218
249
|
@bucket_name = UI.select("What Google Cloud Storage bucket do you want to use? (you can define it using the `google_cloud_bucket_name` key)", available_bucket_identifiers)
|
219
250
|
else
|
220
|
-
UI.error("Looks like your Google Cloud account for the project ID '#{self.
|
251
|
+
UI.error("Looks like your Google Cloud account for the project ID '#{self.google_cloud_project_id}' doesn't")
|
221
252
|
UI.error("have any available storage buckets yet. Please visit the following URL")
|
222
253
|
UI.message("")
|
223
254
|
UI.message("\t\thttps://console.cloud.google.com/storage/browser".cyan)
|
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.115.0.beta.
|
4
|
+
version: 2.115.0.beta.20190127200030
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Danielle Tomlinson
|
@@ -27,7 +27,7 @@ authors:
|
|
27
27
|
autorequire:
|
28
28
|
bindir: bin
|
29
29
|
cert_chain: []
|
30
|
-
date: 2019-01-
|
30
|
+
date: 2019-01-27 00:00:00.000000000 Z
|
31
31
|
dependencies:
|
32
32
|
- !ruby/object:Gem::Dependency
|
33
33
|
name: slack-notifier
|
@@ -1687,24 +1687,24 @@ metadata:
|
|
1687
1687
|
post_install_message:
|
1688
1688
|
rdoc_options: []
|
1689
1689
|
require_paths:
|
1690
|
+
- fastlane/lib
|
1691
|
+
- snapshot/lib
|
1690
1692
|
- cert/lib
|
1691
|
-
-
|
1692
|
-
- precheck/lib
|
1693
|
-
- credentials_manager/lib
|
1693
|
+
- gym/lib
|
1694
1694
|
- sigh/lib
|
1695
|
-
-
|
1695
|
+
- credentials_manager/lib
|
1696
1696
|
- scan/lib
|
1697
|
-
-
|
1698
|
-
-
|
1697
|
+
- precheck/lib
|
1698
|
+
- supply/lib
|
1699
|
+
- screengrab/lib
|
1699
1700
|
- deliver/lib
|
1700
|
-
- gym/lib
|
1701
|
-
- frameit/lib
|
1702
|
-
- fastlane_core/lib
|
1703
|
-
- pem/lib
|
1704
1701
|
- spaceship/lib
|
1705
|
-
-
|
1702
|
+
- pilot/lib
|
1706
1703
|
- match/lib
|
1707
|
-
-
|
1704
|
+
- produce/lib
|
1705
|
+
- pem/lib
|
1706
|
+
- frameit/lib
|
1707
|
+
- fastlane_core/lib
|
1708
1708
|
required_ruby_version: !ruby/object:Gem::Requirement
|
1709
1709
|
requirements:
|
1710
1710
|
- - ">="
|