datadog-ci 1.8.1 → 1.10.0
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 +18 -2
- data/README.md +6 -8
- data/exe/ddcirb +3 -1
- data/lib/datadog/ci/auto_instrument.rb +8 -0
- data/lib/datadog/ci/cli/cli.rb +5 -1
- data/lib/datadog/ci/cli/command/exec.rb +29 -0
- data/lib/datadog/ci/configuration/settings.rb +3 -21
- data/lib/datadog/ci/contrib/ciqueue/integration.rb +34 -0
- data/lib/datadog/ci/contrib/ciqueue/patcher.rb +23 -0
- data/lib/datadog/ci/contrib/cucumber/formatter.rb +10 -5
- data/lib/datadog/ci/contrib/cucumber/integration.rb +5 -14
- data/lib/datadog/ci/contrib/cucumber/patcher.rb +2 -6
- data/lib/datadog/ci/contrib/instrumentation.rb +173 -0
- data/lib/datadog/ci/contrib/integration.rb +101 -117
- data/lib/datadog/ci/contrib/knapsack/extension.rb +27 -0
- data/lib/datadog/ci/contrib/knapsack/integration.rb +36 -0
- data/lib/datadog/ci/contrib/knapsack/patcher.rb +29 -0
- data/lib/datadog/ci/contrib/knapsack/runner.rb +66 -0
- data/lib/datadog/ci/contrib/minitest/integration.rb +6 -14
- data/lib/datadog/ci/contrib/minitest/patcher.rb +1 -5
- data/lib/datadog/ci/contrib/minitest/runner.rb +6 -1
- data/lib/datadog/ci/contrib/minitest/test.rb +6 -1
- data/lib/datadog/ci/contrib/patcher.rb +62 -0
- data/lib/datadog/ci/contrib/rspec/example.rb +64 -25
- data/lib/datadog/ci/contrib/rspec/example_group.rb +18 -1
- data/lib/datadog/ci/contrib/rspec/integration.rb +10 -13
- data/lib/datadog/ci/contrib/rspec/patcher.rb +2 -33
- data/lib/datadog/ci/contrib/rspec/runner.rb +6 -1
- data/lib/datadog/ci/contrib/selenium/capybara_driver.rb +1 -1
- data/lib/datadog/ci/contrib/selenium/driver.rb +1 -1
- data/lib/datadog/ci/contrib/selenium/integration.rb +6 -10
- data/lib/datadog/ci/contrib/selenium/navigation.rb +6 -2
- data/lib/datadog/ci/contrib/selenium/patcher.rb +2 -6
- data/lib/datadog/ci/contrib/selenium/rum.rb +0 -2
- data/lib/datadog/ci/contrib/simplecov/integration.rb +6 -10
- data/lib/datadog/ci/contrib/simplecov/patcher.rb +2 -6
- data/lib/datadog/ci/test.rb +8 -7
- data/lib/datadog/ci/test_optimisation/component.rb +9 -4
- data/lib/datadog/ci/test_retries/strategy/retry_new.rb +1 -1
- data/lib/datadog/ci/test_visibility/component.rb +2 -2
- data/lib/datadog/ci/test_visibility/telemetry.rb +2 -1
- data/lib/datadog/ci/version.rb +2 -2
- data/lib/datadog/ci.rb +9 -1
- metadata +13 -7
- data/lib/datadog/ci/contrib/contrib.rb +0 -31
- data/lib/datadog/ci/contrib/rspec/knapsack_pro/extension.rb +0 -29
- data/lib/datadog/ci/contrib/rspec/knapsack_pro/patcher.rb +0 -26
- data/lib/datadog/ci/contrib/rspec/knapsack_pro/runner.rb +0 -62
@@ -3,6 +3,7 @@
|
|
3
3
|
require_relative "../../ext/test"
|
4
4
|
require_relative "../../git/local_repository"
|
5
5
|
require_relative "../../utils/test_run"
|
6
|
+
require_relative "../instrumentation"
|
6
7
|
require_relative "ext"
|
7
8
|
|
8
9
|
module Datadog
|
@@ -20,42 +21,25 @@ module Datadog
|
|
20
21
|
return super if ::RSpec.configuration.dry_run? && !datadog_configuration[:dry_run_enabled]
|
21
22
|
return super unless datadog_configuration[:enabled]
|
22
23
|
|
23
|
-
|
24
|
-
if metadata[:description].empty?
|
25
|
-
# for unnamed it blocks this appends something like "example at ./spec/some_spec.rb:10"
|
26
|
-
test_name << " #{description}"
|
27
|
-
end
|
28
|
-
|
29
|
-
test_suite_description = fetch_top_level_example_group[:description]
|
30
|
-
suite_name = "#{test_suite_description} at #{metadata[:example_group][:rerun_file_path]}"
|
31
|
-
|
32
|
-
# remove example group description from test name to avoid duplication
|
33
|
-
test_name = test_name.sub(test_suite_description, "").strip
|
34
|
-
|
35
|
-
if ci_queue?
|
36
|
-
suite_name = "#{suite_name} (ci-queue running example [#{test_name}])"
|
37
|
-
ci_queue_test_span = test_visibility_component.start_test_suite(suite_name)
|
38
|
-
end
|
24
|
+
test_suite_span = test_visibility_component.start_test_suite(datadog_test_suite_name) if ci_queue?
|
39
25
|
|
40
26
|
# don't report test to RSpec::Core::Reporter until retries are done
|
41
27
|
@skip_reporting = true
|
42
28
|
|
43
29
|
test_retries_component.with_retries do
|
44
30
|
test_visibility_component.trace_test(
|
45
|
-
|
46
|
-
|
31
|
+
datadog_test_name,
|
32
|
+
datadog_test_suite_name,
|
47
33
|
tags: {
|
48
34
|
CI::Ext::Test::TAG_FRAMEWORK => Ext::FRAMEWORK,
|
49
|
-
CI::Ext::Test::TAG_FRAMEWORK_VERSION =>
|
35
|
+
CI::Ext::Test::TAG_FRAMEWORK_VERSION => datadog_integration.version.to_s,
|
50
36
|
CI::Ext::Test::TAG_SOURCE_FILE => Git::LocalRepository.relative_to_root(metadata[:file_path]),
|
51
37
|
CI::Ext::Test::TAG_SOURCE_START => metadata[:line_number].to_s,
|
52
|
-
CI::Ext::Test::TAG_PARAMETERS =>
|
53
|
-
metadata: {"scoped_id" => metadata[:scoped_id]}
|
54
|
-
)
|
38
|
+
CI::Ext::Test::TAG_PARAMETERS => datadog_test_parameters
|
55
39
|
},
|
56
40
|
service: datadog_configuration[:service_name]
|
57
41
|
) do |test_span|
|
58
|
-
test_span&.itr_unskippable! if
|
42
|
+
test_span&.itr_unskippable! if datadog_unskippable?
|
59
43
|
|
60
44
|
metadata[:skip] = CI::Ext::Test::ITR_TEST_SKIP_REASON if test_span&.skipped_by_itr?
|
61
45
|
|
@@ -86,8 +70,8 @@ module Datadog
|
|
86
70
|
end
|
87
71
|
end
|
88
72
|
|
89
|
-
# this is a special case for ci-queue, we need to finish the test suite span
|
90
|
-
|
73
|
+
# this is a special case for ci-queue, we need to finish the test suite span created for a single test
|
74
|
+
test_suite_span&.finish
|
91
75
|
|
92
76
|
# after retries are done, we can finally report the test to RSpec
|
93
77
|
@skip_reporting = false
|
@@ -105,6 +89,18 @@ module Datadog
|
|
105
89
|
super(::RSpec::Core::NullReporter)
|
106
90
|
end
|
107
91
|
|
92
|
+
def datadog_test_id
|
93
|
+
@datadog_test_id ||= Utils::TestRun.datadog_test_id(
|
94
|
+
datadog_test_name,
|
95
|
+
datadog_test_suite_name,
|
96
|
+
datadog_test_parameters
|
97
|
+
)
|
98
|
+
end
|
99
|
+
|
100
|
+
def datadog_unskippable?
|
101
|
+
!!metadata[CI::Ext::Test::ITR_UNSKIPPABLE_OPTION]
|
102
|
+
end
|
103
|
+
|
108
104
|
private
|
109
105
|
|
110
106
|
def fetch_top_level_example_group
|
@@ -120,10 +116,53 @@ module Datadog
|
|
120
116
|
res
|
121
117
|
end
|
122
118
|
|
119
|
+
def datadog_integration
|
120
|
+
CI::Contrib::Instrumentation.fetch_integration(:rspec)
|
121
|
+
end
|
122
|
+
|
123
123
|
def datadog_configuration
|
124
124
|
Datadog.configuration.ci[:rspec]
|
125
125
|
end
|
126
126
|
|
127
|
+
def datadog_test_suite_description
|
128
|
+
@datadog_test_suite_description ||= fetch_top_level_example_group[:description]
|
129
|
+
end
|
130
|
+
|
131
|
+
def datadog_test_name
|
132
|
+
return @datadog_test_name if defined?(@datadog_test_name)
|
133
|
+
|
134
|
+
test_name = full_description.strip
|
135
|
+
if metadata[:description].empty?
|
136
|
+
# for unnamed it blocks this appends something like "example at ./spec/some_spec.rb:10"
|
137
|
+
test_name << " #{description}"
|
138
|
+
end
|
139
|
+
|
140
|
+
# remove example group description from test name to avoid duplication
|
141
|
+
test_name = test_name.sub(datadog_test_suite_description, "").strip
|
142
|
+
|
143
|
+
@datadog_test_name = test_name
|
144
|
+
end
|
145
|
+
|
146
|
+
def datadog_test_suite_name
|
147
|
+
return @datadog_test_suite_name if defined?(@datadog_test_suite_name)
|
148
|
+
|
149
|
+
suite_name = "#{datadog_test_suite_description} at #{metadata[:example_group][:rerun_file_path]}"
|
150
|
+
|
151
|
+
if ci_queue?
|
152
|
+
suite_name = "#{suite_name} (ci-queue running example [#{datadog_test_name}])"
|
153
|
+
end
|
154
|
+
|
155
|
+
@datadog_test_suite_name = suite_name
|
156
|
+
end
|
157
|
+
|
158
|
+
def datadog_test_parameters
|
159
|
+
return @datadog_test_parameters if defined?(@datadog_test_parameters)
|
160
|
+
|
161
|
+
@datadog_test_parameters = Utils::TestRun.test_parameters(
|
162
|
+
metadata: {"scoped_id" => metadata[:scoped_id]}
|
163
|
+
)
|
164
|
+
end
|
165
|
+
|
127
166
|
def test_visibility_component
|
128
167
|
Datadog.send(:components).test_visibility
|
129
168
|
end
|
@@ -18,10 +18,17 @@ module Datadog
|
|
18
18
|
def run(reporter = ::RSpec::Core::NullReporter)
|
19
19
|
return super if ::RSpec.configuration.dry_run? && !datadog_configuration[:dry_run_enabled]
|
20
20
|
return super unless datadog_configuration[:enabled]
|
21
|
+
|
22
|
+
# skip the context hooks if all descendant example are going to be skipped
|
23
|
+
# IMPORTANT: must happen before top_level? check because skipping hooks must happen
|
24
|
+
# even if it is a nested context
|
25
|
+
metadata[:skip] = true if all_examples_skipped_by_datadog?
|
26
|
+
|
27
|
+
# return early because we create Datadog::CI::TestSuite only for top-level example groups
|
21
28
|
return super unless top_level?
|
22
29
|
|
23
30
|
suite_name = "#{description} at #{file_path}"
|
24
|
-
test_suite = test_visibility_component
|
31
|
+
test_suite = test_visibility_component&.start_test_suite(
|
25
32
|
suite_name,
|
26
33
|
tags: {
|
27
34
|
CI::Ext::Test::TAG_SOURCE_FILE => Git::LocalRepository.relative_to_root(metadata[:file_path]),
|
@@ -47,6 +54,12 @@ module Datadog
|
|
47
54
|
|
48
55
|
private
|
49
56
|
|
57
|
+
def all_examples_skipped_by_datadog?
|
58
|
+
descendant_filtered_examples.all? do |example|
|
59
|
+
!example.datadog_unskippable? && test_optimisation_component&.skippable?(example)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
50
63
|
def datadog_configuration
|
51
64
|
Datadog.configuration.ci[:rspec]
|
52
65
|
end
|
@@ -54,6 +67,10 @@ module Datadog
|
|
54
67
|
def test_visibility_component
|
55
68
|
Datadog.send(:components).test_visibility
|
56
69
|
end
|
70
|
+
|
71
|
+
def test_optimisation_component
|
72
|
+
Datadog.send(:components).test_optimisation
|
73
|
+
end
|
57
74
|
end
|
58
75
|
end
|
59
76
|
end
|
@@ -9,31 +9,28 @@ module Datadog
|
|
9
9
|
module Contrib
|
10
10
|
module RSpec
|
11
11
|
# Description of RSpec integration
|
12
|
-
class Integration
|
13
|
-
include Datadog::CI::Contrib::Integration
|
14
|
-
|
12
|
+
class Integration < Contrib::Integration
|
15
13
|
MINIMUM_VERSION = Gem::Version.new("3.0.0")
|
16
14
|
|
17
|
-
|
15
|
+
def dependants
|
16
|
+
%i[knapsack ciqueue]
|
17
|
+
end
|
18
18
|
|
19
|
-
def
|
19
|
+
def version
|
20
20
|
Gem.loaded_specs["rspec-core"]&.version
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
23
|
+
def loaded?
|
24
24
|
!defined?(::RSpec).nil? && !defined?(::RSpec::Core).nil? &&
|
25
|
-
!defined?(::RSpec::Core::Example).nil?
|
25
|
+
!defined?(::RSpec::Core::Example).nil? &&
|
26
|
+
!defined?(::RSpec::Core::Runner).nil? &&
|
27
|
+
!defined?(::RSpec::Core::ExampleGroup).nil?
|
26
28
|
end
|
27
29
|
|
28
|
-
def
|
30
|
+
def compatible?
|
29
31
|
super && version >= MINIMUM_VERSION
|
30
32
|
end
|
31
33
|
|
32
|
-
# test environments should not auto instrument test libraries
|
33
|
-
def auto_instrument?
|
34
|
-
false
|
35
|
-
end
|
36
|
-
|
37
34
|
def new_configuration
|
38
35
|
Configuration::Settings.new
|
39
36
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require_relative "../patcher"
|
4
4
|
|
5
5
|
require_relative "example"
|
6
6
|
require_relative "example_group"
|
@@ -12,46 +12,15 @@ module Datadog
|
|
12
12
|
module RSpec
|
13
13
|
# Patcher enables patching of 'rspec' module.
|
14
14
|
module Patcher
|
15
|
-
include Datadog::
|
15
|
+
include Datadog::CI::Contrib::Patcher
|
16
16
|
|
17
17
|
module_function
|
18
18
|
|
19
|
-
def target_version
|
20
|
-
Integration.version
|
21
|
-
end
|
22
|
-
|
23
19
|
def patch
|
24
|
-
# ci-queue test runner instrumentation
|
25
|
-
# https://github.com/Shopify/ci-queue
|
26
|
-
if ci_queue?
|
27
|
-
::RSpec::Queue::Runner.include(Runner)
|
28
|
-
end
|
29
|
-
|
30
|
-
if knapsack_pro?
|
31
|
-
# Knapsack Pro test runner instrumentation
|
32
|
-
# https://github.com/KnapsackPro/knapsack_pro-ruby
|
33
|
-
require_relative "knapsack_pro/patcher"
|
34
|
-
Datadog::CI::Contrib::RSpec::KnapsackPro::Patcher.patch
|
35
|
-
end
|
36
|
-
|
37
|
-
# default rspec test runner instrumentation
|
38
20
|
::RSpec::Core::Runner.include(Runner)
|
39
|
-
|
40
21
|
::RSpec::Core::Example.include(Example)
|
41
22
|
::RSpec::Core::ExampleGroup.include(ExampleGroup)
|
42
23
|
end
|
43
|
-
|
44
|
-
def ci_queue?
|
45
|
-
!!defined?(::RSpec::Queue::Runner)
|
46
|
-
end
|
47
|
-
|
48
|
-
def knapsack_pro?
|
49
|
-
knapsack_version = Gem.loaded_specs["knapsack_pro"]&.version
|
50
|
-
|
51
|
-
# additional instrumentation is needed for KnapsackPro version 7 and later
|
52
|
-
!!defined?(::KnapsackPro) &&
|
53
|
-
!knapsack_version.nil? && knapsack_version >= Gem::Version.new("7")
|
54
|
-
end
|
55
24
|
end
|
56
25
|
end
|
57
26
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative "../../ext/test"
|
4
|
+
require_relative "../instrumentation"
|
4
5
|
require_relative "ext"
|
5
6
|
|
6
7
|
module Datadog
|
@@ -21,7 +22,7 @@ module Datadog
|
|
21
22
|
test_session = test_visibility_component.start_test_session(
|
22
23
|
tags: {
|
23
24
|
CI::Ext::Test::TAG_FRAMEWORK => Ext::FRAMEWORK,
|
24
|
-
CI::Ext::Test::TAG_FRAMEWORK_VERSION =>
|
25
|
+
CI::Ext::Test::TAG_FRAMEWORK_VERSION => datadog_integration.version.to_s
|
25
26
|
},
|
26
27
|
service: datadog_configuration[:service_name],
|
27
28
|
total_tests_count: ::RSpec.world.example_count
|
@@ -47,6 +48,10 @@ module Datadog
|
|
47
48
|
|
48
49
|
private
|
49
50
|
|
51
|
+
def datadog_integration
|
52
|
+
CI::Contrib::Instrumentation.fetch_integration(:rspec)
|
53
|
+
end
|
54
|
+
|
50
55
|
def datadog_configuration
|
51
56
|
Datadog.configuration.ci[:rspec]
|
52
57
|
end
|
@@ -9,28 +9,24 @@ module Datadog
|
|
9
9
|
module Contrib
|
10
10
|
module Selenium
|
11
11
|
# Description of Selenium integration
|
12
|
-
class Integration
|
13
|
-
include Datadog::CI::Contrib::Integration
|
14
|
-
|
12
|
+
class Integration < Contrib::Integration
|
15
13
|
MINIMUM_VERSION = Gem::Version.new("4.0.0")
|
16
14
|
|
17
|
-
|
18
|
-
|
19
|
-
def self.version
|
15
|
+
def version
|
20
16
|
Gem.loaded_specs["selenium-webdriver"]&.version
|
21
17
|
end
|
22
18
|
|
23
|
-
def
|
19
|
+
def loaded?
|
24
20
|
!defined?(::Selenium).nil? && !defined?(::Selenium::WebDriver).nil? &&
|
25
21
|
!defined?(::Selenium::WebDriver::Driver).nil?
|
26
22
|
end
|
27
23
|
|
28
|
-
def
|
24
|
+
def compatible?
|
29
25
|
super && version >= MINIMUM_VERSION
|
30
26
|
end
|
31
27
|
|
32
|
-
# additional instrumentations for test
|
33
|
-
def
|
28
|
+
# additional instrumentations for test libraries are late instrumented on test session start
|
29
|
+
def late_instrument?
|
34
30
|
true
|
35
31
|
end
|
36
32
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require_relative "../patcher"
|
4
4
|
|
5
5
|
require_relative "ext"
|
6
6
|
require_relative "../../ext/test"
|
@@ -43,7 +43,7 @@ module Datadog
|
|
43
43
|
active_test.set_tag(CI::Ext::Test::TAG_BROWSER_DRIVER, "selenium")
|
44
44
|
active_test.set_tag(
|
45
45
|
CI::Ext::Test::TAG_BROWSER_DRIVER_VERSION,
|
46
|
-
|
46
|
+
datadog_integration.version
|
47
47
|
)
|
48
48
|
active_test.set_tag(
|
49
49
|
CI::Ext::Test::TAG_BROWSER_NAME,
|
@@ -63,6 +63,10 @@ module Datadog
|
|
63
63
|
|
64
64
|
private
|
65
65
|
|
66
|
+
def datadog_integration
|
67
|
+
CI::Contrib::Instrumentation.fetch_integration(:selenium)
|
68
|
+
end
|
69
|
+
|
66
70
|
def datadog_configuration
|
67
71
|
Datadog.configuration.ci[:selenium]
|
68
72
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require_relative "../patcher"
|
4
4
|
|
5
5
|
require_relative "capybara_driver"
|
6
6
|
require_relative "driver"
|
@@ -12,14 +12,10 @@ module Datadog
|
|
12
12
|
module Selenium
|
13
13
|
# Patcher enables patching of 'Selenium::WebDriver' module.
|
14
14
|
module Patcher
|
15
|
-
include Datadog::
|
15
|
+
include Datadog::CI::Contrib::Patcher
|
16
16
|
|
17
17
|
module_function
|
18
18
|
|
19
|
-
def target_version
|
20
|
-
Integration.version
|
21
|
-
end
|
22
|
-
|
23
19
|
def patch
|
24
20
|
::Selenium::WebDriver::Driver.include(Driver)
|
25
21
|
::Selenium::WebDriver::Navigation.include(Navigation)
|
@@ -9,27 +9,23 @@ module Datadog
|
|
9
9
|
module Contrib
|
10
10
|
module Simplecov
|
11
11
|
# Description of Simplecov integration
|
12
|
-
class Integration
|
13
|
-
include Datadog::CI::Contrib::Integration
|
14
|
-
|
12
|
+
class Integration < Contrib::Integration
|
15
13
|
MINIMUM_VERSION = Gem::Version.new("0.18.0")
|
16
14
|
|
17
|
-
|
18
|
-
|
19
|
-
def self.version
|
15
|
+
def version
|
20
16
|
Gem.loaded_specs["simplecov"]&.version
|
21
17
|
end
|
22
18
|
|
23
|
-
def
|
19
|
+
def loaded?
|
24
20
|
!defined?(::SimpleCov).nil?
|
25
21
|
end
|
26
22
|
|
27
|
-
def
|
23
|
+
def compatible?
|
28
24
|
super && version >= MINIMUM_VERSION
|
29
25
|
end
|
30
26
|
|
31
|
-
# additional instrumentations for test
|
32
|
-
def
|
27
|
+
# additional instrumentations for test libraries are late instrumented on test session start
|
28
|
+
def late_instrument?
|
33
29
|
true
|
34
30
|
end
|
35
31
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require_relative "../patcher"
|
4
4
|
|
5
5
|
require_relative "result_extractor"
|
6
6
|
|
@@ -10,14 +10,10 @@ module Datadog
|
|
10
10
|
module Simplecov
|
11
11
|
# Patcher enables patching of 'SimpleCov' module.
|
12
12
|
module Patcher
|
13
|
-
include Datadog::
|
13
|
+
include Datadog::CI::Contrib::Patcher
|
14
14
|
|
15
15
|
module_function
|
16
16
|
|
17
|
-
def target_version
|
18
|
-
Integration.version
|
19
|
-
end
|
20
|
-
|
21
17
|
def patch
|
22
18
|
::SimpleCov.include(ResultExtractor)
|
23
19
|
end
|
data/lib/datadog/ci/test.rb
CHANGED
@@ -17,6 +17,11 @@ module Datadog
|
|
17
17
|
get_tag(Ext::Test::TAG_NAME)
|
18
18
|
end
|
19
19
|
|
20
|
+
# @return [String] the test id according to Datadog's test impact analysis.
|
21
|
+
def datadog_test_id
|
22
|
+
@datadog_test_id ||= Utils::TestRun.datadog_test_id(name, test_suite_name, parameters)
|
23
|
+
end
|
24
|
+
|
20
25
|
# Finishes the current test.
|
21
26
|
# @return [void]
|
22
27
|
def finish
|
@@ -140,22 +145,18 @@ module Datadog
|
|
140
145
|
|
141
146
|
# @internal
|
142
147
|
def any_retry_passed?
|
143
|
-
!!test_suite&.any_test_retry_passed?(
|
148
|
+
!!test_suite&.any_test_retry_passed?(datadog_test_id)
|
144
149
|
end
|
145
150
|
|
146
151
|
private
|
147
152
|
|
148
|
-
def test_id
|
149
|
-
@test_id ||= Utils::TestRun.datadog_test_id(name, test_suite_name, parameters)
|
150
|
-
end
|
151
|
-
|
152
153
|
def record_test_result(datadog_status)
|
153
154
|
# if this test was already executed in this test suite, mark it as retried
|
154
|
-
if test_suite&.test_executed?(
|
155
|
+
if test_suite&.test_executed?(datadog_test_id)
|
155
156
|
set_tag(Ext::Test::TAG_IS_RETRY, "true")
|
156
157
|
end
|
157
158
|
|
158
|
-
test_suite&.record_test_result(
|
159
|
+
test_suite&.record_test_result(datadog_test_id, datadog_status)
|
159
160
|
end
|
160
161
|
end
|
161
162
|
end
|
@@ -144,11 +144,16 @@ module Datadog
|
|
144
144
|
event
|
145
145
|
end
|
146
146
|
|
147
|
+
def skippable?(test)
|
148
|
+
return false if !enabled? || !skipping_tests?
|
149
|
+
|
150
|
+
@skippable_tests.include?(test.datadog_test_id)
|
151
|
+
end
|
152
|
+
|
147
153
|
def mark_if_skippable(test)
|
148
154
|
return if !enabled? || !skipping_tests?
|
149
155
|
|
150
|
-
|
151
|
-
if @skippable_tests.include?(datadog_test_id)
|
156
|
+
if skippable?(test)
|
152
157
|
if forked?
|
153
158
|
Datadog.logger.warn { "Intelligent test runner is not supported for forking test runners yet" }
|
154
159
|
return
|
@@ -156,9 +161,9 @@ module Datadog
|
|
156
161
|
|
157
162
|
test.set_tag(Ext::Test::TAG_ITR_SKIPPED_BY_ITR, "true")
|
158
163
|
|
159
|
-
Datadog.logger.debug { "Marked test as skippable: #{datadog_test_id}" }
|
164
|
+
Datadog.logger.debug { "Marked test as skippable: #{test.datadog_test_id}" }
|
160
165
|
else
|
161
|
-
Datadog.logger.debug { "Test is not skippable: #{datadog_test_id}" }
|
166
|
+
Datadog.logger.debug { "Test is not skippable: #{test.datadog_test_id}" }
|
162
167
|
end
|
163
168
|
end
|
164
169
|
|
@@ -101,7 +101,7 @@ module Datadog
|
|
101
101
|
end
|
102
102
|
@total_limit = (tests_count * percentage_limit / 100.0).ceil
|
103
103
|
Datadog.logger.debug do
|
104
|
-
"Retry new tests total limit is [#{@total_limit}] (#{percentage_limit}%
|
104
|
+
"Retry new tests total limit is [#{@total_limit}] (#{percentage_limit}% of #{tests_count})"
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
@@ -7,7 +7,7 @@ require_relative "telemetry"
|
|
7
7
|
require_relative "total_coverage"
|
8
8
|
|
9
9
|
require_relative "../codeowners/parser"
|
10
|
-
require_relative "../contrib/
|
10
|
+
require_relative "../contrib/instrumentation"
|
11
11
|
require_relative "../ext/test"
|
12
12
|
require_relative "../git/local_repository"
|
13
13
|
|
@@ -149,7 +149,7 @@ module Datadog
|
|
149
149
|
git_tree_upload_worker.perform(test_session.git_repository_url)
|
150
150
|
|
151
151
|
# finds and instruments additional test libraries that we support (ex: selenium-webdriver)
|
152
|
-
Contrib.
|
152
|
+
Contrib::Instrumentation.instrument_on_session_start
|
153
153
|
|
154
154
|
# sends internal telemetry events
|
155
155
|
Telemetry.test_session_started(test_session)
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative "../contrib/instrumentation"
|
3
4
|
require_relative "../ext/app_types"
|
4
5
|
require_relative "../ext/environment"
|
5
6
|
require_relative "../ext/telemetry"
|
@@ -33,7 +34,7 @@ module Datadog
|
|
33
34
|
Ext::Telemetry::METRIC_TEST_SESSION,
|
34
35
|
1,
|
35
36
|
{
|
36
|
-
Ext::Telemetry::TAG_AUTO_INJECTED =>
|
37
|
+
Ext::Telemetry::TAG_AUTO_INJECTED => Contrib::Instrumentation.auto_instrumented?.to_s,
|
37
38
|
Ext::Telemetry::TAG_PROVIDER => test_session.ci_provider || Ext::Telemetry::Provider::UNSUPPORTED
|
38
39
|
}
|
39
40
|
)
|
data/lib/datadog/ci/version.rb
CHANGED
data/lib/datadog/ci.rb
CHANGED
@@ -406,9 +406,17 @@ module Datadog
|
|
406
406
|
end
|
407
407
|
|
408
408
|
# Integrations
|
409
|
+
|
410
|
+
# Test frameworks (manual instrumentation)
|
409
411
|
require_relative "ci/contrib/cucumber/integration"
|
410
|
-
require_relative "ci/contrib/rspec/integration"
|
411
412
|
require_relative "ci/contrib/minitest/integration"
|
413
|
+
require_relative "ci/contrib/rspec/integration"
|
414
|
+
|
415
|
+
# Test runners (instrumented automatically when corresponding frameworks are instrumented)
|
416
|
+
require_relative "ci/contrib/knapsack/integration"
|
417
|
+
require_relative "ci/contrib/ciqueue/integration"
|
418
|
+
|
419
|
+
# Additional test libraries (auto instrumented later on test session start)
|
412
420
|
require_relative "ci/contrib/selenium/integration"
|
413
421
|
require_relative "ci/contrib/simplecov/integration"
|
414
422
|
|