fastlane-plugin-polidea 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +52 -0
- data/lib/fastlane/plugin/polidea.rb +16 -0
- data/lib/fastlane/plugin/polidea/actions/extract_app_icon.rb +155 -0
- data/lib/fastlane/plugin/polidea/actions/extract_app_name.rb +91 -0
- data/lib/fastlane/plugin/polidea/actions/extract_version.rb +96 -0
- data/lib/fastlane/plugin/polidea/actions/get_binary_size.rb +53 -0
- data/lib/fastlane/plugin/polidea/actions/mailgun.rb +173 -0
- data/lib/fastlane/plugin/polidea/actions/polidea_store_action.rb +248 -0
- data/lib/fastlane/plugin/polidea/actions/qr_generator.rb +76 -0
- data/lib/fastlane/plugin/polidea/actions/s3.rb +551 -0
- data/lib/fastlane/plugin/polidea/helper/polidea_helper.rb +12 -0
- data/lib/fastlane/plugin/polidea/templates/images/icon-placeholder.png +0 -0
- data/lib/fastlane/plugin/polidea/templates/images/logo.png +0 -0
- data/lib/fastlane/plugin/polidea/templates/images/polidea-facebook-icon.png +0 -0
- data/lib/fastlane/plugin/polidea/templates/images/polidea-github-icon.png +0 -0
- data/lib/fastlane/plugin/polidea/templates/images/polidea-logo.png +0 -0
- data/lib/fastlane/plugin/polidea/templates/images/polidea-twitter-icon.png +0 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/css/installation-page.css +3142 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/css/installation-page.css.map +7 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/img/bg.png +0 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg.jpg +0 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_1024.jpg +0 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_1280.jpg +0 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_1360.jpg +0 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_1440.jpg +0 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_1680.jpg +0 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_768.jpg +0 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_ipad_1024.jpg +0 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_ipad_768.jpg +0 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/img/logo.svg +32 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/img/logo_square.svg +12 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation.min.js +10 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.abide.js +294 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.accordion.js +65 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.alert.js +43 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.clearing.js +558 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.dropdown.js +313 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.equalizer.js +74 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.interchange.js +344 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.joyride.js +915 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.js +625 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.magellan.js +189 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.offcanvas.js +139 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.orbit.js +472 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.reveal.js +443 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.slider.js +231 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.tab.js +167 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.tooltip.js +298 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.topbar.js +436 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/aes.js +35 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/enc-base64-min.js +8 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/fastclick.js +9 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/jquery.cookie.js +8 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/jquery.js +26 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/modernizr.js +8 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/pbkdf2.js +19 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/placeholder.js +2 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/fonts.scss +64 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation.scss +45 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/_functions.scss +101 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/_settings.scss +1441 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_accordion.scss +156 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_alert-boxes.scss +126 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_block-grid.scss +132 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_breadcrumbs.scss +132 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_button-groups.scss +200 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_buttons.scss +252 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_clearing.scss +247 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_dropdown-buttons.scss +129 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_dropdown.scss +248 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_flex-video.scss +51 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_forms.scss +570 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_global.scss +447 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_grid.scss +275 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_icon-bar.scss +293 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_inline-lists.scss +57 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_joyride.scss +222 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_keystrokes.scss +61 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_labels.scss +105 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_magellan.scss +34 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_offcanvas.scss +510 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_orbit.scss +368 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_pagination.scss +162 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_panels.scss +93 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_pricing-tables.scss +150 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_progress-bars.scss +79 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_range-slider.scss +168 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_reveal.scss +220 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_side-nav.scss +116 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_split-buttons.scss +191 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_sub-nav.scss +125 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_switches.scss +226 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_tables.scss +135 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_tabs.scss +123 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_thumbs.scss +66 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_toolbar.scss +70 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_tooltips.scss +142 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_top-bar.scss +676 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_type.scss +523 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_visibility.scss +408 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/installation-page.scss +171 -0
- data/lib/fastlane/plugin/polidea/templates/installation-page/sass/normalize.scss +425 -0
- data/lib/fastlane/plugin/polidea/templates/installation_template.erb +58 -0
- data/lib/fastlane/plugin/polidea/templates/mailgun_template.erb +1225 -0
- data/lib/fastlane/plugin/polidea/version.rb +5 -0
- metadata +323 -0
@@ -0,0 +1,53 @@
|
|
1
|
+
module Fastlane
|
2
|
+
module Actions
|
3
|
+
module SharedValues
|
4
|
+
BINARY_SIZE = :BINARY_SIZE
|
5
|
+
end
|
6
|
+
|
7
|
+
class GetBinarySizeAction < Action
|
8
|
+
def self.run(config)
|
9
|
+
binary_file = config[:binary]
|
10
|
+
|
11
|
+
UI.user_error!("No IPA or APK file path given, pass using `binary: 'ipa or apk path'`") unless binary_file.to_s.length > 0
|
12
|
+
|
13
|
+
binary_size = File.open(binary_file).size
|
14
|
+
binary_size_in_mb = (binary_size / 1024.0 / 1024.0).round(2)
|
15
|
+
|
16
|
+
Actions.lane_context[SharedValues::BINARY_SIZE] = binary_size
|
17
|
+
ENV[SharedValues::BINARY_SIZE.to_s] = binary_size.to_s
|
18
|
+
|
19
|
+
UI.success("Size of #{binary_file} is #{binary_size_in_mb} MB (#{binary_size} bytes)")
|
20
|
+
|
21
|
+
binary_size
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.description
|
25
|
+
"Measures binary size in bytes"
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.available_options
|
29
|
+
[
|
30
|
+
FastlaneCore::ConfigItem.new(key: :binary,
|
31
|
+
env_name: "",
|
32
|
+
description: ".ipa or .apk file from the build ",
|
33
|
+
optional: true,
|
34
|
+
default_value: Actions.lane_context[SharedValues::IPA_OUTPUT_PATH] || Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH])
|
35
|
+
]
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.output
|
39
|
+
[
|
40
|
+
['BINARY_SIZE', 'Size of .ipa/.apk in bytes']
|
41
|
+
]
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.author
|
45
|
+
"Piotrek Dubiel"
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.is_supported?(platform)
|
49
|
+
[:ios, :android].include? platform
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,173 @@
|
|
1
|
+
# rubocop:disable Metrics/MethodLength
|
2
|
+
require 'fastlane/erb_template_helper'
|
3
|
+
|
4
|
+
module Fastlane
|
5
|
+
module Actions
|
6
|
+
class MailgunAction < Action
|
7
|
+
def self.is_supported?(platform)
|
8
|
+
true
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.run(options)
|
12
|
+
Actions.verify_gem!('rest-client')
|
13
|
+
Actions.verify_gem!('premailer')
|
14
|
+
require 'rest-client'
|
15
|
+
require 'premailer'
|
16
|
+
inline_images(options)
|
17
|
+
mailgunit(options)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.description
|
21
|
+
"Send a success/error message to an email group"
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.available_options
|
25
|
+
[
|
26
|
+
FastlaneCore::ConfigItem.new(key: :postmaster,
|
27
|
+
env_name: "MAILGUN_SANDBOX_POSTMASTER",
|
28
|
+
description: "Mailgun sandbox domain postmaster for your mail"),
|
29
|
+
FastlaneCore::ConfigItem.new(key: :apikey,
|
30
|
+
env_name: "MAILGUN_APIKEY",
|
31
|
+
description: "Mailgun apikey for your mail"),
|
32
|
+
FastlaneCore::ConfigItem.new(key: :to,
|
33
|
+
env_name: "MAILGUN_TO",
|
34
|
+
description: "Destination of your mail"),
|
35
|
+
FastlaneCore::ConfigItem.new(key: :from,
|
36
|
+
env_name: "MAILGUN_FROM",
|
37
|
+
optional: true,
|
38
|
+
description: "Mailgun sender name",
|
39
|
+
default_value: "Mailgun Sandbox"),
|
40
|
+
FastlaneCore::ConfigItem.new(key: :success,
|
41
|
+
env_name: "MAILGUN_SUCCESS",
|
42
|
+
description: "Was this build successful? (true/false)",
|
43
|
+
optional: true,
|
44
|
+
default_value: true,
|
45
|
+
is_string: false),
|
46
|
+
FastlaneCore::ConfigItem.new(key: :ci_build_link,
|
47
|
+
env_name: "MAILGUN_CI_BUILD_LINK",
|
48
|
+
description: "CI Build Link",
|
49
|
+
optional: true,
|
50
|
+
is_string: true),
|
51
|
+
FastlaneCore::ConfigItem.new(key: :template_path,
|
52
|
+
env_name: "MAILGUN_TEMPLATE_PATH",
|
53
|
+
description: "Mail HTML template",
|
54
|
+
optional: true,
|
55
|
+
is_string: true),
|
56
|
+
FastlaneCore::ConfigItem.new(key: :app_icon,
|
57
|
+
env_name: "MAILGUN_APP_ICON",
|
58
|
+
description: "Path to app icon file",
|
59
|
+
is_string: true,
|
60
|
+
optional: true,
|
61
|
+
default_value: Actions.lane_context[SharedValues::ICON_OUTPUT_PATH]),
|
62
|
+
FastlaneCore::ConfigItem.new(key: :app_name,
|
63
|
+
env_name: "MAILGUN_APP_NAME",
|
64
|
+
description: "Application name",
|
65
|
+
is_string: true,
|
66
|
+
default_value: Actions.lane_context[SharedValues::APP_NAME]),
|
67
|
+
FastlaneCore::ConfigItem.new(key: :app_version,
|
68
|
+
env_name: "MAILGUN_APP_VERSION",
|
69
|
+
description: "Application version",
|
70
|
+
is_string: true,
|
71
|
+
default_value: Actions.lane_context[SharedValues::APP_VERSION]),
|
72
|
+
FastlaneCore::ConfigItem.new(key: :build_number,
|
73
|
+
env_name: "MAILGUN_BUILD_NUMBER",
|
74
|
+
description: "Build number",
|
75
|
+
default_value: Actions.lane_context[SharedValues::BUILD_NUMBER]),
|
76
|
+
FastlaneCore::ConfigItem.new(key: :installation_link,
|
77
|
+
env_name: "MAILGUN_INSTALLATION_LINK",
|
78
|
+
description: "Link to installation page",
|
79
|
+
is_string: true,
|
80
|
+
default_value: Actions.lane_context[SharedValues::S3_HTML_OUTPUT_PATH]),
|
81
|
+
FastlaneCore::ConfigItem.new(key: :release_notes,
|
82
|
+
env_name: "MAILGUN_RELEASE_NOTES",
|
83
|
+
description: "Release notes",
|
84
|
+
type: Array,
|
85
|
+
optional: true,
|
86
|
+
default_value: []),
|
87
|
+
FastlaneCore::ConfigItem.new(key: :binary_size,
|
88
|
+
env_name: "MAILGUN_BINARY_SIZE",
|
89
|
+
description: "Binary size",
|
90
|
+
type: Fixnum,
|
91
|
+
default_value: Actions.lane_context[SharedValues::BINARY_SIZE]),
|
92
|
+
FastlaneCore::ConfigItem.new(key: :inline,
|
93
|
+
type: Array,
|
94
|
+
optional: true,
|
95
|
+
default_value: [])
|
96
|
+
]
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.author
|
100
|
+
"thiagolioy"
|
101
|
+
end
|
102
|
+
|
103
|
+
def self.inline_images(options)
|
104
|
+
base_path = "#{__dir__}/../templates/images"
|
105
|
+
options[:inline] = [
|
106
|
+
qr_code(options[:installation_link]),
|
107
|
+
File.new(options[:app_icon])
|
108
|
+
]
|
109
|
+
images = [
|
110
|
+
"polidea-facebook-icon.png",
|
111
|
+
"polidea-github-icon.png",
|
112
|
+
"polidea-logo.png",
|
113
|
+
"polidea-twitter-icon.png"
|
114
|
+
]
|
115
|
+
images << "icon-placeholder.png" unless options[:app_icon]
|
116
|
+
options[:inline].concat(images.map { |image| File.new("#{base_path}/#{image}") })
|
117
|
+
end
|
118
|
+
|
119
|
+
def self.qr_code(installation_link)
|
120
|
+
qr_code_path = "/tmp/qr_code.png"
|
121
|
+
QRGenerator.new(installation_link, false, ::ChunkyPNG::Color.rgb(103, 103, 103)).generate(qr_code_path)
|
122
|
+
File.new(qr_code_path)
|
123
|
+
end
|
124
|
+
|
125
|
+
def self.mailgunit(options)
|
126
|
+
sandbox_domain = options[:postmaster].split("@").last
|
127
|
+
body = mail_template(options)
|
128
|
+
RestClient.post "https://api:#{options[:apikey]}@api.mailgun.net/v3/#{sandbox_domain}/messages",
|
129
|
+
from: "#{options[:from]}<#{options[:postmaster]}>",
|
130
|
+
to: (options[:to]).to_s,
|
131
|
+
subject: "#{options[:app_name]} #{options[:app_version]} (#{options[:build_number]}) for #{Actions.lane_context[Actions::SharedValues::PLATFORM_NAME]} is ready to install",
|
132
|
+
html: body,
|
133
|
+
inline: options[:inline]
|
134
|
+
return body
|
135
|
+
end
|
136
|
+
|
137
|
+
def self.mail_template(options)
|
138
|
+
hash = {
|
139
|
+
author: Actions.git_author_email,
|
140
|
+
last_commit: Actions.last_git_commit_message,
|
141
|
+
is_android: Actions.lane_context[Actions::SharedValues::PLATFORM_NAME] == :android,
|
142
|
+
app_icon: File.basename(options[:app_icon]),
|
143
|
+
app_name: options[:app_name],
|
144
|
+
app_version: options[:app_version],
|
145
|
+
build_number: options[:build_number],
|
146
|
+
installation_link: options[:installation_link],
|
147
|
+
release_notes: options[:release_notes],
|
148
|
+
platform: Actions.lane_context[Actions::SharedValues::PLATFORM_NAME],
|
149
|
+
release_date: DateTime.now.strftime('%b %d, %Y'),
|
150
|
+
binary_size: (options[:binary_size] / 1024.0 / 1024.0).round(2).to_s
|
151
|
+
}
|
152
|
+
hash[:success] = options[:success]
|
153
|
+
hash[:ci_build_link] = options[:ci_build_link]
|
154
|
+
|
155
|
+
# grabs module
|
156
|
+
eth = Fastlane::ErbTemplateHelper
|
157
|
+
# create html from template
|
158
|
+
html_template_path = options[:template_path]
|
159
|
+
if html_template_path && File.exist?(html_template_path)
|
160
|
+
html_template = eth.load_from_path(html_template_path)
|
161
|
+
else
|
162
|
+
html_template = eth.load_from_path("#{__dir__}/../templates/mailgun_template.erb")
|
163
|
+
end
|
164
|
+
premailer = Premailer.new(
|
165
|
+
eth.render(html_template, hash),
|
166
|
+
{ warn_level: Premailer::Warnings::SAFE, with_html_string: true }
|
167
|
+
)
|
168
|
+
premailer.to_inline_css
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
# rubocop:enable Metrics/MethodLength
|
@@ -0,0 +1,248 @@
|
|
1
|
+
# rubocop:disable Metrics/MethodLength
|
2
|
+
|
3
|
+
require 'net/http'
|
4
|
+
require 'uri'
|
5
|
+
require 'json'
|
6
|
+
|
7
|
+
module Fastlane
|
8
|
+
module Actions
|
9
|
+
class PolideaStoreAction < Action
|
10
|
+
def self.run(params)
|
11
|
+
platform = Actions.lane_context[Actions::SharedValues::PLATFORM_NAME].to_sym
|
12
|
+
validate(platform, params)
|
13
|
+
config = get_config(platform, params)
|
14
|
+
app_name, app_identifier, version = notify(platform, config)
|
15
|
+
|
16
|
+
UI.success("Successfully uploaded #{app_name} (#{app_identifier})")
|
17
|
+
UI.success("version: #{version}")
|
18
|
+
UI.success("using icon from #{params[:icon_url]}")
|
19
|
+
UI.success("using plist from #{params[:plist_url]}") if platform == :ios
|
20
|
+
UI.success("with release notes: #{params[:release_notes]}") if params[:release_notes]
|
21
|
+
end
|
22
|
+
|
23
|
+
#####################################################
|
24
|
+
# @!group Documentation
|
25
|
+
#####################################################
|
26
|
+
|
27
|
+
def self.description
|
28
|
+
"Polidea Store upload action"
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.details
|
32
|
+
"Notify Polidea Store about new app version"
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.author
|
36
|
+
["Piotrek Dubiel"]
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.available_options
|
40
|
+
[
|
41
|
+
FastlaneCore::ConfigItem.new(key: :api_token,
|
42
|
+
env_name: "POLIDEA_STORE_API_TOKEN",
|
43
|
+
description: "API Token for Polidea Store",
|
44
|
+
verify_block: proc do |value|
|
45
|
+
UI.user_error!("No API token for Polidea Store given, pass using `api_token: 'token'`") unless value and !value.empty?
|
46
|
+
end),
|
47
|
+
FastlaneCore::ConfigItem.new(key: :ipa,
|
48
|
+
env_name: "",
|
49
|
+
description: ".ipa file for the build ",
|
50
|
+
optional: true,
|
51
|
+
default_value: Actions.lane_context[SharedValues::IPA_OUTPUT_PATH]),
|
52
|
+
FastlaneCore::ConfigItem.new(key: :apk,
|
53
|
+
env_name: "",
|
54
|
+
description: ".apk file for the build ",
|
55
|
+
optional: true,
|
56
|
+
default_value: Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH]),
|
57
|
+
FastlaneCore::ConfigItem.new(key: :plist_url,
|
58
|
+
env_name: "POLIDEA_STORE_PLIST_URL",
|
59
|
+
description: "Url to uploaded plist",
|
60
|
+
default_value: Actions.lane_context[SharedValues::S3_PLIST_OUTPUT_PATH],
|
61
|
+
verify_block: proc do |value|
|
62
|
+
UI.user_error!("No plist url given, pass using `plist_url: 'url'` or make sure s3 action succeded and exposed S3_PLIST_OUTPUT_PATH shared value") unless value and !value.empty?
|
63
|
+
end),
|
64
|
+
FastlaneCore::ConfigItem.new(key: :apk_url,
|
65
|
+
env_name: "POLIDEA_STORE_APK_URL",
|
66
|
+
description: "Url to uploaded apk",
|
67
|
+
default_value: Actions.lane_context[SharedValues::S3_APK_OUTPUT_PATH],
|
68
|
+
verify_block: proc do |value|
|
69
|
+
UI.user_error!("No apk url given, pass using `apk_url: 'url'` or make sure s3 action succeded and exposed S3_APK_OUTPUT_PATH shared value") unless value and !value.empty?
|
70
|
+
end),
|
71
|
+
FastlaneCore::ConfigItem.new(key: :icon_url,
|
72
|
+
env_name: "POLIDEA_STORE_ICON_URL",
|
73
|
+
description: "Url to uploaded app icon",
|
74
|
+
default_value: Actions.lane_context[SharedValues::S3_ICON_OUTPUT_PATH],
|
75
|
+
verify_block: proc do |value|
|
76
|
+
UI.user_error!("No icon url given, pass using `icon_url: 'url'` or make sure s3 action succeded and exposed S3_ICON_OUTPUT_PATH shared value") unless value and !value.empty?
|
77
|
+
end),
|
78
|
+
FastlaneCore::ConfigItem.new(key: :release_notes,
|
79
|
+
env_name: "POLIDEA_STORE_RELEASE_NOTES",
|
80
|
+
description: "Release notes to be attached to uploaded version",
|
81
|
+
is_string: true,
|
82
|
+
optional: true),
|
83
|
+
FastlaneCore::ConfigItem.new(key: :app_name,
|
84
|
+
env_name: "",
|
85
|
+
description: "Application name (defaults to bundle name on iOS)", # TODO: edit for Android
|
86
|
+
is_string: true,
|
87
|
+
optional: true),
|
88
|
+
FastlaneCore::ConfigItem.new(key: :bundle_id,
|
89
|
+
env_name: "",
|
90
|
+
description: "Bundle id",
|
91
|
+
is_string: true,
|
92
|
+
optional: true),
|
93
|
+
FastlaneCore::ConfigItem.new(key: :bundle_version,
|
94
|
+
env_name: "",
|
95
|
+
description: "Bundle version", # TODO: edit for Android
|
96
|
+
is_string: true,
|
97
|
+
optional: true),
|
98
|
+
FastlaneCore::ConfigItem.new(key: :package_name,
|
99
|
+
env_name: "",
|
100
|
+
description: "Package name",
|
101
|
+
is_string: true,
|
102
|
+
optional: true),
|
103
|
+
FastlaneCore::ConfigItem.new(key: :version_name,
|
104
|
+
env_name: "",
|
105
|
+
description: "Version name",
|
106
|
+
is_string: true,
|
107
|
+
optional: true),
|
108
|
+
FastlaneCore::ConfigItem.new(key: :version_code,
|
109
|
+
env_name: "",
|
110
|
+
description: "Version code",
|
111
|
+
type: Fixnum,
|
112
|
+
optional: true),
|
113
|
+
FastlaneCore::ConfigItem.new(key: :binary_size,
|
114
|
+
env_name: "POLIDEA_STORE_RELESASE_NOTES",
|
115
|
+
description: ".ipa/.apk binary size in bytes",
|
116
|
+
type: Fixnum,
|
117
|
+
optional: true)
|
118
|
+
]
|
119
|
+
end
|
120
|
+
|
121
|
+
def self.is_supported?(platform)
|
122
|
+
[:ios, :android].include? platform
|
123
|
+
end
|
124
|
+
|
125
|
+
def self.validate(platform, params)
|
126
|
+
binary_size = params[:binary_size] || Actions.lane_context[Actions::SharedValues::BINARY_SIZE]
|
127
|
+
UI.user_error!("No binary size given, pass using `binary_size: bytes` or make sure get_binary_size action succeded and exposed BINARY_SIZE shared value") unless binary_size and !binary_size.nil?
|
128
|
+
|
129
|
+
case platform
|
130
|
+
when :android
|
131
|
+
UI.user_error!("No .apk file given, pass using `apk: 'apk path'` or make sure gradle action succeded and exposed GRADLE_APK_OUTPUT_PATH shared value") unless params[:apk] and !params[:apk].empty?
|
132
|
+
when :ios
|
133
|
+
UI.user_error!("No .ipa file given, pass using `ipa: 'ipa path'` or make sure gym action succeded and exposed IPA_OUTPUT_PATH shared value") unless params[:ipa] and !params[:ipa].empty?
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def self.get_config(platform, params)
|
138
|
+
binary_size = params[:binary_size] || Actions.lane_context[Actions::SharedValues::BINARY_SIZE]
|
139
|
+
|
140
|
+
case platform
|
141
|
+
when :ios
|
142
|
+
info = FastlaneCore::IpaFileAnalyser.fetch_info_plist_file(params[:ipa])
|
143
|
+
app_name = params[:app_name] || info['CFBundleName']
|
144
|
+
app_identifier = params[:bundle_id] || info['CFBundleIdentifier']
|
145
|
+
version = params[:bundle_version] || info['CFBundleShortVersionString']
|
146
|
+
href = params[:plist_url]
|
147
|
+
url_scheme = get_url_scheme(info)
|
148
|
+
when :android
|
149
|
+
manifest = Android::Apk.new(params[:apk]).manifest
|
150
|
+
app_name = params[:app_name] || manifest.label
|
151
|
+
app_identifier = params[:package_name] || manifest.package_name
|
152
|
+
version = params[:version_name] || manifest.version_name
|
153
|
+
version_code = params[:version_code] || manifest.version_code
|
154
|
+
href = params[:apk_url]
|
155
|
+
end
|
156
|
+
|
157
|
+
config = {
|
158
|
+
api_token: params[:api_token],
|
159
|
+
app_name: app_name,
|
160
|
+
app_identifier: app_identifier,
|
161
|
+
version: version,
|
162
|
+
version_code: version_code,
|
163
|
+
icon_url: params[:icon_url],
|
164
|
+
href: href,
|
165
|
+
release_notes: params[:release_notes],
|
166
|
+
binary_size: binary_size,
|
167
|
+
url_scheme: url_scheme
|
168
|
+
}
|
169
|
+
|
170
|
+
return config
|
171
|
+
end
|
172
|
+
|
173
|
+
def self.notify(platform, params)
|
174
|
+
uri = URI.parse(url(platform, params[:app_identifier]))
|
175
|
+
|
176
|
+
version = {
|
177
|
+
version: params[:version],
|
178
|
+
releaseNotes: params[:release_notes],
|
179
|
+
href: params[:href],
|
180
|
+
bytes: params[:binary_size]
|
181
|
+
}
|
182
|
+
|
183
|
+
version[:prefixSchema] = params[:url_scheme] if platform == :ios
|
184
|
+
version[:versionCode] = params[:version_code] if platform == :android
|
185
|
+
|
186
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
187
|
+
http.use_ssl = true
|
188
|
+
|
189
|
+
req = create_request(uri, params[:api_token], {
|
190
|
+
name: params[:app_name],
|
191
|
+
icon: {
|
192
|
+
href: params[:icon_url]
|
193
|
+
},
|
194
|
+
versions: [version]
|
195
|
+
})
|
196
|
+
|
197
|
+
response = http.request(req)
|
198
|
+
unless response.code == "204"
|
199
|
+
UI.user_error! "Polidea Store backend responded with [#{response.code}] #{response.body}"
|
200
|
+
end
|
201
|
+
|
202
|
+
return params[:app_name], params[:app_identifier], params[:version]
|
203
|
+
end
|
204
|
+
private_class_method :notify
|
205
|
+
|
206
|
+
def self.url(platform, app_identifier)
|
207
|
+
"#{base_url}/#{platform}/apps/#{app_identifier}/versions"
|
208
|
+
end
|
209
|
+
private_class_method :url
|
210
|
+
|
211
|
+
def self.base_url
|
212
|
+
"https://polideastore.herokuapp.com"
|
213
|
+
# "https://polideastore-staging.herokuapp.com"
|
214
|
+
end
|
215
|
+
private_class_method :base_url
|
216
|
+
|
217
|
+
def self.create_request(uri, upload_token, params)
|
218
|
+
req = Net::HTTP::Post.new(uri.request_uri)
|
219
|
+
req['Content-Type'] = 'application/json'
|
220
|
+
req['Upload-Token'] = upload_token
|
221
|
+
req.body = JSON.generate(params)
|
222
|
+
req
|
223
|
+
end
|
224
|
+
private_class_method :create_request
|
225
|
+
|
226
|
+
def self.itms_href(plist_url)
|
227
|
+
"itms-services://?action=download-manifest&url=#{plist_url}"
|
228
|
+
end
|
229
|
+
private_class_method :itms_href
|
230
|
+
|
231
|
+
def self.get_url_scheme(plist)
|
232
|
+
url_scheme = nil
|
233
|
+
url_types = plist['CFBundleURLTypes']
|
234
|
+
unless url_types.nil?
|
235
|
+
url_type = url_types[0]
|
236
|
+
url_schemes = url_type['CFBundleURLSchemes']
|
237
|
+
unless url_schemes.nil?
|
238
|
+
url_scheme = url_schemes[0]
|
239
|
+
end
|
240
|
+
end
|
241
|
+
url_scheme
|
242
|
+
end
|
243
|
+
private_class_method :get_url_scheme
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
# rubocop:enable Metrics/MethodLength
|