Class: Fastlane::Actions::CreateAppOnManagedPlayStoreAction

Inherits:
Action
  • Object
show all
Defined in:
lib/fastlane/plugin/managed_google_play/actions/create_app_on_managed_play_store.rb

Class Method Summary collapse

Class Method Details

.authorsObject



74
75
76
# File 'lib/fastlane/plugin/managed_google_play/actions/create_app_on_managed_play_store.rb', line 74

def self.authors
  ["Jan Piotrowski"]
end

.available_optionsObject



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/fastlane/plugin/managed_google_play/actions/create_app_on_managed_play_store.rb', line 87

def self.available_options
  [
    FastlaneCore::ConfigItem.new(
      key: :json_key,
      env_name: "SUPPLY_JSON_KEY", # TODO
      short_option: "-j",
      conflicting_options: [:json_key_data],
      optional: true, # this shouldn't be optional but is until I find out how json_key OR json_key_data can be required
      description: "The path to a file containing service account JSON, used to authenticate with Google",
      code_gen_sensitive: true,
      default_value: CredentialsManager::AppfileConfig.try_fetch_value(:json_key_file),
      default_value_dynamic: true,
      verify_block: proc do |value|
        UI.user_error!("'#{value}' doesn't seem to be a JSON file") unless FastlaneCore::Helper.json_file?(File.expand_path(value))
        UI.user_error!("Could not find service account json file at path '#{File.expand_path(value)}'") unless File.exist?(File.expand_path(value))
      end
    ),
    FastlaneCore::ConfigItem.new(
      key: :json_key_data,
      env_name: "SUPPLY_JSON_KEY_DATA", # TODO
      short_option: "-c",
      conflicting_options: [:json_key],
      optional: true,
      description: "The raw service account JSON data used to authenticate with Google",
      code_gen_sensitive: true,
      default_value: CredentialsManager::AppfileConfig.try_fetch_value(:json_key_data_raw),
      default_value_dynamic: true,
      verify_block: proc do |value|
        begin
          JSON.parse(value)
        rescue JSON::ParserError
          UI.user_error!("Could not parse service account json: JSON::ParseError")
        end
      end
    ),
    # developer_account
    FastlaneCore::ConfigItem.new(key: :developer_account_id,
      short_option: "-k",
      env_name: "PRODUCE_ITC_TEAM_ID", # TODO
      description: "The ID of your Google Play Console account. Can be obtained from the URL when you log in (`https://play.google.com/apps/publish/?account=...` or when you 'Obtain private app publishing rights' (https://developers.google.com/android/work/play/custom-app-api/get-started#retrieve_the_developer_account_id)",
      optional: false,
      is_string: false, # as we also allow integers, which we convert to strings anyway
      code_gen_sensitive: true,
      default_value: CredentialsManager::AppfileConfig.try_fetch_value(:developer_account_id),
      default_value_dynamic: true,
      verify_block: proc do |value|
        raise UI.error("No Developer Account ID given, pass using `developer_account_id: 123456789`") if value.to_s.empty?
      end),
    FastlaneCore::ConfigItem.new(
      key: :apk,
      env_name: "SUPPLY_APK", # TODO
      description: "Path to the APK file to upload",
      short_option: "-b",
      conflicting_options: [:apk_paths, :aab],
      code_gen_sensitive: true,
      default_value: Dir["*.apk"].last || Dir[File.join("app", "build", "outputs", "apk", "app-Release.apk")].last,
      default_value_dynamic: true,
      optional: true,
      verify_block: proc do |value|
        UI.user_error!("Could not find apk file at path '#{value}'") unless File.exist?(value)
        UI.user_error!("apk file is not an apk") unless value.end_with?('.apk')
      end
    ),
    # title
    FastlaneCore::ConfigItem.new(key: :app_title,
      env_name: "PRODUCE_APP_NAME", # TODO
      short_option: "-q",
      description: "App Title",
      optional: false,
      verify_block: proc do |value|
        raise UI.error("No App Title given, pass using `app_title: 'Title'`") if value.to_s.empty?
      end),
    # language
    FastlaneCore::ConfigItem.new(key: :language,
      short_option: "-m",
      env_name: "PRODUCE_LANGUAGE", # TODO
      description: "Default app language (e.g. 'en_US')",
      default_value: "en_US",
      optional: false,
      verify_block: proc do |language|
        unless AvailableLanguages.all_languages.include?(language)
          UI.user_error!("Please enter one of available languages: #{AvailableLanguages.all_languages}")
        end
      end),
    # copied from https://github.com/fastlane/fastlane/blob/2fec459d6f44a41eac1b086e8c181bd1669f7f5c/supply/lib/supply/options.rb#L193-L199
    FastlaneCore::ConfigItem.new(key: :root_url,
      env_name: "SUPPLY_ROOT_URL", # TODO
      description: "Root URL for the Google Play API. The provided URL will be used for API calls in place of https://www.googleapis.com/", # TODO check if default is true
      optional: true,
      verify_block: proc do |value|
        UI.user_error!("Could not parse URL '#{value}'") unless value =~ URI.regexp
      end),
    # copied from https://github.com/fastlane/fastlane/blob/2fec459d6f44a41eac1b086e8c181bd1669f7f5c/supply/lib/supply/options.rb#L206-L211
    FastlaneCore::ConfigItem.new(key: :timeout,
      env_name: "SUPPLY_TIMEOUT", # TODO
      optional: true,
      description: "Timeout for read, open, and send (in seconds)",
      type: Integer,
      default_value: 300)
  ]
