parallel_report_portal 3.0.0 → 3.0.2.beta.1

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: bdb8752fe04d7457a3333f818ee74af105d17f1cb32ae0c6ecd8daa897d11f7f
4
- data.tar.gz: ef6b77445231d20740f515f046c35fd39266361fd6637b524958907c974b8014
3
+ metadata.gz: e1d5cb1312e5c4b45d5581eea41e02df63266535ee5e3b58412f5d9fde5fd0dd
4
+ data.tar.gz: a10beda80c2270a68c06ff13a18701cf1cd0734eae91bd0c81c37cf0ecfd0623
5
5
  SHA512:
6
- metadata.gz: 19864c308420494e6dd7c0cd6321fc53aaafba70b1fe6d0ea0caf9957c69b308aaf9034e1c48551d4a06ae2580c827975489dcf6d22f5523d13c251bb966dce6
7
- data.tar.gz: c70a9b840d9d9cb2e2b1ecb071d6b2ff65e5479faacdea9bcf2307cc4edde7d8f768e4cbde5d18fadd7e4d637ed2a50fe6ba0483031cb68bb869a4d34b521532
6
+ metadata.gz: aa2e9ce388cd7de1df78bbcd958c44f6bd329e8ebc7c40c0f550b5e79febd82b2a5913e141fc74f3e80206968f801c9e885539b7df2a4f5c06ae4508b9df11a6
7
+ data.tar.gz: 02b361da3143afa20ecd5d2111cd74fef9655b848a56174b2624d60193b2f2ee40b996ccd0dbf29abefa165e271836cac7a8c08bcab63a71d08a7c80306be85d
@@ -0,0 +1,44 @@
1
+ name: Ruby
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+
7
+ jobs:
8
+ test:
9
+ runs-on: ubuntu-latest
10
+ strategy:
11
+ matrix:
12
+ ruby-version: [ 3.1, 3.2, 3.3 ]
13
+
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+
17
+ - name: Set up Ruby
18
+ uses: ruby/setup-ruby@v1
19
+ with:
20
+ ruby-version: ${{ matrix.ruby-version }}
21
+ bundler-cache: true
22
+
23
+ - name: Run tests
24
+ run: bundle exec rake
25
+
26
+ deploy:
27
+ needs: test
28
+ runs-on: ubuntu-latest
29
+
30
+ steps:
31
+ - uses: actions/checkout@v4
32
+
33
+ - name: Set up Ruby
34
+ uses: ruby/setup-ruby@v1
35
+ with:
36
+ ruby-version: 3.3
37
+ bundler-cache: true
38
+
39
+ - name: Publish to RubyGems
40
+ run: |
41
+ gem build *.gemspec
42
+ gem push *.gem
43
+ env:
44
+ GEM_HOST_API_KEY: ${{ secrets.PARALLEL_RP_RUBYGEMS_AUTH_TOKEN }}
@@ -7,7 +7,9 @@
7
7
 
8
8
  name: Ruby
9
9
 
10
- on: [push]
10
+ on:
11
+ push:
12
+ branches-ignore: [ master ]
11
13
 
12
14
  jobs:
13
15
  test:
@@ -15,14 +17,16 @@ jobs:
15
17
  runs-on: ubuntu-latest
16
18
  strategy:
17
19
  matrix:
18
- ruby-version: ['2.6', '2.7', '3.0']
20
+ ruby-version: [ 3.1, 3.2, 3.3 ]
19
21
 
20
22
  steps:
21
- - uses: actions/checkout@v2
23
+ - uses: actions/checkout@v4
24
+
22
25
  - name: Set up Ruby
23
26
  uses: ruby/setup-ruby@v1
24
27
  with:
25
28
  ruby-version: ${{ matrix.ruby-version }}
26
- bundler-cache: true # runs 'bundle install' and caches installed gems automatically
29
+ bundler-cache: true
30
+
27
31
  - name: Run tests
28
32
  run: bundle exec rake
