buildkite-test_collector 2.6.1 → 2.7.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 +4 -4
- data/CHANGELOG.md +15 -0
- data/CODEOWNERS +1 -1
- data/Gemfile.lock +1 -1
- data/README.md +6 -6
- data/buildkite-test_collector.gemspec +1 -1
- data/lib/buildkite/test_collector/http_client.rb +7 -1
- data/lib/buildkite/test_collector/library_hooks/rspec.rb +0 -1
- data/lib/buildkite/test_collector/tracer.rb +14 -5
- data/lib/buildkite/test_collector/uploader.rb +3 -2
- data/lib/buildkite/test_collector/version.rb +1 -1
- data/lib/buildkite/test_collector.rb +16 -1
- metadata +3 -4
- data/lib/buildkite/test_collector/test_links_plugin/formatter.rb +0 -62
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bcfc8923f58efed71367663fffeff688fbfbf9eeb330b7876cc89b71fb3e72d7
|
4
|
+
data.tar.gz: 59df6ce58d186a12ef039a26aa372d96af142bc0f6ecd390767ec182737960d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6fdc80dfdc84af033309dee9071334d5d5978d01d2515bdc3324dce5726146edb7d145867cec458232ccd9bc83c6da53638c9895f43daca3483eb19366a18c94
|
7
|
+
data.tar.gz: ae959e70dec2e553f72be5168b5df7fb69aa1e94c040fa6563f277cfcf98e979604b3e5e4fc23b413b61dac018d0628babbf8be0465e869f2ad678b9cb50bd4e
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,20 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## v2.7.1
|
4
|
+
|
5
|
+
- Removes test links from job logs
|
6
|
+
- Rename Test Analytics to Test Engine
|
7
|
+
|
8
|
+
## v2.7.0
|
9
|
+
|
10
|
+
Features:
|
11
|
+
|
12
|
+
- Add configurable span filters #220 - @catkins
|
13
|
+
|
14
|
+
Fixes:
|
15
|
+
|
16
|
+
- Correctly report HTTP error during upload #223 - @zhming0
|
17
|
+
|
3
18
|
## v2.6.1
|
4
19
|
|
5
20
|
- Fix missing failed examples if rspec hooks fail #221 - @zhming0
|
data/CODEOWNERS
CHANGED
@@ -1 +1 @@
|
|
1
|
-
* @buildkite/test-
|
1
|
+
* @buildkite/test-engine
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
**DEPRECATION NOTICE**
|
4
4
|
Versions prior to 2.1.x are unsupported and will not work after mid-2023. Please upgrade to the latest version.
|
5
5
|
|
6
|
-
Official [Buildkite Test
|
6
|
+
Official [Buildkite Test Engine](https://buildkite.com/platform/test-engine) collectors for Ruby test frameworks ✨
|
7
7
|
|
8
8
|
⚒ **Supported test frameworks:** RSpec, Minitest, and [more coming soon](https://github.com/buildkite/test-collector-ruby/issues?q=is%3Aissue+is%3Aopen+label%3A%22test+frameworks%22).
|
9
9
|
|
@@ -68,13 +68,13 @@ BUILDKITE_ANALYTICS_TOKEN=xyz rake
|
|
68
68
|
Add the `BUILDKITE_ANALYTICS_TOKEN` secret to your CI, push your changes to a branch, and open a pull request 🎉
|
69
69
|
|
70
70
|
```bash
|
71
|
-
git checkout -b add-buildkite-test-
|
72
|
-
git commit -am "Add Buildkite Test
|
73
|
-
git push origin add-buildkite-test-
|
71
|
+
git checkout -b add-buildkite-test-engine
|
72
|
+
git commit -am "Add Buildkite Test Engine"
|
73
|
+
git push origin add-buildkite-test-engine
|
74
74
|
```
|
75
75
|
|
76
76
|
### VCR
|
77
|
-
If your test suites use [VCR](https://github.com/vcr/vcr) to stub network requests, you'll need to modify the config to allow actual network requests to Test
|
77
|
+
If your test suites use [VCR](https://github.com/vcr/vcr) to stub network requests, you'll need to modify the config to allow actual network requests to Test Engine.
|
78
78
|
|
79
79
|
```
|
80
80
|
VCR.configure do |c|
|
@@ -119,7 +119,7 @@ And run the tests:
|
|
119
119
|
bundle exec rspec
|
120
120
|
```
|
121
121
|
|
122
|
-
Useful resources for developing collectors include the [Buildkite Test
|
122
|
+
Useful resources for developing collectors include the [Buildkite Test Engine docs](https://buildkite.com/docs/test-engine).
|
123
123
|
|
124
124
|
See [DESIGN.md](DESIGN.md) for an overview of the design of this gem.
|
125
125
|
|
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ["Buildkite"]
|
9
9
|
spec.email = ["support+analytics@buildkite.com"]
|
10
10
|
|
11
|
-
spec.summary = "Track test executions and report to Buildkite Test
|
11
|
+
spec.summary = "Track test executions and report to Buildkite Test Engine"
|
12
12
|
spec.homepage = "https://github.com/buildkite/test-collector-ruby"
|
13
13
|
spec.license = "MIT"
|
14
14
|
|
@@ -38,7 +38,13 @@ module Buildkite::TestCollector
|
|
38
38
|
|
39
39
|
contact.body = compressed_body.string
|
40
40
|
|
41
|
-
http.request(contact)
|
41
|
+
response = http.request(contact)
|
42
|
+
|
43
|
+
if response.is_a?(Net::HTTPSuccess)
|
44
|
+
response
|
45
|
+
else
|
46
|
+
raise "HTTP Request Failed: #{response.code} #{response.message}"
|
47
|
+
end
|
42
48
|
end
|
43
49
|
|
44
50
|
def metadata
|
@@ -58,7 +58,6 @@ module Buildkite::TestCollector
|
|
58
58
|
def initialize(min_duration: nil)
|
59
59
|
@top = Span.new(:top, MonotonicTime.call, nil, {})
|
60
60
|
@stack = [@top]
|
61
|
-
@min_duration = min_duration
|
62
61
|
end
|
63
62
|
|
64
63
|
def enter(section, **detail)
|
@@ -69,17 +68,17 @@ module Buildkite::TestCollector
|
|
69
68
|
|
70
69
|
def leave
|
71
70
|
current_span.end_at = MonotonicTime.call
|
72
|
-
duration = current_span.duration
|
73
71
|
@stack.pop
|
74
|
-
|
72
|
+
|
73
|
+
current_span.children.pop unless retain_span?(current_span.children.last)
|
74
|
+
|
75
75
|
nil # avoid ambiguous return type/value
|
76
76
|
end
|
77
77
|
|
78
78
|
def backfill(section, duration, **detail)
|
79
|
-
return if @min_duration && duration < @min_duration
|
80
79
|
now = MonotonicTime.call
|
81
80
|
new_entry = Span.new(section, now - duration, now, detail)
|
82
|
-
current_span.children << new_entry
|
81
|
+
current_span.children << new_entry if retain_span?(new_entry)
|
83
82
|
end
|
84
83
|
|
85
84
|
def current_span
|
@@ -95,5 +94,15 @@ module Buildkite::TestCollector
|
|
95
94
|
def history
|
96
95
|
@top.as_hash
|
97
96
|
end
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
def retain_span?(span)
|
101
|
+
return true unless Buildkite::TestCollector.span_filters
|
102
|
+
|
103
|
+
Buildkite::TestCollector.span_filters.all? do |filter|
|
104
|
+
filter.call(span)
|
105
|
+
end
|
106
|
+
end
|
98
107
|
end
|
99
108
|
end
|
@@ -25,7 +25,8 @@ module Buildkite::TestCollector
|
|
25
25
|
OpenSSL::SSL::SSLError,
|
26
26
|
OpenSSL::SSL::SSLErrorWaitReadable,
|
27
27
|
EOFError,
|
28
|
-
Errno::ETIMEDOUT
|
28
|
+
Errno::ETIMEDOUT,
|
29
|
+
# TODO: some retries for server-side error would be great.
|
29
30
|
]
|
30
31
|
|
31
32
|
def self.tracer
|
@@ -38,7 +39,7 @@ module Buildkite::TestCollector
|
|
38
39
|
http = Buildkite::TestCollector::HTTPClient.new(Buildkite::TestCollector.url)
|
39
40
|
|
40
41
|
Thread.new do
|
41
|
-
|
42
|
+
begin
|
42
43
|
upload_attempts ||= 0
|
43
44
|
http.post_json(data)
|
44
45
|
rescue *Buildkite::TestCollector::Uploader::RETRYABLE_UPLOAD_ERRORS => e
|
@@ -28,7 +28,6 @@ module Buildkite
|
|
28
28
|
module TestCollector
|
29
29
|
DEFAULT_URL = "https://analytics-api.buildkite.com/v1/uploads"
|
30
30
|
DEFAULT_UPLOAD_BATCH_SIZE = 500
|
31
|
-
|
32
31
|
class << self
|
33
32
|
attr_accessor :api_token
|
34
33
|
attr_accessor :url
|
@@ -39,6 +38,7 @@ module Buildkite
|
|
39
38
|
attr_accessor :env
|
40
39
|
attr_accessor :batch_size
|
41
40
|
attr_accessor :trace_min_duration
|
41
|
+
attr_accessor :span_filters
|
42
42
|
end
|
43
43
|
|
44
44
|
def self.configure(hook:, token: nil, url: nil, tracing_enabled: true, artifact_path: nil, env: {})
|
@@ -54,6 +54,11 @@ module Buildkite
|
|
54
54
|
Float(trace_min_ms_string) / 1000
|
55
55
|
end
|
56
56
|
|
57
|
+
self.span_filters = []
|
58
|
+
unless self.trace_min_duration.nil?
|
59
|
+
self.span_filters << MinDurationSpanFilter.new(self.trace_min_duration)
|
60
|
+
end
|
61
|
+
|
57
62
|
self.hook_into(hook)
|
58
63
|
end
|
59
64
|
|
@@ -84,5 +89,15 @@ module Buildkite
|
|
84
89
|
Buildkite::TestCollector::Uploader.tracer&.backfill(:sql, finish - start, **{ query: payload[:sql] })
|
85
90
|
end
|
86
91
|
end
|
92
|
+
|
93
|
+
class MinDurationSpanFilter
|
94
|
+
def initialize(min_duration)
|
95
|
+
@min_duration = min_duration
|
96
|
+
end
|
97
|
+
|
98
|
+
def call(span)
|
99
|
+
span.duration > @min_duration
|
100
|
+
end
|
101
|
+
end
|
87
102
|
end
|
88
103
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: buildkite-test_collector
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Buildkite
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-12-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -88,7 +88,6 @@ files:
|
|
88
88
|
- lib/buildkite/test_collector/rspec_plugin/reporter.rb
|
89
89
|
- lib/buildkite/test_collector/rspec_plugin/trace.rb
|
90
90
|
- lib/buildkite/test_collector/session.rb
|
91
|
-
- lib/buildkite/test_collector/test_links_plugin/formatter.rb
|
92
91
|
- lib/buildkite/test_collector/tracer.rb
|
93
92
|
- lib/buildkite/test_collector/uploader.rb
|
94
93
|
- lib/buildkite/test_collector/uuid.rb
|
@@ -118,5 +117,5 @@ requirements: []
|
|
118
117
|
rubygems_version: 3.5.11
|
119
118
|
signing_key:
|
120
119
|
specification_version: 4
|
121
|
-
summary: Track test executions and report to Buildkite Test
|
120
|
+
summary: Track test executions and report to Buildkite Test Engine
|
122
121
|
test_files: []
|
@@ -1,62 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Buildkite::TestCollector::TestLinksPlugin
|
4
|
-
class Formatter
|
5
|
-
RSpec::Core::Formatters.register self, :dump_failures
|
6
|
-
|
7
|
-
def initialize(output)
|
8
|
-
@output = output
|
9
|
-
end
|
10
|
-
|
11
|
-
def dump_failures(notification)
|
12
|
-
# Do not display summary if no failed examples
|
13
|
-
return if notification.failed_examples.empty?
|
14
|
-
|
15
|
-
# Check if a Test Analytics token is set
|
16
|
-
return unless Buildkite::TestCollector.api_token
|
17
|
-
|
18
|
-
metadata = fetch_metadata
|
19
|
-
|
20
|
-
# return if metadata was not fetched successfully
|
21
|
-
return if metadata.nil?
|
22
|
-
|
23
|
-
# return if suite url is nil
|
24
|
-
return if metadata['suite_url'].nil?
|
25
|
-
|
26
|
-
@output << "\n\n🔥 \x1b[31mTest Analytics failures 🔥\n"
|
27
|
-
@output << '_____________________________'
|
28
|
-
@output << "\n\n"
|
29
|
-
|
30
|
-
@output << notification.failed_examples.map do |example|
|
31
|
-
failed_example_output(example, metadata['suite_url'])
|
32
|
-
end.join("\n")
|
33
|
-
|
34
|
-
@output << "\n\n"
|
35
|
-
end
|
36
|
-
|
37
|
-
private
|
38
|
-
|
39
|
-
def generate_scope_name_digest(scope, name)
|
40
|
-
Digest::SHA256.hexdigest(scope + name)
|
41
|
-
end
|
42
|
-
|
43
|
-
def failed_example_output(example, url)
|
44
|
-
scope = example.example_group.metadata[:full_description]
|
45
|
-
name = example.description
|
46
|
-
scope_name_digest = generate_scope_name_digest(scope, name)
|
47
|
-
test_url = "#{url}/tests/#{scope_name_digest}"
|
48
|
-
"🔗 \x1b[4m\x1b[37m#{%(\x1b]1339;url=#{test_url};content="#{scope} #{name}"\x07)}\x1b[m"
|
49
|
-
end
|
50
|
-
|
51
|
-
def fetch_metadata
|
52
|
-
return unless Buildkite::TestCollector.api_token
|
53
|
-
|
54
|
-
http = Buildkite::TestCollector::HTTPClient.new(Buildkite::TestCollector.url)
|
55
|
-
response = http.metadata
|
56
|
-
|
57
|
-
JSON.parse(response.body) if response.code == '200'
|
58
|
-
rescue StandardError => e
|
59
|
-
# We don't need to output anything here
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|