class Fastlane::Actions::PgyerJvtdAction

Public Class Methods

authors() click to toggle source
# File lib/fastlane/plugin/pgyer_jvtd/actions/pgyer_jvtd_action.rb, line 218
def self.authors
  ["chenlei"]
end
available_options() click to toggle source
# File lib/fastlane/plugin/pgyer_jvtd/actions/pgyer_jvtd_action.rb, line 231
def self.available_options
  [
      FastlaneCore::ConfigItem.new(key: :api_key,
                                   env_name: "PGYER_API_KEY",
                                   description: "api_key in your pgyer account",
                                   optional: false,
                                   type: String),
      FastlaneCore::ConfigItem.new(key: :user_key,
                                   env_name: "PGYER_USER_KEY",
                                   description: "user_key in your pgyer account",
                                   optional: false,
                                   type: String),
      FastlaneCore::ConfigItem.new(key: :apk,
                                   env_name: "PGYER_APK",
                                   description: "Path to your APK file",
                                   default_value: Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH],
                                   optional: true,
                                   verify_block: proc do |value|
                                     UI.user_error!("Couldn't find apk file at path '#{value}'") unless File.exist?(value)
                                   end,
                                   conflicting_options: [:ipa],
                                   conflict_block: proc do |value|
                                     UI.user_error!("You can't use 'apk' and '#{value.key}' options in one run")
                                   end),
      FastlaneCore::ConfigItem.new(key: :ipa,
                                   env_name: "PGYER_IPA",
                                   description: "Path to your IPA file. Optional if you use the _gym_ or _xcodebuild_ action. For Mac zip the .app. For Android provide path to .apk file",
                                   default_value: Actions.lane_context[SharedValues::IPA_OUTPUT_PATH],
                                   optional: true,
                                   verify_block: proc do |value|
                                     UI.user_error!("Couldn't find ipa file at path '#{value}'") unless File.exist?(value)
                                   end,
                                   conflicting_options: [:apk],
                                   conflict_block: proc do |value|
                                     UI.user_error!("You can't use 'ipa' and '#{value.key}' options in one run")
                                   end),
      FastlaneCore::ConfigItem.new(key: :password,
                                   env_name: "PGYER_PASSWORD",
                                   description: "set password to protect app",
                                   optional: true,
                                   type: String),
      FastlaneCore::ConfigItem.new(key: :update_description,
                                   env_name: "PGYER_UPDATE_DESCRIPTION",
                                   description: "set update description for app",
                                   optional: true,
                                   type: String),
      FastlaneCore::ConfigItem.new(key: :install_type,
                                   env_name: "PGYER_INSTALL_TYPE",
                                   description: "set install type for app (1=public, 2=password, 3=invite). Please set as a string",
                                   optional: true,
                                   type: String),
      FastlaneCore::ConfigItem.new(key: :channel_shortcut,
                                   env_name: "PGYER_CHANNEL",
                                   description: "Use channel short link. Please set as a string",
                                   optional: true,
                                   type: String),
      FastlaneCore::ConfigItem.new(key: :dingtalk_access_token,
                                   env_name: "DINGTALK_ACCESS_TOKEN",
                                   description: "Set up webhook and push update messages. Please set as a string",
                                   optional: true,
                                   type: String),
      FastlaneCore::ConfigItem.new(key: :is_at_all,
                                   env_name: "DINGTALK_IS_AT_ALL",
                                   description: "set is at all for dingtalk (0=not_all, 1=all). Please set as a string",
                                   optional: true,
                                   type: String),
      FastlaneCore::ConfigItem.new(key: :environment,
                                   env_name: "ENVIRONMENT",
                                   description: "set environment (dev, pub). Please set as a string",
                                   optional: true,
                                   type: String)
  ]
end
description() click to toggle source
# File lib/fastlane/plugin/pgyer_jvtd/actions/pgyer_jvtd_action.rb, line 214
def self.description
  "distribute app to pgyer beta testing service"
end
details() click to toggle source
# File lib/fastlane/plugin/pgyer_jvtd/actions/pgyer_jvtd_action.rb, line 226
def self.details
  # Optional:
  "distribute app to pgyer beta testing service"
end
is_supported?(platform) click to toggle source
# File lib/fastlane/plugin/pgyer_jvtd/actions/pgyer_jvtd_action.rb, line 305
def self.is_supported?(platform)
  # Adjust this if your plugin only works for a particular platform (iOS vs. Android, for example)
  # See: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Platforms.md
  #
  [:ios, :mac, :android].include?(platform)
  true
end
return_value() click to toggle source
# File lib/fastlane/plugin/pgyer_jvtd/actions/pgyer_jvtd_action.rb, line 222
def self.return_value
  # If your method provides a return value, you can describe here what it does
