class Fastlane::Actions::ShuttleAction

Public Class Methods

author() click to toggle source
# File lib/fastlane/plugin/polidea/actions/shuttle.rb, line 49
def self.author
  ["Piotrek Dubiel"]
end
available_options() click to toggle source
# File lib/fastlane/plugin/polidea/actions/shuttle.rb, line 53
def self.available_options
  [
    FastlaneCore::ConfigItem.new(key: :api_token,
      env_name: "SHUTTLE_API_TOKEN",
      description: "API Token for Shuttle",
      verify_block: proc do |api_token|
        UI.user_error!("No API token for Shuttle given, pass using `api_token: 'token'`") unless api_token and !api_token.empty?
      end),
    FastlaneCore::ConfigItem.new(key: :ipa,
      env_name: "",
      description: ".ipa file for the build",
      optional: true,
      default_value: Actions.lane_context[SharedValues::IPA_OUTPUT_PATH]),
    FastlaneCore::ConfigItem.new(key: :dsym,
      env_name: "",
      description: "zipped .dsym package for the build",
      optional: true,
      default_value: Actions.lane_context[SharedValues::DSYM_OUTPUT_PATH]),
    FastlaneCore::ConfigItem.new(key: :apk,
      env_name: "",
      description: ".apk file for the build",
      optional: true,
      default_value: Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH]),
    FastlaneCore::ConfigItem.new(key: :mapping,
      env_name: "",
      description: "The path to the mapping.txt file",
      optional: true,
      default_value: Actions.lane_context[SharedValues::GRADLE_MAPPING_TXT_OUTPUT_PATH]),
    FastlaneCore::ConfigItem.new(key: :prefix_schema,
      env_name: "SHUTTLE_PREFIX_SCHEMA",
      description: "Prefix schema in uploaded app",
      default_value: Actions.lane_context[SharedValues::PREFIX_SCHEMA],
      optional: true),
    FastlaneCore::ConfigItem.new(key: :app_identifier,
      description: "App identifier, either bundle id or package name",
      type: String,
      default_value: Actions.lane_context[SharedValues::APP_IDENTIFIER]),
    FastlaneCore::ConfigItem.new(key: :app_version,
      description: "App version, eg. '1.0.0''",
      type: String,
      default_value: Actions.lane_context[SharedValues::APP_VERSION]),
    FastlaneCore::ConfigItem.new(key: :build_number,
      description: "Build number, eg. 1337",
      is_string: false,
      default_value: Actions.lane_context[SharedValues::BUILD_NUMBER],
      verify_block: proc do |build_number|
        UI.user_error!("No value found for 'build_number'") unless build_number and build_number.kind_of? Integer
      end),
    FastlaneCore::ConfigItem.new(key: :binary_size,
      description: ".ipa/.apk binary size in bytes",
      is_string: false,
      default_value: Actions.lane_context[SharedValues::BINARY_SIZE],
      verify_block: proc do |binary_size|
        UI.user_error!("No value found for 'binary_size'") unless binary_size and binary_size.kind_of? Integer
      end),
    FastlaneCore::ConfigItem.new(key: :release_notes,
      description: "Release notes to be attached to uploaded version",
      type: String,
      optional: true,
      default_value: Actions.lane_context[SharedValues::RELEASE_NOTES]),
    FastlaneCore::ConfigItem.new(key: :releaser,
      description: "Releaser email",
      type: String,
      optional: true),
    FastlaneCore::ConfigItem.new(key: :environment,
      description: "Select environment, defaults to :production",
      type: Symbol,
      default_value: :production,
      optional: true)
  ]
end
description() click to toggle source

@!group Documentation

# File lib/fastlane/plugin/polidea/actions/shuttle.rb, line 41
def self.description
  "Shuttle upload action"
end
details() click to toggle source
# File lib/fastlane/plugin/polidea/actions/shuttle.rb, line 45
def self.details
  "Notify Shuttle about new app version"
end
get_config(platform, params) click to toggle source
# File lib/fastlane/plugin/polidea/actions/shuttle.rb, line 142
def self.get_config(platform, params)
  api_token = params[:api_token]
  app_identifier = params[:app_identifier]
  app_version = params[:app_version]
  build_number = params[:build_number]
  binary_size = params[:binary_size]
  release_notes = params[:release_notes]
  releaser = params[:releaser] || commit_author

  case platform
  when :android
    apk = params[:apk]
    mapping = params[:mapping]
  when :ios
    prefix_schema = params[:prefix_schema]
    ipa = params[:ipa]
    dsym = params[:dsym]
  end

  {
    api_token: api_token,
    app_identifier: app_identifier,
    app_version: app_version,
    build_number: build_number,
    release_notes: release_notes,
    releaser: releaser,
    binary_size: binary_size,
    prefix_schema: prefix_schema,
    environment: params[:environment],
    ipa: ipa,
    apk: apk,
    mapping: mapping,
    dsym: dsym
  }
