Class: Match::Storage::GoogleCloudStorage

Inherits:
Interface
  • Object
show all
Defined in:
match/lib/match/storage/google_cloud_storage.rb

Overview

Store the code signing identities in on Google Cloud Storage

Constant Summary collapse

DEFAULT_KEYS_FILE_NAME =
"gc_keys.json"

Constants inherited from Interface

Interface::MATCH_VERSION_FILE_NAME

Instance Attribute Summary collapse

Attributes inherited from Interface

#working_directory

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Interface

#clear_changes, #configure, #save_changes!

Constructor Details

#initialize(type: nil, platform: nil, google_cloud_bucket_name: nil, google_cloud_keys_file: nil) ⇒ GoogleCloudStorage

Returns a new instance of GoogleCloudStorage.



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'match/lib/match/storage/google_cloud_storage.rb', line 41

def initialize(type: nil,
               platform: nil,
               google_cloud_bucket_name: nil,
               google_cloud_keys_file: nil)
  @type = type if type
  @platform = platform if platform
  @bucket_name = google_cloud_bucket_name

  @google_cloud_keys_file = ensure_keys_file_exists(google_cloud_keys_file)

  # Extract the Project ID from the `JSON` file
  # so the user doesn't have to provide it manually
  keys_file_content = JSON.parse(File.read(self.google_cloud_keys_file))
  @project_id = keys_file_content["project_id"]
  if self.project_id.to_s.length == 0
    UI.user_error!("Provided keys file on path #{File.expand_path(self.google_cloud_keys_file)} doesn't include required value for `project_id`")
  end

  # Create the Google Cloud Storage client
  # If the JSON auth file is invalid, this line will
  # raise an exception
  begin
    self.gc_storage = Google::Cloud::Storage.new(
      credentials: self.google_cloud_keys_file,
      project_id: self.project_id
    )
  rescue => ex
    UI.error(ex)
    UI.verbose(ex.backtrace.join("\n"))
    UI.user_error!("Couldn't log into your Google Cloud account using the provided JSON file at path '#{File.expand_path(self.google_cloud_keys_file)}'")
  end

  ensure_bucket_is_selected
end

Instance Attribute Details

#bucket_nameObject (readonly)

Returns the value of attribute bucket_name.



18
19
20
# File 'match/lib/match/storage/google_cloud_storage.rb', line 18

def bucket_name
  @bucket_name
end

#gc_storageObject

Managed values



23
24
25
# File 'match/lib/match/storage/google_cloud_storage.rb', line 23

def gc_storage
  @gc_storage
end

#google_cloud_keys_fileObject (readonly)

Returns the value of attribute google_cloud_keys_file.



19
20
21
# File 'match/lib/match/storage/google_cloud_storage.rb', line 19

def google_cloud_keys_file
  @google_cloud_keys_file
end

#platformObject (readonly)

Returns the value of attribute platform.



17
18
19
# File 'match/lib/match/storage/google_cloud_storage.rb', line 17

def platform
  @platform
end

#project_idObject (readonly)

Returns the value of attribute project_id.



20
21
22
# File 'match/lib/match/storage/google_cloud_storage.rb', line 20

def project_id
  @project_id
end

#typeObject (readonly)

User provided values



16
17
18
# File 'match/lib/match/storage/google_cloud_storage.rb', line 16

def type
  @type
end

Class Method Details

.configure(params) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'match/lib/match/storage/google_cloud_storage.rb', line 25

def self.configure(params)
  if params[:git_url].to_s.length > 0
    UI.important("Looks like you still define a `git_url` somewhere, even though")
    UI.important("you use Google Cloud Storage. You can remove the `git_url`")
    UI.important("from your Matchfile and Fastfile")
    UI.message("The above is just a warning, fastlane will continue as usual now...")
  end

  return self.new(
    type: params[:type].to_s,
    platform: params[:platform].to_s,
    google_cloud_bucket_name: params[:google_cloud_bucket_name],
    google_cloud_keys_file: params[:google_cloud_keys_file]
  )
end

Instance Method Details

#delete_files(files_to_delete: [], custom_message: nil) ⇒ Object



94
95
96
97
98
99
100
101
102
# File 'match/lib/match/storage/google_cloud_storage.rb', line 94

def delete_files(files_to_delete: [], custom_message: nil)
  files_to_delete.each do |current_file|
    target_path = current_file.gsub(self.working_directory + "/", "")
    file = bucket.file(target_path)
    UI.message("Deleting '#{target_path}' from Google Cloud Storage bucket '#{self.bucket_name}'...")
    file.delete
  end
  finished_pushing_message
end

#downloadObject



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'match/lib/match/storage/google_cloud_storage.rb', line 76

def download
  # Check if we already have a functional working_directory
  return if @working_directory

  # No existing working directory, creating a new one now
  self.working_directory = Dir.mktmpdir

  bucket.files.each do |current_file|
    file_path = current_file.name # e.g. "N8X438SEU2/certs/distribution/XD9G7QCACF.cer"
    download_path = File.join(self.working_directory, file_path)

    FileUtils.mkdir_p(File.expand_path("..", download_path))
    UI.verbose("Downloading file from Google Cloud Storage '#{file_path}' on bucket #{self.bucket_name}")
    current_file.download(download_path)
  end
  UI.verbose("Successfully downloaded files from GCS to #{self.working_directory}")
end

#skip_docsObject



124
125
126
# File 'match/lib/match/storage/google_cloud_storage.rb', line 124

def skip_docs
  false
end

#upload_files(files_to_upload: [], custom_message: nil) ⇒ Object



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'match/lib/match/storage/google_cloud_storage.rb', line 104

def upload_files(files_to_upload: [], custom_message: nil)
  # `files_to_upload` is an array of files that need to be uploaded to Google Cloud
  # Those doesn't mean they're new, it might just be they're changed
  # Either way, we'll upload them using the same technique

  files_to_upload.each do |current_file|
    # Go from
    #   "/var/folders/px/bz2kts9n69g8crgv4jpjh6b40000gn/T/d20181026-96528-1av4gge/profiles/development/Development_me.mobileprovision"
    # to
    #   "profiles/development/Development_me.mobileprovision"
    #

    # We also have to remove the trailing `/` as Google Cloud doesn't handle it nicely
    target_path = current_file.gsub(self.working_directory + "/", "")
    UI.verbose("Uploading '#{target_path}' to Google Cloud Storage...")
    bucket.create_file(current_file, target_path)
  end
  finished_pushing_message
end