end
run(params) click to toggle source
# File lib/fastlane/plugin/pgyer_jvtd/actions/pgyer_jvtd_action.rb, line 9
def self.run(params)
  UI.message("The pgyer plugin is working.")

  api_host = "https://www.pgyer.com/apiv2/app/upload"
  api_key = params[:api_key]
  user_key = params[:user_key]
  access_token = params[:dingtalk_access_token]
  is_at_all = params[:is_at_all]
  environment = params[:environment]

  if is_at_all.nil?
    is_at_all = "0"
  end

  if environment.nil?
    environment = "dev"
  end

  info = nil

  if api_key != "test"
    build_file = [
        params[:ipa],
        params[:apk]
    ].detect { |e| !e.to_s.empty? }

    if build_file.nil?
      UI.user_error!("You have to provide a build file")
    end

    UI.message "build_file: #{build_file}"

    password = params[:password]
    if password.nil?
      password = ""
    end

    update_description = params[:update_description]
    if update_description.nil?
      update_description = ""
    end

    install_type = params[:install_type]
    if install_type.nil?
      install_type = "1"
    end

    channel_shortcut = params[:channel_shortcut]
    if channel_shortcut.nil?
      channel_shortcut = ""
    end

    # start upload
    conn_options = {
        request: {
            timeout: 1000,
            open_timeout: 300
        }
    }

    pgyer_client = Faraday.new(nil, conn_options) do |c|
      c.request :multipart
      c.request :url_encoded
      c.response :json, content_type: /\bjson$/
      c.adapter :net_http
    end

    params = {
        '_api_key' => api_key,
        'userKey' => user_key,
        'buildPassword' => password,
        'buildUpdateDescription' => update_description,
        'buildInstallType' => install_type,
        'buildInstallDate' => "2",
        'buildChannelShortcut' => channel_shortcut,
        'file' => Faraday::UploadIO.new(build_file, 'application/octet-stream')
    }

    UI.message "Start upload #{build_file} to pgyer..."

    response = pgyer_client.post api_host, params
    info = response.body

    if info['code'] != 0
      UI.user_error!("PGYER Plugin Error: #{info['message']}")
      return
    end

    UI.success "Upload success. Visit this URL to see: https://www.pgyer.com/#{info['data']['buildShortcutUrl']}"
  else
  end

  appType = "Android";
  appName = "测试应用"
  appVersion = "1.0.0"
  appBuildVersion = 1
  appIcon = ""
  appUrl = "https://www.pgyer.com/#{channel_shortcut}"
  appEnvironment = "测试环境"
  if environment == "pub"
    appEnvironment = "正式环境"
  end
  appQrCode = appIcon;
  if info != nil
    # 应用类型
    if info['data']['buildType'] == 1 || info['data']['buildType'] == "1"
      appType = "iOS"
    end
    # 应用名称
    appName = info['data']['buildName']
    # 应用版本信息
    appVersion = info['data']['buildVersion']
    # 应用蒲公英版本
    appBuildVersion = info['data']['buildBuildVersion']
    # 图标
    appIcon = "https://appicon.pgyer.com/image/view/app_icons/#{info['data']['buildIcon']}"
    # 地址
    if channel_shortcut.nil?
      appUrl = "https://www.pgyer.com/#{info['data']['buildShortcutUrl']}"
    end
    appQrCode = info['data']['buildQRCodeURL'];
  end

  unless access_token.nil?

    uriStr = "https://oapi.dingtalk.com/robot/send?access_token=#{access_token}";
    uri = URI.parse(uriStr)
    UI.success uriStr

    params = {
        "msgtype" => "text",
        "text" => {
            "content" => "#{appName}#{appType} App最新#{appEnvironment}版本已发布"
        },
        "at" => {
            "atMobiles" => [],
            "isAtAll" => is_at_all == "1"
        }
    }

    https = Net::HTTP.new(uri.host, uri.port)
    https.use_ssl = true
    req = Net::HTTP::Post.new(uri.request_uri)
    req.body = params.to_json
    req.content_type = 'application/json'
    resp = https.request(req)
    info = JSON.parse(resp.body)

    if info['errcode'] != 0
      UI.error('ding talk error message: ' + info["errmsg"])
    end

    params = {
        "msgtype" => "link",
        "link" => {
            "title" => "#{appName}#{appType} App发布",
            "text" => "请下载最新版本#{appVersion}(#{appBuildVersion})\n此版本为#{appEnvironment}",
            "picUrl" => appIcon,
            "messageUrl" => appUrl
        }
    }

    https = Net::HTTP.new(uri.host, uri.port)
    https.use_ssl = true
    req = Net::HTTP::Post.new(uri.request_uri)
    req.body = params.to_json
    req.content_type = 'application/json'
    resp = https.request(req)
    info = JSON.parse(resp.body)

    if info['errcode'] != 0
      UI.error('ding talk error message: ' + info["errmsg"])
    end

    params = {
        "msgtype" => "markdown",
        "markdown" => {
            "title" => "#{appName}#{appType} App最新#{appEnvironment}版本",
            "text" => "> 扫描二维码即可安装\n" +
                "> ![qrcode](#{appQrCode})\n"
        },
        "at" => {
            "atMobiles" => [],
            "isAtAll" => is_at_all == "1"
        }
    }

    https = Net::HTTP.new(uri.host, uri.port)
    https.use_ssl = true
    req = Net::HTTP::Post.new(uri.request_uri)
    req.body = params.to_json
    req.content_type = 'application/json'
    resp = https.request(req)
    info = JSON.parse(resp.body)

    if info['errcode'] != 0
      UI.error('ding talk error message: ' + info["errmsg"])
    end

    UI.success("Successfully send qr code to ding talk!")
  else
  end

end