data/README.md CHANGED
@@ -46,7 +46,7 @@ read_timeout: 60
46
46
 
47
47
  It will search for the following environment variables which may be in upper or lowercase (the official client defers to lower case, this is available here for compatibility).
48
48
 
49
- - `REPORT_PORTAL_API_KEY` - the API Key for this Report Portal instance which must be created in advance
49
+ - `RP_API_KEY` - the API Key for this Report Portal instance which must be created in advance
50
50
  - `RP_ENDPOINT` - the endpoint for this Report Portal instance
51
51
  - `RP_PROJECT` - the Report Portal project name which must be created in advance and this user added as a member
52
52
  - `RP_LAUNCH` - the name of this 'launch'
@@ -14,7 +14,7 @@ module ParallelReportPortal
14
14
  #
15
15
  # == Environment variables
16
16
  #
17
- # REPORT_PORTAL_API_KEY:: The API key required for authentication
17
+ # RP_API_KEY:: The API key required for authentication
18
18
  # RP_ENDPOINT:: the URL of the Report Portal API endpoint
19
19
  # RP_PROJECT:: the Report Portal project name -- this must already exist within Report Port and this user must be a member of the project
20
20
  # RP_LAUNCH:: The name of this launch
@@ -61,7 +61,7 @@ module ParallelReportPortal
61
61
  def initialize
62
62
  load_configuration_file
63
63
  ATTRIBUTES.each do |attr|
64
- env_value = get_env("rp_#{attr.to_s}") || get_env("report_portal_#{attr.to_s}")
64
+ env_value = get_env("rp_#{attr.to_s}")
65
65
  send(:"#{attr}=", env_value) if env_value
66
66
  end
67
67
 
@@ -153,8 +153,6 @@ module ParallelReportPortal
153
153
  ATTRIBUTES.each do |attr|
154
154
  yaml_key = if yaml.has_key?("rp_#{attr}".to_sym)
155
155
  "rp_#{attr}".to_sym
156
- elsif yaml.has_key?("report_portal_#{attr}".to_sym)
157
- "report_portal_#{attr}".to_sym
158
156
  else
159
157
  attr
160
158
  end
@@ -23,11 +23,10 @@ module ParallelReportPortal
23
23
  unknown: 'UNKNOWN'
24
24
  }
25
25
 
26
-
27
26
  # Create a new instance of the report
28
27
  def initialize(ast_lookup = nil)
29
28
  @feature = nil
30
- @tree = Tree::TreeNode.new( 'root' )
29
+ @tree = Tree::TreeNode.new('root')
31
30
  @ast_lookup = ast_lookup
32
31
  check_faraday_compatibility
33
32
  end
@@ -38,7 +37,7 @@ module ParallelReportPortal
38
37
  end
39
38
  end
40
39
 
41
- # Issued to start a launch. It is possilbe that this method could be called
40
+ # Issued to start a launch. It is possible that this method could be called
42
41
  # from multiple processes for the same launch if this is being run with
43
42
  # parallel tests enabled. A temporary launch file will be created (using
44
43
  # exclusive locking). The first time this method is called it will write the
@@ -48,13 +47,13 @@ module ParallelReportPortal
48
47
  # @param start_time [Integer] the millis from the epoch
49
48
  # @return [String] the UUID of this launch
50
49
  def launch_started(start_time)
51
- ParallelReportPortal.file_open_exlock_and_block(ParallelReportPortal.launch_id_file, 'a+' ) do |file|
50
+ ParallelReportPortal.file_open_exlock_and_block(ParallelReportPortal.launch_id_file, 'a+') do |file|
52
51
  if file.size == 0
53
52
  @launch_id = ParallelReportPortal.req_launch_started(start_time)
54
53
  file.write(@launch_id)
55
54
  file.flush
56
55
  else
57
- @launch_id = file.readline
56
+ @launch_id = file.readline
58
57
  end
59
58
  @launch_id
60
59
  end
