fastlane-plugin-airwatch_workspaceone 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 39315e767417928a349b1bba6a2bcac2d42f935e027753d986771b446ad9656e
4
+ data.tar.gz: c5ab5f15c2cb9e61035c28871363dca9973ca3b5a8c255199a9af0de1aed056a
5
+ SHA512:
6
+ metadata.gz: 21276710b52ada59e01df121a21e1ecb578aca7928591be865dce2dd097957d6bd662cee3fd78a1199aeb2c609f3b1cdeb22ee633a478cb0d174da6b3787f45a
7
+ data.tar.gz: af153dcce9a53d8a05530f920facf992699f2556f9decc6bcbb5a45b42c7bec4c02ec4e821b2d510878a25457db86855e2dc1f9c22a3bb2f067b77f392d672e4
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2019 sharar <ram.awadhesh1.618@gmail.com>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,65 @@
1
+ # airwatch_workspaceone plugin
2
+
3
+ [![fastlane Plugin Badge](https://rawcdn.githack.com/fastlane/fastlane/master/fastlane/assets/plugin-badge.svg)](https://rubygems.org/gems/fastlane-plugin-airwatch_workspaceone)
4
+
5
+ ## Getting Started
6
+
7
+ This project is a [_fastlane_](https://github.com/fastlane/fastlane) plugin. To get started with `fastlane-plugin-airwatch_workspaceone`, add it to your project by running:
8
+
9
+ ```bash
10
+ fastlane add_plugin airwatch_workspaceone
11
+ ```
12
+
13
+ ## About airwatch_workspaceone
14
+
15
+ The main purpose of this plugin is to upload an IPA or an APK file to an AirWatch or Workspace ONE enterprise instance/console.
16
+
17
+ This plugin features two actions :-
18
+ 1. deploy_build - To upload an iOS ipa OR Android APK to AirWatch/WorkspaceOne console.
19
+ 2. retire_previous_versions - To retire all active versions of the application on the AirWatch console except the latest version.
20
+
21
+ ## Available options
22
+
23
+ To check for available options, run
24
+
25
+ ```bash
26
+ fastlane action deploy_app
27
+ ```
28
+ and
29
+
30
+ ```bash
31
+ fastlane action retire_previous_versions
32
+ ```
33
+
34
+ ## Example
35
+
36
+ Check out the [example `Fastfile`](fastlane/Fastfile) to see how to use this plugin.
37
+
38
+ ## Run tests for this plugin
39
+
40
+ To run both the tests, and code style validation, run
41
+
42
+ ```
43
+ rake
44
+ ```
45
+
46
+ To automatically fix many of the styling issues, use
47
+ ```
48
+ rubocop -a
49
+ ```
50
+
51
+ ## Issues and Feedback
52
+
53
+ For any other issues and feedback about this plugin, please submit it to this repository.
54
+
55
+ ## Troubleshooting
56
+
57
+ If you have trouble using plugins, check out the [Plugins Troubleshooting](https://docs.fastlane.tools/plugins/plugins-troubleshooting/) guide.
58
+
59
+ ## Using _fastlane_ Plugins
60
+
61
+ For more information about how the `fastlane` plugin system works, check out the [Plugins documentation](https://docs.fastlane.tools/plugins/create-plugin/).
62
+
63
+ ## About _fastlane_
64
+
65
+ _fastlane_ is the easiest way to automate beta deployments and releases for your iOS and Android apps. To learn more, check out [fastlane.tools](https://fastlane.tools).
@@ -0,0 +1,16 @@
1
+ require 'fastlane/plugin/airwatch_workspaceone/version'
2
+
3
+ module Fastlane
4
+ module AirwatchWorkspaceone
5
+ # Return all .rb files inside the "actions" and "helper" directory
6
+ def self.all_classes
7
+ Dir[File.expand_path('**/{actions,helper}/*.rb', File.dirname(__FILE__))]
8
+ end
9
+ end
10
+ end
11
+
12
+ # By default we want to import all available actions and helpers
13
+ # A plugin can contain any number of actions and plugins
14
+ Fastlane::AirwatchWorkspaceone.all_classes.each do |current|
15
+ require current
16
+ end
@@ -0,0 +1,310 @@
1
+ require 'fastlane/action'
2
+ require_relative '../helper/airwatch_workspaceone_helper'
3
+
4
+ module Fastlane
5
+ module Actions
6
+ class DeployBuildAction < Action
7
+
8
+ UPLOAD_BLOB_SUFFIX = "/API/mam/blobs/uploadblob?fileName=%s&organizationGroupId=%s"
9
+ BEGIN_INSTALL_SUFFIX = "/API/mam/apps/internal/begininstall"
10
+
11
+ $is_debug = false
12
+ $device_type = "Apple"
13
+ $supported_device_models = Hash.new
14
+
15
+ def self.run(params)
16
+ UI.message("The airwatch_workspaceone plugin is working!")
17
+
18
+ # check if debug is enabled
19
+ $is_debug = params[:debug]
20
+
21
+ if debug
22
+ UI.message("---------------------------------")
23
+ UI.message("AirWatch plugin debug information")
24
+ UI.message("---------------------------------")
25
+ UI.message(" host_url: #{params[:host_url]}")
26
+ UI.message(" aw_tenant_code: #{params[:aw_tenant_code]}")
27
+ UI.message(" b64_encoded_auth: #{params[:b64_encoded_auth]}")
28
+ UI.message(" app_name: #{params[:app_name]}")
29
+ UI.message(" file_name: #{params[:file_name]}")
30
+ UI.message(" path_to_file: #{params[:path_to_file]}")
31
+ UI.message(" organization_group_id: #{params[:org_group_id]}")
32
+ UI.message(" push_mode: #{params[:push_mode]}")
33
+ UI.message("---------------------------------")
34
+ end
35
+
36
+ host_url = params[:host_url]
37
+ aw_tenant_code = params[:aw_tenant_code]
38
+ b64_encoded_auth = params[:b64_encoded_auth]
39
+ app_name = params[:app_name]
40
+ file_name = params[:file_name]
41
+ path_to_file = params[:path_to_file]
42
+ org_group_id = params[:org_group_id]
43
+ push_mode = params[:push_mode]
44
+
45
+ # step 1: determining device type
46
+ UI.message("----------------------")
47
+ UI.message("1. Finding device type")
48
+ UI.message("----------------------")
49
+ $device_type = find_device_type(file_name)
50
+ UI.success("Device Type identified is: %s" % [$device_type])
51
+
52
+ # step 2: determining device type
53
+ UI.message("----------------------------------")
54
+ UI.message("2. Setting supported device models")
55
+ UI.message("----------------------------------")
56
+ $supported_device_models = find_supported_device_models(path_to_file)
57
+ UI.success("Supported Device Models are: %s" % [$supported_device_models.to_json])
58
+
59
+ # step 3: uploading app blob file
60
+ UI.message("---------------------")
61
+ if $device_type == "Android"
62
+ UI.message("3. Uploading APK file")
63
+ else
64
+ UI.message("3. Uploading IPA file")
65
+ end
66
+ UI.message("---------------------")
67
+ blobID = upload_blob(host_url, aw_tenant_code, b64_encoded_auth, file_name, path_to_file, org_group_id)
68
+
69
+ if $device_type == "Android"
70
+ UI.success("Successfully uploaded apk blob")
71
+ else
72
+ UI.success("Successfully uploaded ipa blob")
73
+ end
74
+
75
+ if debug
76
+ UI.success("Blob Id: %d" % [blobID])
77
+ end
78
+
79
+ # step 4: deploying app version
80
+ UI.message("------------------------------------")
81
+ UI.message("4. Deploying app version on console")
82
+ UI.message("------------------------------------")
83
+ deploy_app(host_url, aw_tenant_code, b64_encoded_auth, blobID, app_name, push_mode, org_group_id)
84
+ UI.success("Successfully deployed the app version")
85
+ end
86
+
87
+ def self.find_device_type(file_name)
88
+ if file_name.include? ".ipa"
89
+ return "Apple"
90
+ elsif file_name.include? ".apk"
91
+ return "Android"
92
+ else
93
+ UI.user_error!("Wrong file type provided. Please provide an IPA or APK file.")
94
+ exit
95
+ end
96
+ end
97
+
98
+ def self.find_supported_device_models(path_to_file)
99
+ require 'app_info'
100
+ device_models = Array.new
101
+
102
+ if $device_type == "Android"
103
+ model = create_model_for(5, "Android")
104
+ device_models << model
105
+ else
106
+ ipa = AppInfo.parse(path_to_file)
107
+ if ipa.universal?
108
+ model_iPhone = create_model_for(1, "iPhone")
109
+ device_models << model_iPhone
110
+ model_iPad = create_model_for(2, "iPad")
111
+ device_models << model_iPad
112
+ model_iPodTouch = create_model_for(3, "iPod Touch")
113
+ device_models << model_iPodTouch
114
+ elsif ipa.iphone?
115
+ model_iPhone = create_model_for(1, "iPhone")
116
+ device_models << model_iPhone
117
+ model_iPodTouch = create_model_for(3, "iPod Touch")
118
+ device_models << model_iPodTouch
119
+ else
120
+ model_iPad = create_model_for(2, "iPad")
121
+ device_models << model_iPad
122
+ end
123
+ end
124
+
125
+ $supported_device_models['Model'] = device_models
126
+ return $supported_device_models
127
+ end
128
+
129
+ def self.create_model_for(model_id, model_name)
130
+
131
+ model_hash = Hash.new
132
+ model_hash['ModelId'] = model_id
133
+ model_hash['ModelName'] = model_name
134
+ return model_hash
135
+ end
136
+
137
+ def self.upload_blob(host_url, aw_tenant_code, b64_encoded_auth, file_name, path_to_file, org_group_id)
138
+ require 'rest-client'
139
+ require 'json'
140
+
141
+ response = RestClient::Request.execute(
142
+ :url => host_url + UPLOAD_BLOB_SUFFIX % [file_name, org_group_id],
143
+ :method => :post,
144
+ :headers => {
145
+ 'Authorization' => "Basic " + b64_encoded_auth,
146
+ 'aw-tenant-code' => aw_tenant_code,
147
+ 'Accept' => 'application/json',
148
+ 'Content-Type' => 'application/octet-stream',
149
+ 'Expect' => '100-continue'
150
+ },
151
+ :payload => File.open(path_to_file, "rb")
152
+ )
153
+
154
+ if debug
155
+ UI.message("Response code: %d" % [response.code])
156
+ UI.message("Response body:")
157
+ UI.message(response.body)
158
+ end
159
+
160
+ json = JSON.parse(response.body)
161
+ return json['Value']
162
+ end
163
+
164
+ def self.deploy_app(host_url, aw_tenant_code, b64_encoded_auth, blobID, app_name, push_mode, org_group_id)
165
+ require 'rest-client'
166
+ require 'json'
167
+
168
+ body = {
169
+ "BlobId" => blobID.to_s,
170
+ "DeviceType" => $device_type,
171
+ "ApplicationName" => app_name,
172
+ "SupportedModels" => $supported_device_models,
173
+ "PushMode" => push_mode,
174
+ "LocationGroupId" => org_group_id
175
+ }
176
+
177
+ if debug
178
+ UI.message("Deploy Request JSON:")
179
+ UI.message(body.to_json)
180
+ end
181
+
182
+ response = RestClient.post(host_url + BEGIN_INSTALL_SUFFIX, body.to_json, {content_type: :json, accept: :json, 'aw-tenant-code': aw_tenant_code, 'Authorization': "Basic " + b64_encoded_auth})
183
+
184
+ if debug
185
+ UI.message("Response code: %d" % [response.code])
186
+ UI.message("Response body:")
187
+ UI.message(response.body)
188
+ end
189
+
190
+ json = JSON.parse(response.body)
191
+ return json
192
+ end
193
+
194
+ def self.description
195
+ "The main purpose of this action is to upload an IPA or an APK file to an AirWatch or Workspace ONE enterprise instance/console."
196
+ end
197
+
198
+ def self.authors
199
+ ["Ram Awadhesh Sharan"]
200
+ end
201
+
202
+ def self.return_value
203
+ # If your method provides a return value, you can describe here what it does
204
+ end
205
+
206
+ def self.details
207
+ # Optional:
208
+ "deploy_app - To upload an iOS ipa OR Android APK to AirWatch/WorkspaceOne console."
209
+ end
210
+
211
+ def self.available_options
212
+ [
213
+ FastlaneCore::ConfigItem.new(key: :host_url,
214
+ env_name: "AIRWATCH_HOST_API_URL",
215
+ description: "Host API URL of the AirWatch instance",
216
+ optional: false,
217
+ type: String,
218
+ verify_block: proc do |value|
219
+ UI.user_error!("No AirWatch Host API URl given.") unless value and !value.empty?
220
+ end),
221
+
222
+ FastlaneCore::ConfigItem.new(key: :aw_tenant_code,
223
+ env_name: "AIRWATCH_API_KEY",
224
+ description: "API key or the tenant code to access AirWatch Rest APIs",
225
+ optional: false,
226
+ type: String,
227
+ verify_block: proc do |value|
228
+ UI.user_error!("Api tenant code header is missing.") unless value and !value.empty?
229
+ end),
230
+
231
+ FastlaneCore::ConfigItem.new(key: :b64_encoded_auth,
232
+ env_name: "AIRWATCH_BASE64_ENCODED_BASIC_AUTH_STRING",
233
+ description: "The base64 encoded Basic Auth string generated by authorizing username and password to the AirWatch instance",
234
+ optional: false,
235
+ type: String,
236
+ verify_block: proc do |value|
237
+ UI.user_error!("The authorization header is empty or the scheme is not basic") unless value and !value.empty?
238
+ end),
239
+
240
+ FastlaneCore::ConfigItem.new(key: :app_name,
241
+ env_name: "AIRWATCH_APPLICATION_NAME",
242
+ description: "Name of the application",
243
+ optional: false,
244
+ type: String,
245
+ verify_block: proc do |value|
246
+ UI.user_error!("No app name given, pass using `app_name: 'My sample app'`") unless value and !value.empty?
247
+ end),
248
+
249
+ FastlaneCore::ConfigItem.new(key: :file_name,
250
+ env_name: "AIRWATCH_FILE_NAME",
251
+ description: "Name of the file to upload including the extension",
252
+ optional: false,
253
+ type: String,
254
+ verify_block: proc do |value|
255
+ UI.user_error!("No file name given, pass using `file_name: 'MySampleApp.ipa'` or `file_name: 'MySampleApp.apk'`") unless value and !value.empty?
256
+ end),
257
+
258
+ FastlaneCore::ConfigItem.new(key: :path_to_file,
259
+ env_name: "AIRWATCH_PATH_TO_FILE",
260
+ description: "Path to the file to upload including the extension",
261
+ optional: false,
262
+ type: String,
263
+ verify_block: proc do |value|
264
+ UI.user_error!("Path to the file not given, pass using `path_to_file: '/path/to/the/file/on/disk'`") unless value and !value.empty?
265
+ end),
266
+
267
+ FastlaneCore::ConfigItem.new(key: :org_group_id,
268
+ env_name: "AIRWATCH_ORGANIZATION_GROUP_ID",
269
+ description: "Organization Group ID integer identifying the customer or container",
270
+ optional: false,
271
+ type: String,
272
+ verify_block: proc do |value|
273
+ UI.user_error!("No Organization Group ID integer given, pass using `org_group_id: MyOrgGroupId`") unless value and !value.empty?
274
+ end),
275
+
276
+ FastlaneCore::ConfigItem.new(key: :push_mode,
277
+ env_name: "AIRWATCH_APP_PUSH_MODE",
278
+ description: "Push mode for the application",
279
+ optional: false,
280
+ type: String,
281
+ verify_block: proc do |value|
282
+ UI.user_error!("No push mode given, pass using `push_mode: 'Auto'` or pass using `push_mode: 'On demand'`") unless value and !value.empty?
283
+ end),
284
+
285
+ FastlaneCore::ConfigItem.new(key: :debug,
286
+ env_name: "AIRWATCH_DEBUG",
287
+ description: "Debug flag, set to true to show extended output. default: false",
288
+ optional: true,
289
+ is_string: false,
290
+ default_value: false)
291
+ ]
292
+ end
293
+
294
+ def self.is_supported?(platform)
295
+ # Adjust this if your plugin only works for a particular platform (iOS vs. Android, for example)
296
+ # See: https://docs.fastlane.tools/advanced/#control-configuration-by-lane-and-by-platform
297
+ #
298
+ [:ios, :android].include?(platform)
299
+ true
300
+ end
301
+
302
+ # helpers
303
+
304
+ def self.debug
305
+ $is_debug
306
+ end
307
+
308
+ end
309
+ end
310
+ end
@@ -0,0 +1,203 @@
1
+ require 'fastlane/action'
2
+ require_relative '../helper/airwatchtest_helper'
3
+
4
+ module Fastlane
5
+ module Actions
6
+ class RetirePreviousVersionsAction < Action
7
+
8
+ APPS_LIST_SUFFIX = "/API/mam/apps/search?bundleid=%s"
9
+ INTERNAL_APP_RETIRE_SUFFIX = "/API/mam/apps/internal/%d/retire"
10
+ $is_debug = false
11
+
12
+ def self.run(params)
13
+ UI.message("The airwatch_workspaceone plugin is working!")
14
+
15
+ # check if debug is enabled
16
+ $is_debug = params[:debug]
17
+
18
+ if debug
19
+ UI.message("---------------------------------")
20
+ UI.message("AirWatch plugin debug information")
21
+ UI.message("---------------------------------")
22
+ UI.message(" host_url: #{params[:host_url]}")
23
+ UI.message(" aw_tenant_code: #{params[:aw_tenant_code]}")
24
+ UI.message(" b64_encoded_auth: #{params[:b64_encoded_auth]}")
25
+ UI.message(" app_identifier: #{params[:app_identifier]}")
26
+ UI.message(" app_name: #{params[:app_name]}")
27
+ UI.message("---------------------------------")
28
+ end
29
+
30
+ host_url = params[:host_url]
31
+ aw_tenant_code = params[:aw_tenant_code]
32
+ b64_encoded_auth = params[:b64_encoded_auth]
33
+ app_identifier = params[:app_identifier]
34
+ app_name = params[:app_name]
35
+
36
+ # step 1: find app
37
+ UI.message("------------------------------")
38
+ UI.message("1. Finding active app versions")
39
+ UI.message("------------------------------")
40
+
41
+ appIDs = find_app(app_identifier, host_url, aw_tenant_code, b64_encoded_auth)
42
+ UI.success("Found %d active app versions" % [appIDs.count])
43
+ if debug
44
+ UI.success("Integer app ids:")
45
+ UI.success(appIDs)
46
+ end
47
+
48
+ # step 2: retire previous versions
49
+ UI.message("-------------------------------")
50
+ UI.message("2. Retiring active app versions")
51
+ UI.message("-------------------------------")
52
+
53
+ appIDs.each do |appID|
54
+ retire_app(host_url, aw_tenant_code, b64_encoded_auth, appID)
55
+ end
56
+
57
+ UI.success("All active app versions successfully retired")
58
+ end
59
+
60
+ def self.find_app(app_identifier, host_url, aw_tenant_code, b64_encoded_auth)
61
+ # get the list of apps
62
+ data = list_apps(host_url, aw_tenant_code, b64_encoded_auth, app_identifier)
63
+ active_app_version_ids = Array.new
64
+
65
+ data['Application'].each do |app|
66
+ if app['Status'] == "Active"
67
+ active_app_version_ids << app['Id']['Value']
68
+ end
69
+ end
70
+
71
+ active_app_version_ids.pop
72
+ return active_app_version_ids
73
+ end
74
+
75
+ def self.list_apps(host_url, aw_tenant_code, b64_encoded_auth, app_identifier)
76
+ require 'rest-client'
77
+ require 'json'
78
+
79
+ response = RestClient.get(host_url + APPS_LIST_SUFFIX % [app_identifier], {accept: :json, 'aw-tenant-code': aw_tenant_code, 'Authorization': "Basic " + b64_encoded_auth})
80
+
81
+ if debug
82
+ UI.message("Response code: %d" % [response.code])
83
+ UI.message("Response body:")
84
+ UI.message(response.body)
85
+ end
86
+
87
+ json = JSON.parse(response.body)
88
+ return json
89
+ end
90
+
91
+ def self.retire_app(host_url, aw_tenant_code, b64_encoded_auth, app_id)
92
+ require 'rest-client'
93
+ require 'json'
94
+
95
+ body = {
96
+ "applicationid" => app_id
97
+ }
98
+
99
+ UI.message("Starting to retire app version having integer identifier: %d" % [app_id])
100
+ response = RestClient.post(host_url + INTERNAL_APP_RETIRE_SUFFIX % [app_id], body.to_json, {accept: :json, 'aw-tenant-code': aw_tenant_code, 'Authorization': "Basic " + b64_encoded_auth})
101
+
102
+ if debug
103
+ UI.message("Response code: %d" % [response.code])
104
+ end
105
+
106
+ if response.code == 202
107
+ UI.message("Successfully retired app version having integer identifier: %d" % [app_id])
108
+ else
109
+ json = JSON.parse(response.body)
110
+ UI.message("Failed to retire app version having integer identifier: %d" % [app_id])
111
+ end
112
+ end
113
+
114
+ def self.description
115
+ "The main purpose of this action is to retire previous versions of the application"
116
+ end
117
+
118
+ def self.authors
119
+ ["Ram Awadhesh Sharan"]
120
+ end
121
+
122
+ def self.return_value
123
+ # If your method provides a return value, you can describe here what it does
124
+ end
125
+
126
+ def self.details
127
+ # Optional:
128
+ "retire_previous_versions - To retire all active versions of the application on the AirWatch console except the latest version."
129
+ end
130
+
131
+ def self.available_options
132
+ [
133
+ FastlaneCore::ConfigItem.new(key: :host_url,
134
+ env_name: "AIRWATCH_HOST_API_URL",
135
+ description: "Host API URL of the AirWatch instance",
136
+ optional: false,
137
+ type: String,
138
+ verify_block: proc do |value|
139
+ UI.user_error!("No AirWatch Host API URl given.") unless value and !value.empty?
140
+ end),
141
+
142
+ FastlaneCore::ConfigItem.new(key: :aw_tenant_code,
143
+ env_name: "AIRWATCH_API_KEY",
144
+ description: "API key to access AirWatch Rest APIs",
145
+ optional: false,
146
+ type: String,
147
+ verify_block: proc do |value|
148
+ UI.user_error!("Api tenant code header is missing.") unless value and !value.empty?
149
+ end),
150
+
151
+ FastlaneCore::ConfigItem.new(key: :b64_encoded_auth,
152
+ env_name: "AIRWATCH_BASE64_ENCODED_BASIC_AUTH_STRING",
153
+ description: "The base64 encoded Basic Auth string generated by authorizing username and password to the AirWatch instance",
154
+ optional: false,
155
+ type: String,
156
+ verify_block: proc do |value|
157
+ UI.user_error!("The authorization header is empty or the scheme is not basic") unless value and !value.empty?
158
+ end),
159
+
160
+ FastlaneCore::ConfigItem.new(key: :app_identifier,
161
+ env_name: "APP_IDENTIFIER",
162
+ description: "Bundle identifier of your app",
163
+ optional: false,
164
+ type: String,
165
+ verify_block: proc do |value|
166
+ UI.user_error!("No app identifier given, pass using `app_identifier: 'com.example.app'`") unless value and !value.empty?
167
+ end),
168
+
169
+ FastlaneCore::ConfigItem.new(key: :app_name,
170
+ env_name: "AIRWATCH_APPLICATION_NAME",
171
+ description: "Name of the application",
172
+ optional: false,
173
+ type: String,
174
+ verify_block: proc do |value|
175
+ UI.user_error!("No app name given, pass using `app_name: 'My sample app'`") unless value and !value.empty?
176
+ end),
177
+
178
+ FastlaneCore::ConfigItem.new(key: :debug,
179
+ env_name: "AIRWATCH_DEBUG",
180
+ description: "Debug flag, set to true to show extended output. default: false",
181
+ optional: true,
182
+ is_string: false,
183
+ default_value: false)
184
+ ]
185
+ end
186
+
187
+ def self.is_supported?(platform)
188
+ # Adjust this if your plugin only works for a particular platform (iOS vs. Android, for example)
189
+ # See: https://docs.fastlane.tools/advanced/#control-configuration-by-lane-and-by-platform
190
+
191
+ [:ios, :android].include?(platform)
192
+ true
193
+ end
194
+
195
+ # helpers
196
+
197
+ def self.debug
198
+ $is_debug
199
+ end
200
+
201
+ end
202
+ end
203
+ end
@@ -0,0 +1,16 @@
1
+ require 'fastlane_core/ui/ui'
2
+
3
+ module Fastlane
4
+ UI = FastlaneCore::UI unless Fastlane.const_defined?("UI")
5
+
6
+ module Helper
7
+ class AirwatchWorkspaceoneHelper
8
+ # class methods that you define here become available in your action
9
+ # as `Helper::AirwatchWorkspaceoneHelper.your_method`
10
+ #
11
+ def self.show_message
12
+ UI.message("Hello from the airwatch_workspaceone plugin helper!")
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,5 @@
1
+ module Fastlane
2
+ module AirwatchWorkspaceone
3
+ VERSION = "1.0.0"
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,204 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fastlane-plugin-airwatch_workspaceone
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Ram Awadhesh Sharan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-05-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: app-info
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec_junit_formatter
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '='
116
+ - !ruby/object:Gem::Version
117
+ version: 0.49.1
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '='
123
+ - !ruby/object:Gem::Version
124
+ version: 0.49.1
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop-require_tools
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: simplecov
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: fastlane
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: 2.123.0
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: 2.123.0
167
+ description:
168
+ email: ram.awadhesh1.618@emc.com
169
+ executables: []
170
+ extensions: []
171
+ extra_rdoc_files: []
172
+ files:
173
+ - LICENSE
174
+ - README.md
175
+ - lib/fastlane/plugin/airwatch_workspaceone.rb
176
+ - lib/fastlane/plugin/airwatch_workspaceone/actions/deploy_build_action.rb
177
+ - lib/fastlane/plugin/airwatch_workspaceone/actions/retire_previous_versions_action.rb
178
+ - lib/fastlane/plugin/airwatch_workspaceone/helper/airwatch_workspaceone_helper.rb
179
+ - lib/fastlane/plugin/airwatch_workspaceone/version.rb
180
+ homepage: https://github.com/letsbondiway/fastlane-plugin-airwatch_workspaceone
181
+ licenses:
182
+ - MIT
183
+ metadata: {}
184
+ post_install_message:
185
+ rdoc_options: []
186
+ require_paths:
187
+ - lib
188
+ required_ruby_version: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
193
+ required_rubygems_version: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - ">="
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ requirements: []
199
+ rubygems_version: 3.0.3
200
+ signing_key:
201
+ specification_version: 4
202
+ summary: The main purpose of this plugin is to upload an IPA or an APK file to an
203
+ AirWatch or Workspace ONE enterprise instance/console.
204
+ test_files: []