end
is_supported?(platform) click to toggle source
# File lib/fastlane/plugin/polidea/actions/shuttle.rb, line 125
def self.is_supported?(platform)
  [:ios, :android].include? platform
end
run(params) click to toggle source
# File lib/fastlane/plugin/polidea/actions/shuttle.rb, line 8
def self.run(params)
  Fastlane::Polidea.session.action_launched("shuttle", params)
  platform = Actions.lane_context[Actions::SharedValues::PLATFORM_NAME].to_sym
  options = {
    api_token: params[:api_token],
    ipa: params[:ipa],
    apk: params[:apk],
    dsym: params[:dsym],
    mapping: params[:mapping],
    prefix_schema: params[:prefix_schema],
    app_identifier: params[:app_identifier],
    app_version: params[:app_version],
    build_number: params[:build_number],
    binary_size: params[:binary_size],
    release_notes: params[:release_notes],
    releaser: params[:releaser],
    environment: params[:environment]
  }
  validate(platform, options)
  config = get_config(platform, options)
  client = Shuttle::Client.new(base_url(params[:environment]), params[:api_token])
  notify(client, platform, config)
  upload(client, platform, config)

  UI.success("Successfully uploaded to #{params[:app_identifier]} #{params[:app_version]}.#{params[:build_number]} to Shuttle")

  Fastlane::Polidea.session.action_completed("shuttle")
end
upload(client, platform, params) click to toggle source
# File lib/fastlane/plugin/polidea/actions/shuttle.rb, line 193
def self.upload(client, platform, params)
  case platform
  when :ios
    upload_urls = client.get_upload_urls(platform, params[:app_identifier], params[:prefix_schema])
    upload_build_url = upload_urls['buildUrl']
    self.upload_file(upload_build_url, params[:ipa])
    UI.success("Successfully uploaded ipa file")
    if params[:dsym]
      upload_dsym_url = upload_urls['debugFileUrl']
      self.upload_file(upload_dsym_url, params[:dsym])
      UI.success("Successfully uploaded dsym file")
    end
  when :android
    upload_urls = client.get_upload_urls(platform, params[:app_identifier], params[:build_number])
    upload_build_url = upload_urls['buildUrl']
    self.upload_file(upload_build_url, params[:apk])
    UI.success("Successfully uploaded apk file")
    if params[:mapping]
      upload_mapping_file_url = upload_urls['debugFileUrl']
      self.upload_file(upload_mapping_file_url, params[:mapping])
      UI.success("Successfully uploaded mapping file")
    end
  end
end
upload_file(url, build) click to toggle source
# File lib/fastlane/plugin/polidea/actions/shuttle.rb, line 218
def self.upload_file(url, build)
  client = S3::Client.new
  client.upload_file(url, build)
end
validate(platform, params) click to toggle source
# File lib/fastlane/plugin/polidea/actions/shuttle.rb, line 129
def self.validate(platform, params)
  case platform
  when :ios
    url_scheme = params[:prefix_schema]
    UI.user_error!("No prefix scheme given. Make sure `add_prefix_schema` action succeded before build action") if url_scheme.nil?
    ipa = params[:ipa]
    UI.user_error!("No .ipa file path given. Make sure `gym` action succeded") if ipa.nil?
  when :android
    apk = params[:apk]
    UI.user_error!("No .apk file path given. Make sure `gradle` action succeded") if apk.nil?
  end
end

Private Class Methods

base_url(environment) click to toggle source
# File lib/fastlane/plugin/polidea/actions/shuttle.rb, line 223
def self.base_url(environment)
  case environment
  when :production
    "https://shuttle.polidea.com"
  when :testing
    "https://shuttle-testing.polidea.com"
  end
end
commit_author() click to toggle source
# File lib/fastlane/plugin/polidea/actions/shuttle.rb, line 233
def self.commit_author
  sh("git --no-pager show -s --format='%ae'", print_command: false, print_command_output: false).strip
end
notify(client, platform, params) click to toggle source
# File lib/fastlane/plugin/polidea/actions/shuttle.rb, line 178
def self.notify(client, platform, params)
  build = {
    version: params[:app_version],
    releaseNotes: params[:release_notes],
    bytes: params[:binary_size],
    releaserEmail: params[:releaser]
  }

  build[:prefixSchema] = params[:prefix_schema] if platform == :ios
  build[:versionCode] = params[:build_number] if platform == :android

  client.create_build(platform, params[:app_identifier], build)
end