@@ -65,12 +64,8 @@ module ParallelReportPortal
65
64
  # @param clock [Integer] the millis from the epoch
66
65
  def launch_finished(clock)
67
66
  @tree.postordered_each do |node|
68
- response = ParallelReportPortal.req_feature_finished(node.content, clock) unless node.is_root?
69
- parse_report_link_from_response(response)
67
+ ParallelReportPortal.http_repeater { ParallelReportPortal.req_feature_finished(node.content, clock) } unless node.is_root?
70
68
  end
71
- response = ParallelReportPortal.req_launch_finished(launch_id, clock)
72
- parse_report_link_from_response(response)
73
- ParallelReportPortal.launch_finished_block.call if ParallelReportPortal.launch_finished_block
74
69
  end
75
70
 
76
71
  # Called to indicate that a feature has started.
@@ -114,7 +109,7 @@ module ParallelReportPortal
114
109
  if (using_cucumber_messages? ? test_step : step_source).multiline_arg.doc_string?
115
110
  detail << %(\n"""\n#{(using_cucumber_messages? ? test_step : step_source).multiline_arg.content}\n""")
116
111
  elsif (using_cucumber_messages? ? test_step : step_source).multiline_arg.data_table?
117
- detail << (using_cucumber_messages? ? test_step : step_source).multiline_arg.raw.reduce("\n") {|acc, row| acc << "| #{row.join(' | ')} |\n"}
112
+ detail << (using_cucumber_messages? ? test_step : step_source).multiline_arg.raw.reduce("\n") { |acc, row| acc << "| #{row.join(' | ')} |\n" }
118
113
  end
119
114
 
120
115
  ParallelReportPortal.req_log(@test_case_id, detail, status_to_level(:trace), clock)
@@ -155,13 +150,14 @@ module ParallelReportPortal
155
150
  else
156
151
  feature.location.file.split(File::SEPARATOR)
157
152
  end
158
- ParallelReportPortal.file_open_exlock_and_block(ParallelReportPortal.hierarchy_file, 'a+b' ) do |file|
153
+
154
+ ParallelReportPortal.file_open_exlock_and_block(ParallelReportPortal.hierarchy_file, 'a+b') do |file|
159
155
  @tree = Marshal.load(File.read(file)) if file.size > 0
160
156
  node = @tree.root
161
157
  path_components[0..-2].each do |component|
162
158
  next_node = node[component]
163
159
  unless next_node
164
- id = ParallelReportPortal.req_hierarchy(launch_id, "Folder: #{component}", node.content, 'SUITE', [], nil, clock )
160
+ id = ParallelReportPortal.req_hierarchy(launch_id, "Folder: #{component}", node.content, 'SUITE', [], nil, clock)
165
161
  next_node = Tree::TreeNode.new(component, id)
166
162
  node << next_node
167
163
  node = next_node
@@ -219,7 +215,7 @@ module ParallelReportPortal
219
215
  if using_cucumber_messages?
220
216
  test_step.hook?
221
217
  else
222
- ! test_step.source.last.respond_to?(:keyword)
218
+ !test_step.source.last.respond_to?(:keyword)
223
219
  end
224
220
  end
225
221
 
@@ -235,13 +231,6 @@ module ParallelReportPortal
235
231
  LOG_LEVELS.fetch(status, LOG_LEVELS[:info])
236
232
  end
237
233
  end
238
-
239
- def parse_report_link_from_response(response)
240
- if response
241
- json = JSON.parse(response.body)
242
- ParallelReportPortal.report_url = json['link'] if json['link']
243
- end
244
- end
245
234
  end
246
235
  end
247
236
  end
@@ -1,12 +1,13 @@
1
1
  require 'logger'
2
2
  require 'tempfile'
3
- require 'pry'
4
3
 
5
4
  module ParallelReportPortal
6
5
  # A collection of methods for communicating with the ReportPortal
7
6
  # REST interface.
8
7
  module HTTP
9
8
 
