fastlane-plugin-polidea 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +52 -0
  4. data/lib/fastlane/plugin/polidea.rb +16 -0
  5. data/lib/fastlane/plugin/polidea/actions/extract_app_icon.rb +155 -0
  6. data/lib/fastlane/plugin/polidea/actions/extract_app_name.rb +91 -0
  7. data/lib/fastlane/plugin/polidea/actions/extract_version.rb +96 -0
  8. data/lib/fastlane/plugin/polidea/actions/get_binary_size.rb +53 -0
  9. data/lib/fastlane/plugin/polidea/actions/mailgun.rb +173 -0
  10. data/lib/fastlane/plugin/polidea/actions/polidea_store_action.rb +248 -0
  11. data/lib/fastlane/plugin/polidea/actions/qr_generator.rb +76 -0
  12. data/lib/fastlane/plugin/polidea/actions/s3.rb +551 -0
  13. data/lib/fastlane/plugin/polidea/helper/polidea_helper.rb +12 -0
  14. data/lib/fastlane/plugin/polidea/templates/images/icon-placeholder.png +0 -0
  15. data/lib/fastlane/plugin/polidea/templates/images/logo.png +0 -0
  16. data/lib/fastlane/plugin/polidea/templates/images/polidea-facebook-icon.png +0 -0
  17. data/lib/fastlane/plugin/polidea/templates/images/polidea-github-icon.png +0 -0
  18. data/lib/fastlane/plugin/polidea/templates/images/polidea-logo.png +0 -0
  19. data/lib/fastlane/plugin/polidea/templates/images/polidea-twitter-icon.png +0 -0
  20. data/lib/fastlane/plugin/polidea/templates/installation-page/css/installation-page.css +3142 -0
  21. data/lib/fastlane/plugin/polidea/templates/installation-page/css/installation-page.css.map +7 -0
  22. data/lib/fastlane/plugin/polidea/templates/installation-page/img/bg.png +0 -0
  23. data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg.jpg +0 -0
  24. data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_1024.jpg +0 -0
  25. data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_1280.jpg +0 -0
  26. data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_1360.jpg +0 -0
  27. data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_1440.jpg +0 -0
  28. data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_1680.jpg +0 -0
  29. data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_768.jpg +0 -0
  30. data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_ipad_1024.jpg +0 -0
  31. data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_ipad_768.jpg +0 -0
  32. data/lib/fastlane/plugin/polidea/templates/installation-page/img/logo.svg +32 -0
  33. data/lib/fastlane/plugin/polidea/templates/installation-page/img/logo_square.svg +12 -0
  34. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation.min.js +10 -0
  35. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.abide.js +294 -0
  36. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.accordion.js +65 -0
  37. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.alert.js +43 -0
  38. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.clearing.js +558 -0
  39. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.dropdown.js +313 -0
  40. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.equalizer.js +74 -0
  41. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.interchange.js +344 -0
  42. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.joyride.js +915 -0
  43. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.js +625 -0
  44. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.magellan.js +189 -0
  45. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.offcanvas.js +139 -0
  46. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.orbit.js +472 -0
  47. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.reveal.js +443 -0
  48. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.slider.js +231 -0
  49. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.tab.js +167 -0
  50. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.tooltip.js +298 -0
  51. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.topbar.js +436 -0
  52. data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/aes.js +35 -0
  53. data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/enc-base64-min.js +8 -0
  54. data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/fastclick.js +9 -0
  55. data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/jquery.cookie.js +8 -0
  56. data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/jquery.js +26 -0
  57. data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/modernizr.js +8 -0
  58. data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/pbkdf2.js +19 -0
  59. data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/placeholder.js +2 -0
  60. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/fonts.scss +64 -0
  61. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation.scss +45 -0
  62. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/_functions.scss +101 -0
  63. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/_settings.scss +1441 -0
  64. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_accordion.scss +156 -0
  65. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_alert-boxes.scss +126 -0
  66. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_block-grid.scss +132 -0
  67. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_breadcrumbs.scss +132 -0
  68. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_button-groups.scss +200 -0
  69. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_buttons.scss +252 -0
  70. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_clearing.scss +247 -0
  71. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_dropdown-buttons.scss +129 -0
  72. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_dropdown.scss +248 -0
  73. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_flex-video.scss +51 -0
  74. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_forms.scss +570 -0
  75. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_global.scss +447 -0
  76. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_grid.scss +275 -0
  77. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_icon-bar.scss +293 -0
  78. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_inline-lists.scss +57 -0
  79. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_joyride.scss +222 -0
  80. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_keystrokes.scss +61 -0
  81. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_labels.scss +105 -0
  82. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_magellan.scss +34 -0
  83. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_offcanvas.scss +510 -0
  84. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_orbit.scss +368 -0
  85. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_pagination.scss +162 -0
  86. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_panels.scss +93 -0
  87. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_pricing-tables.scss +150 -0
  88. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_progress-bars.scss +79 -0
  89. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_range-slider.scss +168 -0
  90. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_reveal.scss +220 -0
  91. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_side-nav.scss +116 -0
  92. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_split-buttons.scss +191 -0
  93. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_sub-nav.scss +125 -0
  94. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_switches.scss +226 -0
  95. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_tables.scss +135 -0
  96. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_tabs.scss +123 -0
  97. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_thumbs.scss +66 -0
  98. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_toolbar.scss +70 -0
  99. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_tooltips.scss +142 -0
  100. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_top-bar.scss +676 -0
  101. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_type.scss +523 -0
  102. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_visibility.scss +408 -0
  103. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/installation-page.scss +171 -0
  104. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/normalize.scss +425 -0
  105. data/lib/fastlane/plugin/polidea/templates/installation_template.erb +58 -0
  106. data/lib/fastlane/plugin/polidea/templates/mailgun_template.erb +1225 -0
  107. data/lib/fastlane/plugin/polidea/version.rb +5 -0
  108. 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