rspec-buildkite-analytics 0.6.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +6 -8
- data/lib/rspec/buildkite/analytics/ci.rb +79 -20
- data/lib/rspec/buildkite/analytics/session.rb +21 -5
- data/lib/rspec/buildkite/analytics/uploader.rb +17 -3
- data/lib/rspec/buildkite/analytics/version.rb +2 -1
- data/lib/rspec/buildkite/analytics.rb +6 -0
- data/rspec-buildkite-analytics.gemspec +1 -1
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a29588419eb727d74849c54b0d38f5b90974c3f58f083e48958a17288a1dc1fe
|
4
|
+
data.tar.gz: 1fd5fd323f7737c247b61bcd87ea9778e3f020601514eb52777c0ba5871c24aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45624d6a321c8ff16008e259b4a3eb3f118449d36947f1cb0efb86c7e988ee3e904a2665be517b4be2cd8075d4c1352d8356df88ac43c615664ec28383ced50f
|
7
|
+
data.tar.gz: fdb57102cd80974a01e939e8ab8bc8ae3ce22f39ff5a6862cc7cdc9d5250672a93ff966dfa391e47e80cdfaf70354082f0afd9ca1f6d4e1104edb53dbc11d977
|
data/CHANGELOG.md
ADDED
data/Gemfile.lock
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rspec-buildkite-analytics (0.
|
5
|
-
activesupport (>= 5.2,
|
4
|
+
rspec-buildkite-analytics (0.8.0)
|
5
|
+
activesupport (>= 5.2, < 8)
|
6
6
|
rspec-core (~> 3.10)
|
7
7
|
rspec-expectations (~> 3.10)
|
8
8
|
websocket (~> 1.2)
|
@@ -10,17 +10,16 @@ PATH
|
|
10
10
|
GEM
|
11
11
|
remote: https://rubygems.org/
|
12
12
|
specs:
|
13
|
-
activesupport (
|
13
|
+
activesupport (7.0.2.3)
|
14
14
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
15
15
|
i18n (>= 1.6, < 2)
|
16
16
|
minitest (>= 5.1)
|
17
17
|
tzinfo (~> 2.0)
|
18
|
-
|
19
|
-
concurrent-ruby (1.1.9)
|
18
|
+
concurrent-ruby (1.1.10)
|
20
19
|
diff-lcs (1.4.4)
|
21
|
-
i18n (1.
|
20
|
+
i18n (1.10.0)
|
22
21
|
concurrent-ruby (~> 1.0)
|
23
|
-
minitest (5.
|
22
|
+
minitest (5.15.0)
|
24
23
|
rake (13.0.6)
|
25
24
|
rspec (3.10.0)
|
26
25
|
rspec-core (~> 3.10.0)
|
@@ -38,7 +37,6 @@ GEM
|
|
38
37
|
tzinfo (2.0.4)
|
39
38
|
concurrent-ruby (~> 1.0)
|
40
39
|
websocket (1.2.9)
|
41
|
-
zeitwerk (2.5.1)
|
42
40
|
|
43
41
|
PLATFORMS
|
44
42
|
ruby
|
@@ -2,26 +2,85 @@
|
|
2
2
|
|
3
3
|
require "securerandom"
|
4
4
|
|
5
|
-
|
5
|
+
class RSpec::Buildkite::Analytics::CI
|
6
6
|
def self.env
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
7
|
+
new.env
|
8
|
+
end
|
9
|
+
|
10
|
+
# The analytics env are more specific than the automatic ci platform env.
|
11
|
+
# If they've been specified we'll assume the user wants to use that value instead.
|
12
|
+
def env
|
13
|
+
ci_env.merge(analytics_env)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def ci_env
|
19
|
+
return buildkite if ENV["BUILDKITE_BUILD_ID"]
|
20
|
+
return github_actions if ENV["GITHUB_RUN_NUMBER"]
|
21
|
+
return circleci if ENV["CIRCLE_BUILD_NUM"]
|
22
|
+
return generic if ENV["CI"]
|
23
|
+
|
24
|
+
{
|
25
|
+
"CI" => nil,
|
26
|
+
"key" => SecureRandom.uuid,
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
def analytics_env
|
31
|
+
{
|
32
|
+
"key" => ENV["BUILDKITE_ANALYTICS_KEY"],
|
33
|
+
"url" => ENV["BUILDKITE_ANALYTICS_URL"],
|
34
|
+
"branch" => ENV["BUILDKITE_ANALYTICS_BRANCH"],
|
35
|
+
"commit_sha" => ENV["BUILDKITE_ANALYTICS_SHA"],
|
36
|
+
"number" => ENV["BUILDKITE_ANALYTICS_NUMBER"],
|
37
|
+
"job_id" => ENV["BUILDKITE_ANALYTICS_JOB_ID"],
|
38
|
+
"message" => ENV["BUILDKITE_ANANLYTICS_MESSAGE"],
|
39
|
+
"debug" => ENV["BUILDKITE_ANALYTICS_DEBUG_ENABLED"],
|
40
|
+
"version" => RSpec::Buildkite::Analytics::VERSION,
|
41
|
+
"collector" => RSpec::Buildkite::Analytics::NAME,
|
42
|
+
}.compact
|
43
|
+
end
|
44
|
+
|
45
|
+
def generic
|
46
|
+
{
|
47
|
+
"CI" => "generic",
|
48
|
+
"key" => SecureRandom.uuid,
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
def buildkite
|
53
|
+
{
|
54
|
+
"CI" => "buildkite",
|
55
|
+
"key" => ENV["BUILDKITE_BUILD_ID"],
|
56
|
+
"url" => ENV["BUILDKITE_BUILD_URL"],
|
57
|
+
"branch" => ENV["BUILDKITE_BRANCH"],
|
58
|
+
"commit_sha" => ENV["BUILDKITE_COMMIT"],
|
59
|
+
"number" => ENV["BUILDKITE_BUILD_NUMBER"],
|
60
|
+
"job_id" => ENV["BUILDKITE_JOB_ID"],
|
61
|
+
"message" => ENV["BUILDKITE_MESSAGE"],
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
def github_actions
|
66
|
+
{
|
67
|
+
"CI" => "github_actions",
|
68
|
+
"key" => "#{ENV["GITHUB_ACTION"]}-#{ENV["GITHUB_RUN_NUMBER"]}-#{ENV["GITHUB_RUN_ATTEMPT"]}",
|
69
|
+
"url" => File.join("https://github.com", ENV["GITHUB_REPOSITORY"], "actions/runs", ENV["GITHUB_RUN_ID"]),
|
70
|
+
"branch" => ENV["GITHUB_REF"],
|
71
|
+
"commit_sha" => ENV["GITHUB_SHA"],
|
72
|
+
"number" => ENV["GITHUB_RUN_NUMBER"],
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
def circleci
|
77
|
+
{
|
78
|
+
"CI" => "circleci",
|
79
|
+
"key" => "#{ENV["CIRCLE_WORKFLOW_ID"]}-#{ENV["CIRCLE_BUILD_NUM"]}",
|
80
|
+
"url" => ENV["CIRCLE_BUILD_URL"],
|
81
|
+
"branch" => ENV["CIRCLE_BRANCH"],
|
82
|
+
"commit_sha" => ENV["CIRCLE_SHA1"],
|
83
|
+
"number" => ENV["CIRCLE_BUILD_NUM"],
|
84
|
+
}
|
26
85
|
end
|
27
86
|
end
|
@@ -52,9 +52,22 @@ module RSpec::Buildkite::Analytics
|
|
52
52
|
|
53
53
|
@logger = Logger.new
|
54
54
|
|
55
|
-
|
56
|
-
|
57
|
-
|
55
|
+
reconnection_count = 0
|
56
|
+
|
57
|
+
begin
|
58
|
+
reconnection_count += 1
|
59
|
+
connect
|
60
|
+
rescue TimeoutError, InitialConnectionFailure => e
|
61
|
+
@logger.write("rspec-buildkite-analytics could not establish an initial connection with Buildkite due to #{e}. Attempting retry #{reconnection_count} of #{MAX_RECONNECTION_ATTEMPTS}...")
|
62
|
+
if reconnection_count > MAX_RECONNECTION_ATTEMPTS
|
63
|
+
$stderr.puts "rspec-buildkite-analytics 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."
|
64
|
+
else
|
65
|
+
sleep(WAIT_BETWEEN_RECONNECTIONS)
|
66
|
+
@logger.write("retrying reconnection")
|
67
|
+
retry
|
68
|
+
end
|
69
|
+
end
|
70
|
+
init_write_thread
|
58
71
|
end
|
59
72
|
|
60
73
|
def disconnected(connection)
|
@@ -76,7 +89,8 @@ module RSpec::Buildkite::Analytics
|
|
76
89
|
begin
|
77
90
|
reconnection_count += 1
|
78
91
|
connect
|
79
|
-
|
92
|
+
init_write_thread
|
93
|
+
rescue SocketConnection::HandshakeError, RejectedSubscription, TimeoutError, InitialConnectionFailure, SocketConnection::SocketError => e
|
80
94
|
@logger.write("failed reconnection attempt #{reconnection_count} due to #{e}")
|
81
95
|
if reconnection_count > MAX_RECONNECTION_ATTEMPTS
|
82
96
|
$stderr.puts "rspec-buildkite-analytics experienced a disconnection and could not reconnect to Buildkite due to #{e.message}. Please contact support."
|
@@ -170,8 +184,10 @@ module RSpec::Buildkite::Analytics
|
|
170
184
|
wait_for_confirm
|
171
185
|
|
172
186
|
@logger.write("connected")
|
187
|
+
end
|
173
188
|
|
174
|
-
|
189
|
+
def init_write_thread
|
190
|
+
# As this method can be called multiple times in the
|
175
191
|
# reconnection process, kill prev write threads (if any) before
|
176
192
|
# setting up the new one
|
177
193
|
@write_thread&.kill
|
@@ -42,7 +42,7 @@ module RSpec::Buildkite::Analytics
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def as_hash
|
45
|
-
|
45
|
+
strip_invalid_utf8_chars(
|
46
46
|
id: @id,
|
47
47
|
scope: example.example_group.metadata[:full_description],
|
48
48
|
name: example.description,
|
@@ -53,14 +53,14 @@ module RSpec::Buildkite::Analytics
|
|
53
53
|
failure_reason: failure_reason,
|
54
54
|
failure_expanded: failure_expanded,
|
55
55
|
history: history,
|
56
|
-
|
56
|
+
).with_indifferent_access.compact
|
57
57
|
end
|
58
58
|
|
59
59
|
private
|
60
60
|
|
61
61
|
def generate_file_name(example)
|
62
62
|
file_path_regex = /^(.*?\.(rb|feature))/
|
63
|
-
identifier_file_name = example.id[file_path_regex]
|
63
|
+
identifier_file_name = strip_invalid_utf8_chars(example.id)[file_path_regex]
|
64
64
|
location_file_name = example.location[file_path_regex]
|
65
65
|
|
66
66
|
if identifier_file_name != location_file_name
|
@@ -78,6 +78,18 @@ module RSpec::Buildkite::Analytics
|
|
78
78
|
identifier_file_name
|
79
79
|
end
|
80
80
|
end
|
81
|
+
|
82
|
+
def strip_invalid_utf8_chars(object)
|
83
|
+
if object.is_a?(Hash)
|
84
|
+
Hash[object.map { |key, value| [key, strip_invalid_utf8_chars(value)] }]
|
85
|
+
elsif object.is_a?(Array)
|
86
|
+
object.map { |value| strip_invalid_utf8_chars(value) }
|
87
|
+
elsif object.is_a?(String)
|
88
|
+
object.encode('UTF-8', :invalid => :replace, :undef => :replace)
|
89
|
+
else
|
90
|
+
object
|
91
|
+
end
|
92
|
+
end
|
81
93
|
end
|
82
94
|
|
83
95
|
def self.traces
|
@@ -125,6 +137,8 @@ module RSpec::Buildkite::Analytics
|
|
125
137
|
puts "Buildkite Test Analytics: Error communicating with the server: #{e.message}"
|
126
138
|
end
|
127
139
|
|
140
|
+
return unless response
|
141
|
+
|
128
142
|
case response.code
|
129
143
|
when "401"
|
130
144
|
puts "Buildkite Test Analytics: Invalid Suite API key. Please double check your Suite API key."
|
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
|
|
24
24
|
|
25
25
|
spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
|
26
26
|
|
27
|
-
spec.add_dependency "activesupport", ">= 5.2", "
|
27
|
+
spec.add_dependency "activesupport", ">= 5.2", "< 8"
|
28
28
|
spec.add_dependency "rspec-core", '~> 3.10'
|
29
29
|
spec.add_dependency "rspec-expectations", '~> 3.10'
|
30
30
|
spec.add_dependency "websocket", '~> 1.2'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-buildkite-analytics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Buildkite
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-04-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -17,9 +17,9 @@ dependencies:
|
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '5.2'
|
20
|
-
- - "
|
20
|
+
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
22
|
+
version: '8'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -27,9 +27,9 @@ dependencies:
|
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '5.2'
|
30
|
-
- - "
|
30
|
+
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
32
|
+
version: '8'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: rspec-core
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,6 +81,7 @@ extra_rdoc_files: []
|
|
81
81
|
files:
|
82
82
|
- ".gitignore"
|
83
83
|
- ".rspec"
|
84
|
+
- CHANGELOG.md
|
84
85
|
- Gemfile
|
85
86
|
- Gemfile.lock
|
86
87
|
- LICENSE.txt
|
@@ -121,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
121
122
|
- !ruby/object:Gem::Version
|
122
123
|
version: '0'
|
123
124
|
requirements: []
|
124
|
-
rubygems_version: 3.
|
125
|
+
rubygems_version: 3.3.3
|
125
126
|
signing_key:
|
126
127
|
specification_version: 4
|
127
128
|
summary: Track execution of specs and report to Buildkite Analytics
|