9
+ class HTTPBadGatewayError < StandardError; end
10
+
10
11
  # Creating class level logger and setting log level
11
12
  @@logger = Logger.new(STDOUT)
12
13
  @@logger.level = Logger::ERROR
@@ -84,9 +85,6 @@ module ParallelReportPortal
84
85
  }.to_json
85
86
  end
86
87
 
87
- pp "#########################"
88
- pp resp
89
-
90
88
  if resp.success?
91
89
  JSON.parse(resp.body)['id']
92
90
  else
@@ -97,9 +95,30 @@ module ParallelReportPortal
97
95
  # Send a request to Report Portal to finish a launch.
98
96
  # It will bubble up any Faraday connection exceptions.
99
97
  def req_launch_finished(launch_id, time)
100
- ParallelReportPortal.http_connection.put("launch/#{launch_id}/finish") do |req|
98
+ @@logger.debug { "Launch finish with ID: '#{launch_id}'" }
99
+
100
+ response = ParallelReportPortal.http_connection.put("launch/#{launch_id}/finish") do |req|
101
101
  req.body = { end_time: time }.to_json
102
102
  end
103
+
104
+ @@logger.error { "Launch finish failed with response code #{response.status} -- message #{response.body}" } unless response.success?
105
+ response
106
+ end
107
+
108
+ def force_stop(launch_id, time)
109
+ resp = ParallelReportPortal.http_connection.put("launch/#{launch_id}/stop") do |req|
110
+ req.body = { end_time: time, status: :stopped }.to_json
111
+ end
112
+ @@logger.warn { "Failed to force stop: response code #{resp.status} -- message #{resp.body}" } unless resp.success?
113
+
114
+ resp
115
+ end
116
+
117
+ def parse_report_link_from_response(response)
118
+ if response
119
+ json = JSON.parse(response.body)
120
+ ParallelReportPortal.report_url = json['link'] if json['link']
121
+ end
103
122
  end
104
123
 
105
124
  # Send a request to ReportPortal to start a feature.
@@ -149,9 +168,14 @@ module ParallelReportPortal
149
168
 
150
169
  # Send a request to Report Portal that a feature has completed.
151
170
  def req_feature_finished(feature_id, time)
152
- ParallelReportPortal.http_connection.put("item/#{feature_id}") do |req|
171
+ response = ParallelReportPortal.http_connection.put("item/#{feature_id}") do |req|
153
172
  req.body = { end_time: time }.to_json
154
173
  end
174
+ @@logger.debug { "Feature finish with ID: '#{feature_id}'" }
175
+
176
+
177
+ @@logger.error { "Feature finish failed with response code #{response.status} -- message #{response.body}" } unless response.success?
178
+ response
155
179
  end
156
180
 
157
181
  # Send a request to ReportPortal to start a test case.
@@ -240,5 +264,23 @@ module ParallelReportPortal
240
264
  end
241
265
  end
242
266
  end
267
+
268
+
269
+
270
+ def http_repeater(&block)
271
+ tries = 0
272
+ begin
273
+ tries += 1
274
+ response = block.call
275
+ raise HTTPBadGatewayError if response && !response.success? && response.status == 502
276
+ rescue HTTPBadGatewayError => _e
277
+ if tries <= 3
278
+ sleep(1)
279
+ @@logger.warn { 'HTTP call failed, retrying...' }
280
+ retry
281
+ end
282
+ end
283
+ response
284
+ end
243
285
  end
244
286
  end
@@ -1,3 +1,3 @@
1
1
  module ParallelReportPortal
2
- VERSION = "3.0.0"
2
+ VERSION = "3.0.2.beta.1"
3
3
  end
@@ -33,6 +33,11 @@ module ParallelReportPortal
33
33
  if ParallelReportPortal.parallel?
34
34
  if ParallelTests.first_process?
35
35
  ParallelTests.wait_for_other_processes_to_finish
