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