fastlane-plugin-perfecto 0.1.1 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5af10b5acb0a274b115a1579efdce4f53759428d387ce3bd89aee501bb24d9aa
|
4
|
+
data.tar.gz: f722fe09bb1cc5c187642ca59bef142f82e75eb2da6b3a0156a569fe38fab0bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 458d2df44edf7fd7355552b50640fb6bfc2206085ab512d53c38697116e4dac5d1dea93e154b38e1df3787f5a55f79bcf5fc9fd0dcedf29ac72ddb8ce4f43043
|
7
|
+
data.tar.gz: ebc76b750839a84986cfaff6bdeca39a5258595eaa56d1d1c20ca5a3432a95a7713b341bc0f6b4cab0e196d6d1aaf0c97fca4283dec5d796e7fa116f17b5de1d
|
data/README.md
CHANGED
@@ -11,10 +11,13 @@ This project is a [_fastlane_](https://github.com/fastlane/fastlane) plugin. To
|
|
11
11
|
fastlane add_plugin perfecto
|
12
12
|
```
|
13
13
|
|
14
|
-
## About
|
14
|
+
## About plugin
|
15
15
|
|
16
16
|
This plugin allows you to automatically upload ipa/apk files to Perfecto for manual/automation testing
|
17
17
|
|
18
|
+
## Updates
|
19
|
+
This plugin uses latest v1 upload media API under the hood and supports all file types.
|
20
|
+
|
18
21
|
|
19
22
|
## Example
|
20
23
|
|
@@ -33,13 +36,37 @@ lane :test do
|
|
33
36
|
)
|
34
37
|
end
|
35
38
|
```
|
39
|
+
|
40
|
+
Optional parameters:
|
41
|
+
|
42
|
+
```
|
43
|
+
artifactType: ENV["artifactType"],
|
44
|
+
artifactName: ENV["artifactName"],
|
45
|
+
```
|
46
|
+
|
36
47
|
### Note: <br>
|
37
48
|
Pass the below variable values as environment variables:<br>
|
38
|
-
PERFECTO_CLOUDURL [your perfecto cloud url. E.g.: demo.perfectomobile.com]<br>
|
39
|
-
PERFECTO_TOKEN [your perfecto [`security token`](https://developers.perfectomobile.com/display/PD/Generate+security+tokens)]<br>
|
40
|
-
PERFECTO_MEDIA_LOCATION [mention the Perfecto media repository location to upload the file mentioned in file_path. E.g. PUBLIC:Samples/sample.ipa]<br>
|
41
|
-
file_path [location of your preferred ipa/apk file which needs to be uploaded to perfecto media repository.]<br>
|
42
|
-
|
49
|
+
* PERFECTO_CLOUDURL [your perfecto cloud url. E.g.: demo.perfectomobile.com]<br>
|
50
|
+
* PERFECTO_TOKEN [your perfecto [`security token`](https://developers.perfectomobile.com/display/PD/Generate+security+tokens)]<br>
|
51
|
+
* PERFECTO_MEDIA_LOCATION [mention the Perfecto media repository location to upload the file mentioned in file_path. E.g. PUBLIC:Samples/sample.ipa]<br>
|
52
|
+
* file_path [location of your preferred ipa/apk file which needs to be uploaded to perfecto media repository.]<br>
|
53
|
+
* artifactType [Optional: Defines the artifact types, options: GENERAL, IOS, SIMULATOR, ANDROID, IMAGE, AUDIO, VIDEO, SCRIPT]<br>
|
54
|
+
* artifactName [Optional: Used for the representation of the artifact when downloaded.]<br>
|
55
|
+
|
56
|
+
## Run tests for this plugin
|
57
|
+
|
58
|
+
To run both the tests, and code style validation, run
|
59
|
+
|
60
|
+
```
|
61
|
+
rake
|
62
|
+
```
|
63
|
+
|
64
|
+
To automatically fix many of the styling issues, use
|
65
|
+
```
|
66
|
+
rubocop -a
|
67
|
+
```
|
68
|
+
|
69
|
+
## Sample project: <br>
|
43
70
|
|
44
71
|
Here's a [`sample project`](https://github.com/PerfectoMobileSA/FastlaneEspressoCircleCISlackSample) which demonstrates the usage of this plugin.
|
45
72
|
|
@@ -73,20 +100,6 @@ fastlane android slack_report
|
|
73
100
|
```
|
74
101
|
Report perfecto url to slack
|
75
102
|
|
76
|
-
|
77
|
-
## Run tests for this plugin
|
78
|
-
|
79
|
-
To run both the tests, and code style validation, run
|
80
|
-
|
81
|
-
```
|
82
|
-
rake
|
83
|
-
```
|
84
|
-
|
85
|
-
To automatically fix many of the styling issues, use
|
86
|
-
```
|
87
|
-
rubocop -a
|
88
|
-
```
|
89
|
-
|
90
103
|
## Issues and Feedback
|
91
104
|
|
92
105
|
For any other issues and feedback about this plugin, please submit it to this repository.
|
@@ -1,37 +1,38 @@
|
|
1
|
-
require
|
2
|
-
require_relative
|
3
|
-
require
|
1
|
+
require "fastlane/action"
|
2
|
+
require_relative "../helper/perfecto_helper"
|
3
|
+
require "json"
|
4
4
|
|
5
5
|
module Fastlane
|
6
6
|
module Actions
|
7
7
|
module SharedValues
|
8
8
|
PERFECTO_MEDIA_FULLPATH ||= :PERFECTO_MEDIA_FULLPATH
|
9
9
|
end
|
10
|
-
class PerfectoAction < Action
|
11
|
-
SUPPORTED_FILE_EXTENSIONS = ["ipa", "apk"]
|
12
10
|
|
11
|
+
class PerfectoAction < Action
|
13
12
|
def self.run(params)
|
14
13
|
# Mandatory parameters
|
15
14
|
perfecto_cloudurl = params[:perfecto_cloudurl]
|
16
15
|
perfecto_token = params[:perfecto_token]
|
17
16
|
filepath = params[:file_path].to_s
|
18
17
|
perfecto_media_fullpath = params[:perfecto_media_location]
|
18
|
+
artifact_type = params[:artifactType] || ""
|
19
|
+
artifact_nme = params[:artifactName] || ""
|
19
20
|
|
20
21
|
# validates the filepath and perfecto media location file
|
21
22
|
UI.message("validating filepath")
|
22
23
|
validate_filepath(filepath)
|
23
|
-
UI.message("validating
|
24
|
-
validate_repopath(perfecto_media_fullpath)
|
24
|
+
UI.message("validating media location")
|
25
25
|
|
26
26
|
# uploads the ipa/apk to perfecto media repository
|
27
27
|
UI.message("Attempting to upload: " + filepath + " to Perfecto!")
|
28
|
-
Helper::PerfectoHelper.upload_file(perfecto_cloudurl, perfecto_token, filepath, perfecto_media_fullpath)
|
28
|
+
# Helper::PerfectoHelper.upload_file(perfecto_cloudurl, perfecto_token, filepath, perfecto_media_fullpath)
|
29
|
+
Helper::PerfectoHelper.upload_v1(perfecto_cloudurl, perfecto_token, filepath, perfecto_media_fullpath, artifact_type, artifact_nme)
|
29
30
|
UI.success("The File in: " + filepath + " is successfully uploaded to Perfecto media location : " + perfecto_media_fullpath)
|
30
31
|
|
31
32
|
# Setting the environment variable: PERFECTO_MEDIA_FULLPATH with the perfecto media repository location.
|
32
|
-
ENV[
|
33
|
-
ENV[
|
34
|
-
UI.success("Setting Environment variable PERFECTO_MEDIA_FULLPATH = " + ENV[
|
33
|
+
ENV["PERFECTO_MEDIA_FULLPATH"] = nil
|
34
|
+
ENV["PERFECTO_MEDIA_FULLPATH"] = perfecto_media_fullpath
|
35
|
+
UI.success("Setting Environment variable PERFECTO_MEDIA_FULLPATH = " + ENV["PERFECTO_MEDIA_FULLPATH"])
|
35
36
|
|
36
37
|
# Setting the media fullpath in shared values post successful upload in order to be used by other fastlane actions.
|
37
38
|
Actions.lane_context[SharedValues::PERFECTO_MEDIA_FULLPATH] = perfecto_media_fullpath
|
@@ -57,26 +58,11 @@ module Fastlane
|
|
57
58
|
# Validate filepath.
|
58
59
|
def self.validate_filepath(filepath)
|
59
60
|
UI.user_error!("No file found at filepath parameter location.") unless File.exist?(filepath)
|
60
|
-
|
61
|
-
# Validate file extension.
|
62
|
-
filepath_parts = filepath.split(".")
|
63
|
-
unless filepath_parts.length > 1 && SUPPORTED_FILE_EXTENSIONS.include?(filepath_parts.last)
|
64
|
-
UI.user_error!("filepath is invalid, only files with extensions with .ipa or .apk are allowed to be uploaded.")
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
# Validate media repo path.
|
69
|
-
def self.validate_repopath(perfecto_media_fullpath)
|
70
|
-
# Validate file extension.
|
71
|
-
filepath_parts = perfecto_media_fullpath.split(".")
|
72
|
-
unless filepath_parts.length > 1 && SUPPORTED_FILE_EXTENSIONS.include?(filepath_parts.last)
|
73
|
-
UI.user_error!("perfecto_media_location is invalid, only files with extensions with .ipa or .apk are allowed to be uploaded.")
|
74
|
-
end
|
75
61
|
end
|
76
62
|
|
77
63
|
def self.output
|
78
64
|
[
|
79
|
-
[
|
65
|
+
["perfecto_media_fullpath", "Perfecto media repo location"]
|
80
66
|
]
|
81
67
|
end
|
82
68
|
|
@@ -108,12 +94,22 @@ module Fastlane
|
|
108
94
|
UI.user_error!("No perfecto_token given.") if value.to_s.empty?
|
109
95
|
end),
|
110
96
|
FastlaneCore::ConfigItem.new(key: :perfecto_media_location,
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
97
|
+
description: "Path to Perfecto media location",
|
98
|
+
optional: false,
|
99
|
+
is_string: true,
|
100
|
+
verify_block: proc do |value|
|
101
|
+
UI.user_error!("No perfecto_media_location given.") if value.to_s.empty?
|
102
|
+
end),
|
103
|
+
FastlaneCore::ConfigItem.new(key: :artifactType,
|
104
|
+
description: "Optional, Artifact types: GENERAL, IOS, SIMULATOR, ANDROID, IMAGE, AUDIO, VIDEO, SCRIPT",
|
105
|
+
optional: true,
|
106
|
+
default_value: "",
|
107
|
+
is_string: true),
|
108
|
+
FastlaneCore::ConfigItem.new(key: :artifactName,
|
109
|
+
description: "Optional, Used for the representation of the artifact when downloaded",
|
110
|
+
optional: true,
|
111
|
+
default_value: "",
|
112
|
+
is_string: true),
|
117
113
|
FastlaneCore::ConfigItem.new(key: :file_path,
|
118
114
|
description: "Path to the app file",
|
119
115
|
optional: true,
|
@@ -128,12 +124,14 @@ module Fastlane
|
|
128
124
|
|
129
125
|
def self.example_code
|
130
126
|
[
|
131
|
-
|
127
|
+
"perfecto",
|
132
128
|
'perfecto(
|
133
129
|
perfecto_cloudurl: ENV["PERFECTO_CLOUDURL"],
|
134
130
|
perfecto_token: ENV["PERFECTO_TOKEN"],
|
135
131
|
perfecto_media_location: ENV["PERFECTO_MEDIA_LOCATION"],
|
136
|
-
file_path: "path_to_apk_or_ipa_file"
|
132
|
+
file_path: "path_to_apk_or_ipa_file",
|
133
|
+
artifactType: ENV["artifactType"],
|
134
|
+
artifactName: ENV["artifactName"]
|
137
135
|
)'
|
138
136
|
]
|
139
137
|
end
|
@@ -1,7 +1,8 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require "rest-client"
|
2
|
+
require "uri"
|
3
|
+
require "fastlane_core/ui/ui"
|
4
|
+
require "json"
|
5
|
+
require "net/http"
|
5
6
|
|
6
7
|
module Fastlane
|
7
8
|
UI = FastlaneCore::UI unless Fastlane.const_defined?("UI")
|
@@ -14,17 +15,18 @@ module Fastlane
|
|
14
15
|
# +perfecto_token+:: Perfecto's security token.
|
15
16
|
# +file_path+:: Path to the file to be uploaded.
|
16
17
|
# +perfecto_media_fullpath+:: Path to the perfecto media location
|
18
|
+
# DEPRECATED
|
17
19
|
def self.upload_file(perfecto_cloudurl, perfecto_token, file_path, perfecto_media_fullpath)
|
18
|
-
unless ENV[
|
19
|
-
RestClient.proxy = ENV[
|
20
|
+
unless ENV["http_proxy"]
|
21
|
+
RestClient.proxy = ENV["http_proxy"]
|
20
22
|
end
|
21
23
|
response = RestClient::Request.execute(
|
22
|
-
url:
|
24
|
+
url: "https://" + perfecto_cloudurl + "/services/repositories/media/" + perfecto_media_fullpath + "?operation=upload&overwrite=true&securityToken=" + URI.encode(perfecto_token, "UTF-8"),
|
23
25
|
method: :post,
|
24
26
|
headers: {
|
25
|
-
|
26
|
-
|
27
|
-
|
27
|
+
"Accept" => "application/json",
|
28
|
+
"Content-Type" => "application/octet-stream",
|
29
|
+
"Expect" => "100-continue"
|
28
30
|
},
|
29
31
|
payload: File.open(file_path, "rb")
|
30
32
|
)
|
@@ -40,6 +42,49 @@ module Fastlane
|
|
40
42
|
rescue StandardError => error
|
41
43
|
UI.user_error!("App upload failed!!! Reason : #{error.message}")
|
42
44
|
end
|
45
|
+
|
46
|
+
def self.parameters(request_part, key, value)
|
47
|
+
unless value.to_s.strip.empty?
|
48
|
+
return request_part.merge!(key => value)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Uploads file to Perfecto using new V1 upload API
|
53
|
+
# Params :
|
54
|
+
# +perfecto_cloudurl+:: Perfecto's cloud name.
|
55
|
+
# +perfecto_token+:: Perfecto's security token.
|
56
|
+
# +file_path+:: Path to the file to be uploaded.
|
57
|
+
# +perfecto_media_fullpath+:: Path to the perfecto media location
|
58
|
+
# +artifact_type+:: Artifact Type
|
59
|
+
# +artifact_name+:: Artifact Name
|
60
|
+
def self.upload_v1(perfecto_cloudurl, perfecto_token, file_path, perfecto_media_fullpath, artifact_type, artifact_name)
|
61
|
+
# prepare cloud url
|
62
|
+
if perfecto_cloudurl.include?(".perfectomobile.com")
|
63
|
+
perfecto_cloudurl = perfecto_cloudurl.split(".perfectomobile.com")[0]
|
64
|
+
if perfecto_cloudurl.include?(".app")
|
65
|
+
perfecto_cloudurl = perfecto_cloudurl.split(".app")[0]
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
url = URI("https://" + perfecto_cloudurl + ".app.perfectomobile.com/repository/api/v1/artifacts")
|
70
|
+
https = Net::HTTP.new(url.host, url.port)
|
71
|
+
https.use_ssl = true
|
72
|
+
request = Net::HTTP::Post.new(url)
|
73
|
+
request["Perfecto-Authorization"] = perfecto_token
|
74
|
+
request_part = { "artifactLocator" => perfecto_media_fullpath, "override" => true }
|
75
|
+
parameters(request_part, "artifactType", artifact_type)
|
76
|
+
parameters(request_part, "artifactName", artifact_name)
|
77
|
+
request_part = request_part.to_json.to_s.gsub("=>", ":")
|
78
|
+
# Debug: puts request_part
|
79
|
+
form_data = [["requestPart", request_part], ["inputStream", File.open(file_path, "rb")]]
|
80
|
+
request.set_form(form_data, "multipart/form-data")
|
81
|
+
response = https.request(request)
|
82
|
+
UI.message(response.inspect)
|
83
|
+
if response.code != "200"
|
84
|
+
# Give error if upload failed.
|
85
|
+
UI.user_error!("App upload failed!!! Reason : #{response}")
|
86
|
+
end
|
87
|
+
end
|
43
88
|
end
|
44
89
|
end
|
45
90
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane-plugin-perfecto
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Perfecto
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|
@@ -156,7 +156,7 @@ dependencies:
|
|
156
156
|
- - ">="
|
157
157
|
- !ruby/object:Gem::Version
|
158
158
|
version: 2.0.2
|
159
|
-
description:
|
159
|
+
description:
|
160
160
|
email: support@perfectomobile.com
|
161
161
|
executables: []
|
162
162
|
extensions: []
|
@@ -172,7 +172,7 @@ homepage: https://github.com/PerfectoMobileSA/fastlane-plugin-perfecto
|
|
172
172
|
licenses:
|
173
173
|
- MIT
|
174
174
|
metadata: {}
|
175
|
-
post_install_message:
|
175
|
+
post_install_message:
|
176
176
|
rdoc_options: []
|
177
177
|
require_paths:
|
178
178
|
- lib
|
@@ -187,8 +187,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
187
187
|
- !ruby/object:Gem::Version
|
188
188
|
version: '0'
|
189
189
|
requirements: []
|
190
|
-
rubygems_version: 3.
|
191
|
-
signing_key:
|
190
|
+
rubygems_version: 3.1.6
|
191
|
+
signing_key:
|
192
192
|
specification_version: 4
|
193
193
|
summary: This plugin allows you to automatically upload ipa/apk files to Perfecto
|
194
194
|
for manual/automation testing
|