36
+
37
+ launch_id = File.read(launch_id_file)
38
+ response = http_repeater { req_launch_finished(launch_id, clock) }
39
+ response.success? ? parse_report_link_from_response(response) : force_stop(launch_id, clock)
40
+
36
41
  delete_file(launch_id_file)
37
42
  delete_file(hierarchy_file)
38
43
  end
@@ -32,7 +32,7 @@ Gem::Specification.new do |spec|
32
32
  spec.add_development_dependency "appraisal", '~> 2.4'
33
33
  spec.add_development_dependency "bump", "~> 0.8"
34
34
  spec.add_development_dependency "bundler", "~> 2.0"
35
- spec.add_development_dependency "rake", "~> 10.0"
35
+ spec.add_development_dependency "rake", "~> 13.0"
36
36
  spec.add_development_dependency "rspec", "~> 3.0"
37
37
  spec.add_development_dependency "pry", "~> 0.12"
38
38
  spec.add_development_dependency "webmock", "~> 3.12"
@@ -41,6 +41,6 @@ Gem::Specification.new do |spec|
41
41
  spec.add_runtime_dependency 'faraday-net_http_persistent', '~> 2.1'
42
42
  spec.add_runtime_dependency 'faraday-multipart', '~> 1.0', '>= 1.0.4'
43
43
  spec.add_runtime_dependency 'parallel_tests', '>= 2.29.1'
44
- spec.add_runtime_dependency 'rubytree', '~> 1.0'
44
+ spec.add_runtime_dependency 'rubytree', '~> 2.0'
45
45
  spec.add_runtime_dependency 'net-http-persistent', '~> 4.0'
46
46
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parallel_report_portal
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.0.2.beta.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nigel Brookes-Thomas
8
8
  - Thomas Feathers
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2023-12-21 00:00:00.000000000 Z
12
+ date: 2024-01-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: appraisal
@@ -59,14 +59,14 @@ dependencies:
59
59
  requirements:
60
60
  - - "~>"
61
61
  - !ruby/object:Gem::Version
62
- version: '10.0'
62
+ version: '13.0'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
- version: '10.0'
69
+ version: '13.0'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rspec
72
72
  requirement: !ruby/object:Gem::Requirement
@@ -177,14 +177,14 @@ dependencies:
177
177
  requirements:
178
178
  - - "~>"
179
179
  - !ruby/object:Gem::Version
180
- version: '1.0'
180
+ version: '2.0'
181
181
  type: :runtime
182
182
  prerelease: false
183
183
  version_requirements: !ruby/object:Gem::Requirement
184
184
  requirements:
185
185
  - - "~>"
186
186
  - !ruby/object:Gem::Version
187
- version: '1.0'
187
+ version: '2.0'
188
188
  - !ruby/object:Gem::Dependency
189
189
  name: net-http-persistent
190
190
  requirement: !ruby/object:Gem::Requirement
@@ -207,6 +207,7 @@ executables: []
207
207
  extensions: []
208
208
  extra_rdoc_files: []
209
209
  files:
210
+ - ".github/workflows/deploy.yml"
210
211
  - ".github/workflows/tests.yml"
211
212
  - ".gitignore"
212
213
  - ".rspec"
@@ -240,7 +241,7 @@ licenses:
240
241
  metadata:
241
242
  homepage_uri: https://github.com/dvla/dvla-reportportal-ruby
242
243
  source_code_uri: https://github.com/dvla/dvla-reportportal-ruby
243
- post_install_message:
244
+ post_install_message:
244
245
  rdoc_options: []
245
246
  require_paths:
246
247
  - lib
@@ -255,8 +256,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
255
256
  - !ruby/object:Gem::Version
256
257
  version: '0'
257
258
  requirements: []
258
- rubygems_version: 3.2.3
259
- signing_key:
259
+ rubygems_version: 3.5.3
260
+ signing_key:
260
261
  specification_version: 4
261
262
  summary: Run Cucumber Tests in parallel and with Cucumber 3 and 4+
262
263
  test_files: []