buildkite-test_collector 1.1.1 → 1.1.2
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 +11 -0
- data/CODE_OF_CONDUCT.md +1 -1
- data/DESIGN.md +19 -0
- data/README.md +5 -3
- data/lib/buildkite/test_collector/ci.rb +2 -6
- data/lib/buildkite/test_collector/error.rb +4 -0
- data/lib/buildkite/test_collector/library_hooks/minitest.rb +1 -2
- data/lib/buildkite/test_collector/library_hooks/rspec.rb +1 -2
- data/lib/buildkite/test_collector/logger.rb +0 -3
- data/lib/buildkite/test_collector/minitest_plugin/trace.rb +0 -2
- data/lib/buildkite/test_collector/minitest_plugin.rb +3 -0
- data/lib/buildkite/test_collector/rspec_plugin/reporter.rb +0 -2
- data/lib/buildkite/test_collector/rspec_plugin/trace.rb +0 -2
- data/lib/buildkite/test_collector/session.rb +4 -6
- data/lib/buildkite/test_collector/socket_connection.rb +3 -7
- data/lib/buildkite/test_collector/tracer.rb +12 -2
- data/lib/buildkite/test_collector/uploader.rb +0 -15
- data/lib/buildkite/test_collector/version.rb +1 -1
- data/lib/buildkite/test_collector.rb +33 -3
- data/lib/minitest/buildkite_collector_plugin.rb +6 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '09168f300d0d7fe87764a70906ac21693f9de504b68ac9cc547e42481d370173'
|
4
|
+
data.tar.gz: 3daa78abca6baab5cf000a01e1e49e699c02575ad7c10d4ac0d3aae9d0a760ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dbe1aa57f2b575a339bc2af259bdac5f73e98075b75de6dfb711f97262ea90c10284f06792e49e88462405bacc8e916fd5b6e0f138a073e4db9569cf147c5ca0
|
7
|
+
data.tar.gz: 49e27c93a9e23c4d6d38384f2a1dbe1be93d88b7e86a19b462fe942041bbac8da4e3adb47b9482f6741ed7faf96850ef4990e4733ecc21ee3f077c15d6c6176b
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## v1.1.2
|
4
|
+
|
5
|
+
- Remove branch reference prefix in Github Actions #136 - @gchan
|
6
|
+
- Make ruby collector work better for non-web app #128 - @JuanitoFatas
|
7
|
+
- Avoid linters complaining about double quotes #137 - @SocalNick
|
8
|
+
- Revert "Allow specifying run name prefix and suffix" #139 - @JuanitoFatas
|
9
|
+
- Update Code of Conduct contact email address #143 - @JuanitoFatas
|
10
|
+
- Suppress errors when connecting to Buildkite #145 - @swebb
|
11
|
+
- Add some design documentation to understand how the gem works #146 - @swebb
|
12
|
+
- Fix logging level from debug to error #147 - @gchan
|
13
|
+
|
3
14
|
## v1.1.1
|
4
15
|
|
5
16
|
- Strip CR/LF from token input #127 - @gchan
|
data/CODE_OF_CONDUCT.md
CHANGED
@@ -61,7 +61,7 @@ representative at an online or offline event.
|
|
61
61
|
|
62
62
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
63
63
|
reported to the community leaders responsible for enforcement at
|
64
|
-
|
64
|
+
[coc@buildkite.com](mailto:coc@buildkite.com).
|
65
65
|
All complaints will be reviewed and investigated promptly and fairly.
|
66
66
|
|
67
67
|
All community leaders are obligated to respect the privacy and security of the
|
data/DESIGN.md
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# Design
|
2
|
+
|
3
|
+
## Threads
|
4
|
+
|
5
|
+
The Buildkite ruby collector uses websockets and ActionCable to send and
|
6
|
+
receive data with Buildkite. Execution information starts transmitting as soon
|
7
|
+
as possible, without waiting for the test suite to finish running.
|
8
|
+
|
9
|
+
This gem uses 3 ruby threads:
|
10
|
+
|
11
|
+
* main thread: acts as the producer. It collects span data from the
|
12
|
+
test suite and enqueues it into the send queue.
|
13
|
+
* write thread: acts as the consumer. Removes data from the send queue and
|
14
|
+
sends it to Buildkite.
|
15
|
+
* read thread: receives and processes messages from Buildkite.
|
16
|
+
|
17
|
+
## Data
|
18
|
+
|
19
|
+
Trace data is stored in spans. See [Buildkite::TestCollector::Tracer](lib/buildkite/test_collector/tracer.rb) for more information.
|
data/README.md
CHANGED
@@ -22,7 +22,7 @@ Or add this to your Gemfile’s test group:
|
|
22
22
|
|
23
23
|
```ruby
|
24
24
|
group :test do
|
25
|
-
gem
|
25
|
+
gem 'buildkite-test_collector'
|
26
26
|
end
|
27
27
|
```
|
28
28
|
|
@@ -34,7 +34,7 @@ Add the following code to your RSpec setup file:
|
|
34
34
|
|
35
35
|
```ruby
|
36
36
|
# spec/spec_helper.rb
|
37
|
-
require
|
37
|
+
require 'buildkite/test_collector'
|
38
38
|
Buildkite::TestCollector.configure(hook: :rspec)
|
39
39
|
```
|
40
40
|
|
@@ -50,7 +50,7 @@ Add the following code to your Minitest setup file:
|
|
50
50
|
|
51
51
|
```ruby
|
52
52
|
# test/test_helper.rb
|
53
|
-
require
|
53
|
+
require 'buildkite/test_collector'
|
54
54
|
Buildkite::TestCollector.configure(hook: :minitest)
|
55
55
|
```
|
56
56
|
|
@@ -94,6 +94,8 @@ bundle exec rspec
|
|
94
94
|
|
95
95
|
Useful resources for developing collectors include the [Buildkite Test Analytics docs](https://buildkite.com/docs/test-analytics).
|
96
96
|
|
97
|
+
See [DESIGN.md](DESIGN.md) for an overview of the design of this gem.
|
98
|
+
|
97
99
|
## 👩💻 Contributing
|
98
100
|
|
99
101
|
Bug reports and pull requests are welcome on GitHub at https://github.com/buildkite/test-collector-ruby
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "securerandom"
|
4
|
-
|
5
3
|
class Buildkite::TestCollector::CI
|
6
4
|
def self.env
|
7
5
|
new.env
|
@@ -39,9 +37,7 @@ class Buildkite::TestCollector::CI
|
|
39
37
|
"debug" => ENV["BUILDKITE_ANALYTICS_DEBUG_ENABLED"],
|
40
38
|
"version" => Buildkite::TestCollector::VERSION,
|
41
39
|
"collector" => Buildkite::TestCollector::NAME,
|
42
|
-
|
43
|
-
"run_name_suffix" => ENV["BUILDKITE_ANALYTICS_RUN_NAME_SUFFIX"],
|
44
|
-
}.compact
|
40
|
+
}.compact
|
45
41
|
end
|
46
42
|
|
47
43
|
def generic
|
@@ -69,7 +65,7 @@ class Buildkite::TestCollector::CI
|
|
69
65
|
"CI" => "github_actions",
|
70
66
|
"key" => "#{ENV["GITHUB_ACTION"]}-#{ENV["GITHUB_RUN_NUMBER"]}-#{ENV["GITHUB_RUN_ATTEMPT"]}",
|
71
67
|
"url" => File.join("https://github.com", ENV["GITHUB_REPOSITORY"], "actions/runs", ENV["GITHUB_RUN_ID"]),
|
72
|
-
"branch" => ENV["
|
68
|
+
"branch" => ENV["GITHUB_REF_NAME"],
|
73
69
|
"commit_sha" => ENV["GITHUB_SHA"],
|
74
70
|
"number" => ENV["GITHUB_RUN_NUMBER"],
|
75
71
|
}
|
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
require "minitest"
|
4
4
|
|
5
|
-
require_relative "../uploader"
|
6
5
|
require_relative "../minitest_plugin"
|
7
6
|
|
8
7
|
Buildkite::TestCollector.uploader = Buildkite::TestCollector::Uploader
|
@@ -13,4 +12,4 @@ end
|
|
13
12
|
|
14
13
|
Buildkite::TestCollector.enable_tracing!
|
15
14
|
|
16
|
-
Buildkite::TestCollector::Uploader.configure
|
15
|
+
Buildkite::TestCollector.safe { Buildkite::TestCollector::Uploader.configure }
|
@@ -3,7 +3,6 @@
|
|
3
3
|
require "rspec/core"
|
4
4
|
require "rspec/expectations"
|
5
5
|
|
6
|
-
require_relative "../uploader"
|
7
6
|
require_relative "../rspec_plugin/reporter"
|
8
7
|
require_relative "../rspec_plugin/trace"
|
9
8
|
|
@@ -13,7 +12,7 @@ RSpec.configure do |config|
|
|
13
12
|
config.before(:suite) do
|
14
13
|
config.add_formatter Buildkite::TestCollector::RSpecPlugin::Reporter
|
15
14
|
|
16
|
-
Buildkite::TestCollector::Uploader.configure
|
15
|
+
Buildkite::TestCollector.safe { Buildkite::TestCollector::Uploader.configure }
|
17
16
|
end
|
18
17
|
|
19
18
|
config.around(:each) do |example|
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "socket_connection"
|
4
|
-
|
5
3
|
module Buildkite::TestCollector
|
6
4
|
class Session
|
7
5
|
# Picked 75 as the magic timeout number as it's longer than the TCP timeout of 60s 🤷♀️
|
@@ -13,11 +11,11 @@ module Buildkite::TestCollector
|
|
13
11
|
class InitialConnectionFailure < StandardError; end
|
14
12
|
|
15
13
|
DISCONNECTED_EXCEPTIONS = [
|
16
|
-
SocketConnection::HandshakeError,
|
14
|
+
Buildkite::TestCollector::SocketConnection::HandshakeError,
|
15
|
+
Buildkite::TestCollector::TimeoutError,
|
16
|
+
Buildkite::TestCollector::SocketConnection::SocketError,
|
17
17
|
RejectedSubscription,
|
18
|
-
TimeoutError,
|
19
18
|
InitialConnectionFailure,
|
20
|
-
SocketConnection::SocketError
|
21
19
|
]
|
22
20
|
|
23
21
|
def initialize(url, authorization_header, channel)
|
@@ -41,7 +39,7 @@ module Buildkite::TestCollector
|
|
41
39
|
begin
|
42
40
|
reconnection_count += 1
|
43
41
|
connect
|
44
|
-
rescue TimeoutError, InitialConnectionFailure => e
|
42
|
+
rescue Buildkite::TestCollector::TimeoutError, InitialConnectionFailure => e
|
45
43
|
Buildkite::TestCollector.logger.warn("buildkite-test_collector could not establish an initial connection with Buildkite due to #{e}. Attempting retry #{reconnection_count} of #{MAX_RECONNECTION_ATTEMPTS}...")
|
46
44
|
if reconnection_count > MAX_RECONNECTION_ATTEMPTS
|
47
45
|
Buildkite::TestCollector.logger.error "buildkite-test_collector could not establish an initial connection with Buildkite due to #{e.message} after #{MAX_RECONNECTION_ATTEMPTS} attempts. You may be missing some data for this test suite, please contact support if this issue persists."
|
@@ -1,9 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "socket"
|
4
|
-
require "openssl"
|
5
|
-
require "json"
|
6
|
-
|
7
3
|
module Buildkite::TestCollector
|
8
4
|
class SocketConnection
|
9
5
|
class HandshakeError < StandardError; end
|
@@ -65,7 +61,7 @@ module Buildkite::TestCollector
|
|
65
61
|
|
66
62
|
# Setting up a new thread that listens on the socket, and processes incoming
|
67
63
|
# comms from the server
|
68
|
-
@
|
64
|
+
@read_thread = Thread.new do
|
69
65
|
Buildkite::TestCollector.logger.debug("listening in on socket")
|
70
66
|
frame = WebSocket::Frame::Incoming::Client.new
|
71
67
|
|
@@ -82,7 +78,7 @@ module Buildkite::TestCollector
|
|
82
78
|
rescue EOFError => e
|
83
79
|
Buildkite::TestCollector.logger.warn("#{e}")
|
84
80
|
if @socket
|
85
|
-
Buildkite::TestCollector.logger.
|
81
|
+
Buildkite::TestCollector.logger.error("attempting disconnected flow")
|
86
82
|
@session.disconnected(self)
|
87
83
|
disconnect
|
88
84
|
end
|
@@ -151,7 +147,7 @@ module Buildkite::TestCollector
|
|
151
147
|
socket = @socket
|
152
148
|
@socket = nil
|
153
149
|
socket&.close
|
154
|
-
@
|
150
|
+
@read_thread&.join unless @read_thread == Thread.current
|
155
151
|
end
|
156
152
|
end
|
157
153
|
end
|
@@ -1,8 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "active_support/core_ext/hash/indifferent_access"
|
4
|
-
|
5
3
|
module Buildkite::TestCollector
|
4
|
+
# Traces the execution of an application by creating and storing spans of information.
|
5
|
+
#
|
6
|
+
# This class contains two data structures:
|
7
|
+
#
|
8
|
+
# - A stack (called @stack) that traces the entering & leaving of each part of the application.
|
9
|
+
# - A tree made up of many Span nodes. Each Span is a node in the tree. Each
|
10
|
+
# span is also stored in the stack. The root of the tree is called @top and
|
11
|
+
# is stored at @stack[0].
|
12
|
+
#
|
13
|
+
# When the trace is complete the stack MUST contain a single node @top, which
|
14
|
+
# is the root of the tree (see #finalize). The tree is converted into a hash
|
15
|
+
# in #as_json which recursively calls #as_json on all of it's children.
|
6
16
|
class Tracer
|
7
17
|
# https://github.com/buildkite/test-collector-ruby/issues/131
|
8
18
|
class MonotonicTime
|
@@ -1,20 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "openssl"
|
4
|
-
require "websocket"
|
5
|
-
|
6
|
-
require_relative "tracer"
|
7
|
-
require_relative "network"
|
8
|
-
require_relative "object"
|
9
|
-
require_relative "session"
|
10
|
-
require_relative "ci"
|
11
|
-
require_relative "http_client"
|
12
|
-
|
13
|
-
require "active_support"
|
14
|
-
require "active_support/notifications"
|
15
|
-
|
16
|
-
require "securerandom"
|
17
|
-
|
18
3
|
module Buildkite::TestCollector
|
19
4
|
class Uploader
|
20
5
|
def self.traces
|
@@ -1,16 +1,39 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
module Buildkite
|
4
|
+
module TestCollector
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
require "json"
|
9
|
+
require "logger"
|
10
|
+
require "net/http"
|
11
|
+
require "openssl"
|
12
|
+
require "time"
|
3
13
|
require "timeout"
|
4
14
|
require "tmpdir"
|
15
|
+
require "securerandom"
|
16
|
+
require "socket"
|
17
|
+
require "websocket"
|
18
|
+
|
19
|
+
require "active_support/core_ext/object/blank"
|
20
|
+
require "active_support/core_ext/hash/indifferent_access"
|
21
|
+
require "active_support/notifications"
|
5
22
|
|
6
23
|
require_relative "test_collector/version"
|
24
|
+
require_relative "test_collector/error"
|
7
25
|
require_relative "test_collector/logger"
|
26
|
+
require_relative "test_collector/ci"
|
27
|
+
require_relative "test_collector/http_client"
|
28
|
+
require_relative "test_collector/uploader"
|
29
|
+
require_relative "test_collector/network"
|
30
|
+
require_relative "test_collector/object"
|
31
|
+
require_relative "test_collector/tracer"
|
32
|
+
require_relative "test_collector/socket_connection"
|
33
|
+
require_relative "test_collector/session"
|
8
34
|
|
9
35
|
module Buildkite
|
10
36
|
module TestCollector
|
11
|
-
class Error < StandardError; end
|
12
|
-
class TimeoutError < ::Timeout::Error; end
|
13
|
-
|
14
37
|
DEFAULT_URL = "https://analytics-api.buildkite.com/v1/uploads"
|
15
38
|
|
16
39
|
class << self
|
@@ -78,5 +101,12 @@ module Buildkite
|
|
78
101
|
Buildkite::TestCollector::Uploader.tracer&.backfill(:sql, finish - start, **{ query: payload[:sql] })
|
79
102
|
end
|
80
103
|
end
|
104
|
+
|
105
|
+
def self.safe(&block)
|
106
|
+
block.call
|
107
|
+
rescue StandardError => e
|
108
|
+
logger.error("Buildkite::TestCollector received exception: #{e}")
|
109
|
+
logger.error("Backtrace:\n#{e.backtrace.join("\n")}")
|
110
|
+
end
|
81
111
|
end
|
82
112
|
end
|
@@ -1,3 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Minitest finds this file before setup code
|
4
|
+
require_relative "../buildkite/test_collector"
|
5
|
+
require_relative "../buildkite/test_collector/minitest_plugin/reporter"
|
6
|
+
|
1
7
|
module Minitest
|
2
8
|
def self.plugin_buildkite_collector_init(options)
|
3
9
|
if defined?(Buildkite::TestCollector::MinitestPlugin) && Buildkite::TestCollector.respond_to?(:uploader)
|
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: 1.1.
|
4
|
+
version: 1.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Buildkite
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -84,6 +84,7 @@ files:
|
|
84
84
|
- CHANGELOG.md
|
85
85
|
- CODEOWNERS
|
86
86
|
- CODE_OF_CONDUCT.md
|
87
|
+
- DESIGN.md
|
87
88
|
- Gemfile
|
88
89
|
- Gemfile.lock
|
89
90
|
- LICENSE.txt
|
@@ -95,6 +96,7 @@ files:
|
|
95
96
|
- buildkite.yaml
|
96
97
|
- lib/buildkite/test_collector.rb
|
97
98
|
- lib/buildkite/test_collector/ci.rb
|
99
|
+
- lib/buildkite/test_collector/error.rb
|
98
100
|
- lib/buildkite/test_collector/http_client.rb
|
99
101
|
- lib/buildkite/test_collector/library_hooks/minitest.rb
|
100
102
|
- lib/buildkite/test_collector/library_hooks/rspec.rb
|
@@ -133,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
133
135
|
- !ruby/object:Gem::Version
|
134
136
|
version: '0'
|
135
137
|
requirements: []
|
136
|
-
rubygems_version: 3.
|
138
|
+
rubygems_version: 3.1.6
|
137
139
|
signing_key:
|
138
140
|
specification_version: 4
|
139
141
|
summary: Track test executions and report to Buildkite Test Analytics
|