datadog-ci 1.9.0 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7641cbd9b01a787badb9bab7d3aa74933c99b750b46609c9a625ed3f7daaa11c
4
- data.tar.gz: 5489c728c4b6c91ff68b515796533801b02dfb623f506da23849e60e343063a3
3
+ metadata.gz: 651794a9813c4b1b10909b0de41e4d25f90b95736815894f83356e03f9fa86d5
4
+ data.tar.gz: 1f8c32423bb4527c7faf6232acf842fcc6c3db404baf1e836e0d57bbd57a7d93
5
5
  SHA512:
6
- metadata.gz: 3d2f41e5eb8f58c3eecb72200658add1799109c7778fad032c6d58ec2fd462a37df7e1a47edfb6cf7390e037c4e30ada85dc95c71983c30629de38b2bf62fd35
7
- data.tar.gz: 408151cc04150bcc8ec2a0933c0f6d38cd1362b5842e8b145960ba276431681893988cfd0c49ce47f519ae9e7451549b45503a6ea79f123cfd4cc3750cb2a8ea
6
+ metadata.gz: 1c81e9f43de5457aa57aacfbacf2d432c47e0e8f9de68477d45ea9e20da3773687a0d85e79df51e73ce2c133c6e8432c9f8f9a83c35c65d0fe0f587e58968857
7
+ data.tar.gz: c37907789e0c3f0bbd9cc283d245f8be60d90c0c888bd707db7119b0e36375d3ae10227a7d08d43d448d2af6d42e339ffd4bdfce479028aef1e3b3de1549870b
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [1.10.0] - 2024-12-05
4
+
5
+ ### Added
6
+
7
+ * Skip before(:all) context hooks when all examples are skipped ([#262][])
8
+
3
9
  ## [1.9.0] - 2024-11-26
4
10
 
5
11
  ### Added
@@ -362,7 +368,8 @@ Currently test suite level visibility is not used by our instrumentation: it wil
362
368
 
363
369
  - Ruby versions < 2.7 no longer supported ([#8][])
364
370
 
365
- [Unreleased]: https://github.com/DataDog/datadog-ci-rb/compare/v1.9.0...main
371
+ [Unreleased]: https://github.com/DataDog/datadog-ci-rb/compare/v1.10.0...main
372
+ [1.10.0]: https://github.com/DataDog/datadog-ci-rb/compare/v1.9.0...v1.10.0
366
373
  [1.9.0]: https://github.com/DataDog/datadog-ci-rb/compare/v1.8.1...v1.9.0
367
374
  [1.8.1]: https://github.com/DataDog/datadog-ci-rb/compare/v1.8.0...v1.8.1
368
375
  [1.8.0]: https://github.com/DataDog/datadog-ci-rb/compare/v1.7.0...v1.8.0
@@ -521,4 +528,5 @@ Currently test suite level visibility is not used by our instrumentation: it wil
521
528
  [#244]: https://github.com/DataDog/datadog-ci-rb/issues/244
522
529
  [#248]: https://github.com/DataDog/datadog-ci-rb/issues/248
523
530
  [#250]: https://github.com/DataDog/datadog-ci-rb/issues/250
524
- [#259]: https://github.com/DataDog/datadog-ci-rb/issues/259
531
+ [#259]: https://github.com/DataDog/datadog-ci-rb/issues/259
532
+ [#262]: https://github.com/DataDog/datadog-ci-rb/issues/262
@@ -21,42 +21,25 @@ module Datadog
21
21
  return super if ::RSpec.configuration.dry_run? && !datadog_configuration[:dry_run_enabled]
22
22
  return super unless datadog_configuration[:enabled]
23
23
 
24
- test_name = full_description.strip
25
- if metadata[:description].empty?
26
- # for unnamed it blocks this appends something like "example at ./spec/some_spec.rb:10"
27
- test_name << " #{description}"
28
- end
29
-
30
- test_suite_description = fetch_top_level_example_group[:description]
31
- suite_name = "#{test_suite_description} at #{metadata[:example_group][:rerun_file_path]}"
32
-
33
- # remove example group description from test name to avoid duplication
34
- test_name = test_name.sub(test_suite_description, "").strip
35
-
36
- if ci_queue?
37
- suite_name = "#{suite_name} (ci-queue running example [#{test_name}])"
38
- ci_queue_test_span = test_visibility_component.start_test_suite(suite_name)
39
- end
24
+ test_suite_span = test_visibility_component.start_test_suite(datadog_test_suite_name) if ci_queue?
40
25
 
41
26
  # don't report test to RSpec::Core::Reporter until retries are done
42
27
  @skip_reporting = true
43
28
 
44
29
  test_retries_component.with_retries do
45
30
  test_visibility_component.trace_test(
46
- test_name,
47
- suite_name,
31
+ datadog_test_name,
32
+ datadog_test_suite_name,
48
33
  tags: {
49
34
  CI::Ext::Test::TAG_FRAMEWORK => Ext::FRAMEWORK,
50
35
  CI::Ext::Test::TAG_FRAMEWORK_VERSION => datadog_integration.version.to_s,
51
36
  CI::Ext::Test::TAG_SOURCE_FILE => Git::LocalRepository.relative_to_root(metadata[:file_path]),
52
37
  CI::Ext::Test::TAG_SOURCE_START => metadata[:line_number].to_s,
53
- CI::Ext::Test::TAG_PARAMETERS => Utils::TestRun.test_parameters(
54
- metadata: {"scoped_id" => metadata[:scoped_id]}
55
- )
38
+ CI::Ext::Test::TAG_PARAMETERS => datadog_test_parameters
56
39
  },
57
40
  service: datadog_configuration[:service_name]
58
41
  ) do |test_span|
59
- test_span&.itr_unskippable! if metadata[CI::Ext::Test::ITR_UNSKIPPABLE_OPTION]
42
+ test_span&.itr_unskippable! if datadog_unskippable?
60
43
 
61
44
  metadata[:skip] = CI::Ext::Test::ITR_TEST_SKIP_REASON if test_span&.skipped_by_itr?
62
45
 
@@ -87,8 +70,8 @@ module Datadog
87
70
  end
88
71
  end
89
72
 
90
- # this is a special case for ci-queue, we need to finish the test suite span
91
- ci_queue_test_span&.finish
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
92
75
 
93
76
  # after retries are done, we can finally report the test to RSpec
94
77
  @skip_reporting = false
@@ -106,6 +89,18 @@ module Datadog
106
89
  super(::RSpec::Core::NullReporter)
107
90
  end
108
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
+
109
104
  private
110
105
 
111
106
  def fetch_top_level_example_group
@@ -129,6 +124,45 @@ module Datadog
129
124
  Datadog.configuration.ci[:rspec]
130
125
  end
131
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
+
132
166
  def test_visibility_component
133
167
  Datadog.send(:components).test_visibility
134
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.start_test_suite(
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
@@ -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?(test_id)
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?(test_id)
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(test_id, datadog_status)
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
- datadog_test_id = Utils::TestRun.datadog_test_id(test.name, test.test_suite_name, test.parameters)
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
 
@@ -4,7 +4,7 @@ module Datadog
4
4
  module CI
5
5
  module VERSION
6
6
  MAJOR = 1
7
- MINOR = 9
7
+ MINOR = 10
8
8
  PATCH = 0
9
9
  PRE = nil
10
10
  BUILD = nil
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datadog-ci
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.0
4
+ version: 1.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Datadog, Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-11-26 00:00:00.000000000 Z
11
+ date: 2024-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: datadog