fastlane-plugin-perfecto 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
|