end

.descriptionObject



70
71
72
# File 'lib/fastlane/plugin/managed_google_play/actions/create_app_on_managed_play_store.rb', line 70

def self.description
  "Create Managed Google Play Apps"
end

.detailsObject



82
83
84
85
# File 'lib/fastlane/plugin/managed_google_play/actions/create_app_on_managed_play_store.rb', line 82

def self.details
  # Optional:
  "none yet"
end

.is_supported?(platform) ⇒ Boolean

Returns:

  • (Boolean)


189
190
191
# File 'lib/fastlane/plugin/managed_google_play/actions/create_app_on_managed_play_store.rb', line 189

def self.is_supported?(platform)
  [:android].include?(platform)
end

.return_valueObject



78
79
80
# File 'lib/fastlane/plugin/managed_google_play/actions/create_app_on_managed_play_store.rb', line 78

def self.return_value
  # If your method provides a return value, you can describe here what it does
end

.run(params) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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
# File 'lib/fastlane/plugin/managed_google_play/actions/create_app_on_managed_play_store.rb', line 7

def self.run(params)
  unless params[:json_key] || params[:json_key_data]
    UI.important("To not be asked about this value, you can specify it using 'json_key'")
    params[:json_key] = UI.input("The service account json file used to authenticate with Google: ")
  end

  FastlaneCore::PrintTable.print_values(
    config: params,
    mask_keys: [:json_key_data],
    title: "Summary for CreateAppOnManagedPlayStoreAction" # TODO
  )

  require "google/apis/playcustomapp_v1"

  # Auth Info
  @keyfile = params[:json_key] # TODO json_key_data as alternative
  @developer_account = params[:developer_account_id]

  # App Info
  @apk_path = params[:apk]
  @app_title = params[:app_title]
  @language_code = params[:language]

  # login
  scope = 'https://www.googleapis.com/auth/androidpublisher'
  credentials = JSON.parse(File.open(@keyfile, 'rb').read)
  auth_client = Signet::OAuth2::Client.new(
    token_credential_uri: 'https://oauth2.googleapis.com/token',
    audience: 'https://oauth2.googleapis.com/token',
    scope: scope,
    issuer: credentials['client_id'],
    signing_key: OpenSSL::PKey::RSA.new(credentials['private_key'], nil)
  )
  UI.message('auth_client: ' + auth_client.inspect)
  auth_client.fetch_access_token!

  # service
  play_custom_apps = Google::Apis::PlaycustomappV1::PlaycustomappService.new
  play_custom_apps.authorization = auth_client
  UI.message('play_custom_apps with auth: ' + play_custom_apps.inspect)

  # app
  custom_app = Google::Apis::PlaycustomappV1::CustomApp.new(title: @app_title, language_code: @language_code)
  UI.message('custom_app: ' + custom_app.inspect)

  # create app
  returned = play_custom_apps.(
    @developer_account,
    custom_app,
    upload_source: @apk_path
  ) do |created_app, error|
    if error.nil?
      puts("Success: #{created_app}.")
      UI.success(created_app)
      UI.success(created_app.inspect)
    else
      puts("Error: #{error}")
      UI.error(error.inspect)
    end
  end
  UI.message('returned: ' + returned.inspect)
end