datadog-ci 1.0.0.beta2 → 1.0.0.beta4

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.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +106 -72
  3. data/ext/datadog_cov/datadog_cov.c +36 -10
  4. data/lib/datadog/ci/configuration/components.rb +21 -2
  5. data/lib/datadog/ci/configuration/settings.rb +9 -3
  6. data/lib/datadog/ci/contrib/cucumber/formatter.rb +4 -1
  7. data/lib/datadog/ci/contrib/minitest/patcher.rb +2 -2
  8. data/lib/datadog/ci/contrib/minitest/test.rb +105 -0
  9. data/lib/datadog/ci/contrib/rspec/example.rb +2 -0
  10. data/lib/datadog/ci/contrib/rspec/knapsack_pro/extension.rb +30 -0
  11. data/lib/datadog/ci/contrib/rspec/knapsack_pro/runner.rb +57 -0
  12. data/lib/datadog/ci/contrib/rspec/patcher.rb +17 -1
  13. data/lib/datadog/ci/ext/environment.rb +5 -0
  14. data/lib/datadog/ci/ext/settings.rb +1 -0
  15. data/lib/datadog/ci/ext/test.rb +3 -1
  16. data/lib/datadog/ci/itr/coverage/writer.rb +7 -1
  17. data/lib/datadog/ci/itr/runner.rb +30 -6
  18. data/lib/datadog/ci/itr/skippable.rb +4 -2
  19. data/lib/datadog/ci/span.rb +7 -0
  20. data/lib/datadog/ci/test.rb +18 -0
  21. data/lib/datadog/ci/test_visibility/serializers/base.rb +3 -2
  22. data/lib/datadog/ci/test_visibility/serializers/factories/test_level.rb +3 -3
  23. data/lib/datadog/ci/test_visibility/serializers/factories/test_suite_level.rb +6 -6
  24. data/lib/datadog/ci/test_visibility/serializers/test_v2.rb +14 -2
  25. data/lib/datadog/ci/test_visibility/transport.rb +5 -1
  26. data/lib/datadog/ci/transport/remote_settings_api.rb +4 -2
  27. data/lib/datadog/ci/utils/bundle.rb +26 -0
  28. data/lib/datadog/ci/utils/test_run.rb +12 -0
  29. data/lib/datadog/ci/version.rb +1 -1
  30. metadata +10 -7
  31. data/lib/datadog/ci/contrib/minitest/hooks.rb +0 -77
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6b3e03ab226d98aac3dd518b1c554452a4c3812cb67e9a1d64762e2fe8767633
4
- data.tar.gz: eac352d2b2488d16f979004f617097efe109364069f1c7b78cecfceef5365efa
3
+ metadata.gz: 035d75d50e0e09c7895bc0e434c5ac1e0655618763ac724a94989833e0c07d61
4
+ data.tar.gz: bfbd5d6ff101ef51e59d3546d110f906f178c23602241f85b3a8b413524a9900
5
5
  SHA512:
6
- metadata.gz: c56ab91025f2a224e86bd732a5c891e961af184b29618241f8853756780ccba894c11955b00020a70139d72e47f57d22dfdf1f2ed6437f1d4e4a9d998453d7a4
7
- data.tar.gz: e7c1aa73096d8d8b49800bbed168f288b7676d8fa328011c3e9c4f7024c86c17cf2c210a94a64dcd80f94121a80b36a824f0ca4e3aa6ccb1c35f682a1fb9e18b
6
+ metadata.gz: c1b6463b913cbff1e20a2c3f4fcaa6c47814ba693eee5682fa41c3baa74f9e92414b4e554ec8407807d6eeb1744f0c76d87bb0889bd0e639c6ebdc3de1dcd180
7
+ data.tar.gz: dca4568f30dbaef22e8fac94389e682beb21ba6f92f0578553ff01d2ad289f38d33f899c79bef604f3f83906d6c31b9e64a9495cc3dc986fb321bd810430780d
data/CHANGELOG.md CHANGED
@@ -1,117 +1,141 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [1.0.0.beta4] - 2024-05-14
4
+
5
+ ### Added
6
+
7
+ * Knapsack Pro 7/RSpec 3 support ([#172][])
8
+ * add settings option to ignore code coverage for bundled gems location ([#174][])
9
+ * log an error message if tracing is disabled but test visibility is enabled ([#175][])
10
+
11
+ ### Removed
12
+
13
+ * remove deprecated use alias ([#173][])
14
+
15
+ ## [1.0.0.beta3] - 2024-04-30
16
+
17
+ ### Added
18
+
19
+ - "why this test was skipped" feature ([#165])
20
+ - custom configurations tags support for ITR ([#166])
21
+ - unskippable tests for ITR ([#167])
22
+
23
+ ### Changed
24
+
25
+ - additional debug logging, do not skip tests when running in forked processes ([#168])
26
+
3
27
  ## [1.0.0.beta2] - 2024-04-23
4
28
 
5
29
  ### Added
6
30
 
7
- * Code coverage events writer ([#150])
8
- * Git tree upload - git command line integration ([#151])
9
- * Add Git::SearchCommits api client ([#152])
10
- * Upload packfiles API client ([#153])
11
- * Git tree uploader ([#154])
12
- * Git repository unshallowing logic ([#155])
13
- * Git upload async worker ([#156])
14
- * Reduce ITR-induced code coverage overhead for default branch ([#157])
15
- * Skippable tests api client ([#158])
16
- * Request skippable tests when configuring ITR ([#159])
17
- * Test skipping implementation ([#160])
31
+ - Code coverage events writer ([#150])
32
+ - Git tree upload - git command line integration ([#151])
33
+ - Add Git::SearchCommits api client ([#152])
34
+ - Upload packfiles API client ([#153])
35
+ - Git tree uploader ([#154])
36
+ - Git repository unshallowing logic ([#155])
37
+ - Git upload async worker ([#156])
38
+ - Reduce ITR-induced code coverage overhead for default branch ([#157])
39
+ - Skippable tests api client ([#158])
40
+ - Request skippable tests when configuring ITR ([#159])
41
+ - Test skipping implementation ([#160])
18
42
 
19
43
  ## [1.0.0.beta1] - 2024-03-25
20
44
 
21
45
  ### Added
22
46
 
23
- * datadog-cov native extension for per test code coverage ([#137])
24
- * citestcov transport to serialize and send code coverage events ([#148])
47
+ - datadog-cov native extension for per test code coverage ([#137])
48
+ - citestcov transport to serialize and send code coverage events ([#148])
25
49
 
26
50
  ### Removed
27
51
 
28
- * Ruby 2.1-2.6 support is dropped
52
+ - Ruby 2.1-2.6 support is dropped
29
53
 
30
54
  ## [0.8.3] - 2024-03-20
31
55
 
32
56
  ### Fixed
33
57
 
34
- * fix: cucumber-ruby 9.2 includes breaking change for Cucumber::Core::Test::Result ([#145][])
58
+ - fix: cucumber-ruby 9.2 includes breaking change for Cucumber::Core::Test::Result ([#145][])
35
59
 
36
60
  ### Changed
37
61
 
38
- * remove temporary hack and use Core::Remote::Negotiation's new constructor param ([#142][])
39
- * use filter_basic_auth method from Datadog::Core ([#141][])
62
+ - remove temporary hack and use Core::Remote::Negotiation's new constructor param ([#142][])
63
+ - use filter_basic_auth method from Datadog::Core ([#141][])
40
64
 
41
65
  ## [0.8.2] - 2024-03-19
42
66
 
43
67
  ### Fixed
44
68
 
45
- * assign the single running test suite for a test if none found by test suite name ([#139][])
69
+ - assign the single running test suite for a test if none found by test suite name ([#139][])
46
70
 
47
71
  ## [0.8.1] - 2024-03-12
48
72
 
49
73
  ### Fixed
50
74
 
51
- * fix minitest instrumentation with mixins ([#134][])
75
+ - fix minitest instrumentation with mixins ([#134][])
52
76
 
53
77
  ## [0.8.0] - 2024-03-08
54
78
 
55
79
  ### Added
56
80
 
57
- * gzip agent payloads support via evp_proxy/v4 ([#123][])
81
+ - gzip agent payloads support via evp_proxy/v4 ([#123][])
58
82
 
59
83
  ### Changed
60
84
 
61
- * Add note to README on using VCR ([#122][])
85
+ - Add note to README on using VCR ([#122][])
62
86
 
63
87
  ### Fixed
64
88
 
65
- * use framework name as test module name to make test fingerprints stable ([#131][])
89
+ - use framework name as test module name to make test fingerprints stable ([#131][])
66
90
 
67
91
  ## [0.7.0] - 2024-01-26
68
92
 
69
93
  ### Added
70
94
 
71
- * Source code integration ([#95][])
72
- * CODEOWNERS support ([#98][])
73
- * Cucumber scenarios with examples are treated as parametrized tests ([#100][])
74
- * Deduplicate dynamically generated RSpec examples using test.parameters ([#101][])
75
- * Repository name is used as default test service name ([#104][])
76
- * Cucumber v9 support ([#99][])
77
- * ci-queue runner support for minitest ([#110][])
78
- * ci-queue support for rspec ([#112][])
95
+ - Source code integration ([#95][])
96
+ - CODEOWNERS support ([#98][])
97
+ - Cucumber scenarios with examples are treated as parametrized tests ([#100][])
98
+ - Deduplicate dynamically generated RSpec examples using test.parameters ([#101][])
99
+ - Repository name is used as default test service name ([#104][])
100
+ - Cucumber v9 support ([#99][])
101
+ - ci-queue runner support for minitest ([#110][])
102
+ - ci-queue support for rspec ([#112][])
79
103
 
80
104
  ### Fixed
81
105
 
82
- * do not publish sig folder when publishing this gem to prevent steep errors in client applications ([#114][])
83
- * minitest: fix rails parallel test runner ([#115][])
84
- * Test suites and tests skipped by frameworks are correctly reported as skipped to Datadog ([#113][])
106
+ - do not publish sig folder when publishing this gem to prevent steep errors in client applications ([#114][])
107
+ - minitest: fix rails parallel test runner ([#115][])
108
+ - Test suites and tests skipped by frameworks are correctly reported as skipped to Datadog ([#113][])
85
109
 
86
110
  ### Changed
87
111
 
88
- * Enable test suite level visibility by default (with killswitch) ([#109][])
89
- * Test suite names are more human-readable now ([#105][])
90
- * Remove span_type method in tracer-related models ([#107][])
91
- * Manual tracing API: convert type parameter to keyword in Datadog::CI.trace, remove internal-only methods from public API ([#108][])
112
+ - Enable test suite level visibility by default (with killswitch) ([#109][])
113
+ - Test suite names are more human-readable now ([#105][])
114
+ - Remove span_type method in tracer-related models ([#107][])
115
+ - Manual tracing API: convert type parameter to keyword in Datadog::CI.trace, remove internal-only methods from public API ([#108][])
92
116
 
93
117
  ## [0.6.0] - 2024-01-03
94
118
 
95
119
  ### Added
96
120
 
97
- * Test suite level visibility instrumentation for RSpec ([#86][])
98
- * Test suite level visibility instrumentation for Cucumber ([#90][])
99
- * Test suite level visibility instrumentation for Minitest framework ([#92][])
121
+ - Test suite level visibility instrumentation for RSpec ([#86][])
122
+ - Test suite level visibility instrumentation for Cucumber ([#90][])
123
+ - Test suite level visibility instrumentation for Minitest framework ([#92][])
100
124
 
101
125
  ### Fixed
102
126
 
103
- * Do not instantiate TestVisibility::Recorder unless CI visibility is enabled ([#89][])
127
+ - Do not instantiate TestVisibility::Recorder unless CI visibility is enabled ([#89][])
104
128
 
105
129
  ## [0.5.1] - 2023-12-11
106
130
 
107
131
  ### Fixed
108
132
 
109
- * do not collect environment tags when CI is not enabled ([#87][])
133
+ - do not collect environment tags when CI is not enabled ([#87][])
110
134
 
111
135
  ### Changed
112
136
 
113
- * Move private classes and modules deeper in module hierarchy ([#85][])
114
- * update appraisal dependencies ([#84][])
137
+ - Move private classes and modules deeper in module hierarchy ([#85][])
138
+ - update appraisal dependencies ([#84][])
115
139
 
116
140
  ## [0.5.0] - 2023-12-06
117
141
 
@@ -123,98 +147,100 @@ Currently test suite level visibility is not used by our instrumentation: it wil
123
147
 
124
148
  ### Added
125
149
 
126
- * Test suite level visibility: add test session public API ([#72][])
127
- * Test suite level visibility: test module support ([#76][])
128
- * Test suite level visibility: test suites support ([#77][])
129
- * add YARD documentation ([#82][])
130
- * support validation errors for CI spans ([#78][])
150
+ - Test suite level visibility: add test session public API ([#72][])
151
+ - Test suite level visibility: test module support ([#76][])
152
+ - Test suite level visibility: test suites support ([#77][])
153
+ - add YARD documentation ([#82][])
154
+ - support validation errors for CI spans ([#78][])
131
155
 
132
156
  ### Changed
133
157
 
134
- * Validate DD_SITE variable ([#79][])
135
- * Document how to use WebMock with datadog-ci ([#80][])
158
+ - Validate DD_SITE variable ([#79][])
159
+ - Document how to use WebMock with datadog-ci ([#80][])
136
160
 
137
161
  ### Fixed
138
162
 
139
- * Datadog::CI.trace_test always starts a new trace ([#74][])
140
- * Skip tracing when CI mode disabled and manual API is used ([#75][])
163
+ - Datadog::CI.trace_test always starts a new trace ([#74][])
164
+ - Skip tracing when CI mode disabled and manual API is used ([#75][])
141
165
 
142
166
  ### Removed
143
167
 
144
- * Deprecate operation name setting, change service_name to service in public API ([#81][])
168
+ - Deprecate operation name setting, change service_name to service in public API ([#81][])
145
169
 
146
170
  ## [0.4.1] - 2023-11-22
147
171
 
148
172
  ### Fixed
149
173
 
150
- * disable 128-bit trace id generation in CI mode ([#70][])
174
+ - disable 128-bit trace id generation in CI mode ([#70][])
151
175
 
152
176
  ## [0.4.0] - 2023-11-21
153
177
 
154
178
  ### Added
155
179
 
156
- * Public API for manual test instrumentation ([#64][]) ([#61][])
180
+ - Public API for manual test instrumentation ([#64][]) ([#61][])
157
181
 
158
182
  ### Changed
159
183
 
160
- * fix tracing instrumentation example in readme ([#60][])
184
+ - fix tracing instrumentation example in readme ([#60][])
161
185
 
162
186
  ### Fixed
163
187
 
164
- * Remove user credentials from ssh URLs and from GITHUB_REPO_URL environment variable ([#66][])
188
+ - Remove user credentials from ssh URLs and from GITHUB_REPO_URL environment variable ([#66][])
165
189
 
166
190
  ### Removed
167
191
 
168
- * Remove _dd.measured tag from spans ([#65][])
192
+ - Remove _dd.measured tag from spans ([#65][])
169
193
 
170
194
  ## [0.3.0] - 2023-10-25
171
195
 
172
196
  ### Added
173
197
 
174
- * Add AWS CodePipeline support for automatic CI tags extraction ([#54][])
175
- * Support test visibility protocol via Datadog Agent with EVP proxy ([#51][])
198
+ - Add AWS CodePipeline support for automatic CI tags extraction ([#54][])
199
+ - Support test visibility protocol via Datadog Agent with EVP proxy ([#51][])
176
200
 
177
201
  ### Changed
178
202
 
179
- * Migrate to Net::HTTP adapter from Core module of ddtrace gem ([#49][])
203
+ - Migrate to Net::HTTP adapter from Core module of ddtrace gem ([#49][])
180
204
 
181
205
  ## [0.2.0] - 2023-10-05
182
206
 
183
207
  ### Added
184
208
 
185
- * [CIAPP-2959] Agentless mode ([#33][])
209
+ - [CIAPP-2959] Agentless mode ([#33][])
186
210
 
187
211
  ### Fixed
188
212
 
189
- * [CIAPP-4278] Fix an issue with emojis in commit message breaking LocalGit tags provider ([#40][])
213
+ - [CIAPP-4278] Fix an issue with emojis in commit message breaking LocalGit tags provider ([#40][])
190
214
 
191
215
  ## [0.1.1] - 2023-09-14
192
216
 
193
217
  ### Fixed
194
218
 
195
- * Fix circular dependencies warnings ([#31][])
219
+ - Fix circular dependencies warnings ([#31][])
196
220
 
197
221
  ## 0.1.0 - 2023-09-12
198
222
 
199
223
  ### Added
200
224
 
201
- * Add cucumber 8.0.0 support ([#7][])
202
- * Docs: contribution documentation ([#14][], [#28][])
203
- * Dev process: issue templates ([#20][])
225
+ - Add cucumber 8.0.0 support ([#7][])
226
+ - Docs: contribution documentation ([#14][], [#28][])
227
+ - Dev process: issue templates ([#20][])
204
228
 
205
229
  ### Changed
206
230
 
207
- * Validate customer-supplied git tags ([#15][])
231
+ - Validate customer-supplied git tags ([#15][])
208
232
 
209
233
  ### Fixed
210
234
 
211
- * Fix Datadog::CI::Environment to support the new CI specs ([#11][])
235
+ - Fix Datadog::CI::Environment to support the new CI specs ([#11][])
212
236
 
213
237
  ### Removed
214
238
 
215
- * Ruby versions < 2.7 no longer supported ([#8][])
239
+ - Ruby versions < 2.7 no longer supported ([#8][])
216
240
 
217
- [Unreleased]: https://github.com/DataDog/datadog-ci-rb/compare/v0.8.3...main
241
+ [Unreleased]: https://github.com/DataDog/datadog-ci-rb/compare/v1.0.0.beta4...main
242
+ [1.0.0.beta4]: https://github.com/DataDog/datadog-ci-rb/compare/v1.0.0.beta3...v1.0.0.beta4
243
+ [1.0.0.beta3]: https://github.com/DataDog/datadog-ci-rb/compare/v1.0.0.beta2...v1.0.0.beta3
218
244
  [1.0.0.beta2]: https://github.com/DataDog/datadog-ci-rb/compare/v1.0.0.beta1...v1.0.0.beta2
219
245
  [1.0.0.beta1]: https://github.com/DataDog/datadog-ci-rb/compare/v0.8.3...v1.0.0.beta1
220
246
  [0.8.3]: https://github.com/DataDog/datadog-ci-rb/compare/v0.8.2...v0.8.3
@@ -304,3 +330,11 @@ Currently test suite level visibility is not used by our instrumentation: it wil
304
330
  [#158]: https://github.com/DataDog/datadog-ci-rb/issues/158
305
331
  [#159]: https://github.com/DataDog/datadog-ci-rb/issues/159
306
332
  [#160]: https://github.com/DataDog/datadog-ci-rb/issues/160
333
+ [#165]: https://github.com/DataDog/datadog-ci-rb/issues/165
334
+ [#166]: https://github.com/DataDog/datadog-ci-rb/issues/166
335
+ [#167]: https://github.com/DataDog/datadog-ci-rb/issues/167
336
+ [#168]: https://github.com/DataDog/datadog-ci-rb/issues/168
337
+ [#172]: https://github.com/DataDog/datadog-ci-rb/issues/172
338
+ [#173]: https://github.com/DataDog/datadog-ci-rb/issues/173
339
+ [#174]: https://github.com/DataDog/datadog-ci-rb/issues/174
340
+ [#175]: https://github.com/DataDog/datadog-ci-rb/issues/175
@@ -5,10 +5,35 @@
5
5
  #define DD_COV_TARGET_FILES 1
6
6
  #define DD_COV_TARGET_LINES 2
7
7
 
8
+ static int is_prefix(VALUE prefix, const char *str)
9
+ {
10
+ if (prefix == Qnil)
11
+ {
12
+ return 0;
13
+ }
14
+
15
+ const char *c_prefix = RSTRING_PTR(prefix);
16
+ if (c_prefix == NULL)
17
+ {
18
+ return 0;
19
+ }
20
+
21
+ long prefix_len = RSTRING_LEN(prefix);
22
+ if (strncmp(c_prefix, str, prefix_len) == 0)
23
+ {
24
+ return 1;
25
+ }
26
+ else
27
+ {
28
+ return 0;
29
+ }
30
+ }
31
+
8
32
  // Data structure
9
33
  struct dd_cov_data
10
34
  {
11
35
  VALUE root;
36
+ VALUE ignored_path;
12
37
  int mode;
13
38
  VALUE coverage;
14
39
  };
@@ -18,6 +43,7 @@ static void dd_cov_mark(void *ptr)
18
43
  struct dd_cov_data *dd_cov_data = ptr;
19
44
  rb_gc_mark_movable(dd_cov_data->coverage);
20
45
  rb_gc_mark_movable(dd_cov_data->root);
46
+ rb_gc_mark_movable(dd_cov_data->ignored_path);
21
47
  }
22
48
 
23
49
  static void dd_cov_free(void *ptr)
@@ -32,6 +58,7 @@ static void dd_cov_compact(void *ptr)
32
58
  struct dd_cov_data *dd_cov_data = ptr;
33
59
  dd_cov_data->coverage = rb_gc_location(dd_cov_data->coverage);
34
60
  dd_cov_data->root = rb_gc_location(dd_cov_data->root);
61
+ dd_cov_data->ignored_path = rb_gc_location(dd_cov_data->ignored_path);
35
62
  }
36
63
 
37
64
  const rb_data_type_t dd_cov_data_type = {
@@ -49,6 +76,7 @@ static VALUE dd_cov_allocate(VALUE klass)
49
76
  VALUE obj = TypedData_Make_Struct(klass, struct dd_cov_data, &dd_cov_data_type, dd_cov_data);
50
77
  dd_cov_data->coverage = rb_hash_new();
51
78
  dd_cov_data->root = Qnil;
79
+ dd_cov_data->ignored_path = Qnil;
52
80
  dd_cov_data->mode = DD_COV_TARGET_FILES;
53
81
  return obj;
54
82
  }
@@ -66,6 +94,8 @@ static VALUE dd_cov_initialize(int argc, VALUE *argv, VALUE self)
66
94
  rb_raise(rb_eArgError, "root is required");
67
95
  }
68
96
 
97
+ VALUE rb_ignored_path = rb_hash_lookup(opt, ID2SYM(rb_intern("ignored_path")));
98
+
69
99
  VALUE rb_mode = rb_hash_lookup(opt, ID2SYM(rb_intern("mode")));
70
100
  if (!RTEST(rb_mode) || rb_mode == ID2SYM(rb_intern("files")))
71
101
  {
@@ -84,6 +114,7 @@ static VALUE dd_cov_initialize(int argc, VALUE *argv, VALUE self)
84
114
  TypedData_Get_Struct(self, struct dd_cov_data, &dd_cov_data_type, dd_cov_data);
85
115
 
86
116
  dd_cov_data->root = rb_root;
117
+ dd_cov_data->ignored_path = rb_ignored_path;
87
118
  dd_cov_data->mode = mode;
88
119
 
89
120
  return Qnil;
@@ -100,20 +131,15 @@ static void dd_cov_update_line_coverage(rb_event_flag_t event, VALUE data, VALUE
100
131
  return;
101
132
  }
102
133
 
103
- if (dd_cov_data->root == Qnil)
134
+ // if given filename is not located under the root, we skip it
135
+ if (is_prefix(dd_cov_data->root, filename) == 0)
104
136
  {
105
137
  return;
106
138
  }
107
139
 
108
- char *c_root = RSTRING_PTR(dd_cov_data->root);
109
- if (c_root == NULL)
110
- {
111
- return;
112
- }
113
- long root_len = RSTRING_LEN(dd_cov_data->root);
114
- // check that root is a prefix of the filename
115
- // so this file is located under the given root
116
- if (strncmp(c_root, filename, root_len) != 0)
140
+ // if ignored_path is provided and given filename is located under the ignored_path, we skip it too
141
+ // this is useful for ignoring bundled gems location
142
+ if (RTEST(dd_cov_data->ignored_path) && is_prefix(dd_cov_data->ignored_path, filename) == 1)
117
143
  {
118
144
  return;
119
145
  }
@@ -13,6 +13,7 @@ require_relative "../test_visibility/serializers/factories/test_suite_level"
13
13
  require_relative "../test_visibility/transport"
14
14
  require_relative "../transport/api/builder"
15
15
  require_relative "../transport/remote_settings_api"
16
+ require_relative "../utils/test_run"
16
17
  require_relative "../worker"
17
18
 
18
19
  module Datadog
@@ -42,6 +43,16 @@ module Datadog
42
43
  end
43
44
 
44
45
  def activate_ci!(settings)
46
+ unless settings.tracing.enabled
47
+ Datadog.logger.error(
48
+ "CI visibility requires tracing to be enabled. Disabling CI visibility. " \
49
+ "NOTE: if you didn't disable tracing intentionally, add `c.tracing.enabled = true` to " \
50
+ "your Datadog.configure block."
51
+ )
52
+ settings.ci.enabled = false
53
+ return
54
+ end
55
+
45
56
  # Configure ddtrace library for CI visibility mode
46
57
  # Deactivate telemetry
47
58
  settings.telemetry.enabled = false
@@ -59,6 +70,9 @@ module Datadog
59
70
  # Choose user defined TraceFlush or default to CI TraceFlush
60
71
  settings.tracing.test_mode.trace_flush = settings.ci.trace_flush || CI::TestVisibility::Flush::Partial.new
61
72
 
73
+ # startup logs are useless for CI visibility and create noise
74
+ settings.diagnostics.startup_logs.enabled = false
75
+
62
76
  # transport creation
63
77
  writer_options = settings.ci.writer_options
64
78
  coverage_writer = nil
@@ -90,16 +104,21 @@ module Datadog
90
104
 
91
105
  settings.tracing.test_mode.writer_options = writer_options
92
106
 
107
+ custom_configuration_tags = Utils::TestRun.custom_configuration(settings.tags)
108
+
93
109
  remote_settings_api = Transport::RemoteSettingsApi.new(
94
110
  api: test_visibility_api,
95
- dd_env: settings.env
111
+ dd_env: settings.env,
112
+ config_tags: custom_configuration_tags
96
113
  )
97
114
 
98
115
  itr = ITR::Runner.new(
99
116
  api: test_visibility_api,
100
117
  dd_env: settings.env,
118
+ config_tags: custom_configuration_tags,
101
119
  coverage_writer: coverage_writer,
102
- enabled: settings.ci.enabled && settings.ci.itr_enabled
120
+ enabled: settings.ci.enabled && settings.ci.itr_enabled,
121
+ bundle_location: settings.ci.itr_code_coverage_excluded_bundle_path
103
122
  )
104
123
 
105
124
  git_tree_uploader = Git::TreeUploader.new(api: test_visibility_api)
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../ext/settings"
4
+ require_relative "../utils/bundle"
4
5
 
5
6
  module Datadog
6
7
  module CI
@@ -67,6 +68,14 @@ module Datadog
67
68
  o.default true
68
69
  end
69
70
 
71
+ option :itr_code_coverage_excluded_bundle_path do |o|
72
+ o.type :string, nilable: true
73
+ o.env CI::Ext::Settings::ENV_ITR_CODE_COVERAGE_EXCLUDED_BUNDLE_PATH
74
+ o.default do
75
+ Datadog::CI::Utils::Bundle.location
76
+ end
77
+ end
78
+
70
79
  define_method(:instrument) do |integration_name, options = {}, &block|
71
80
  return unless enabled
72
81
 
@@ -89,9 +98,6 @@ module Datadog
89
98
  fetch_integration(integration_name).configuration
90
99
  end
91
100
 
92
- # @deprecated Will be removed on datadog-ci-rb 1.0.
93
- alias_method :use, :instrument
94
-
95
101
  option :trace_flush
96
102
 
97
103
  option :writer_options do |o|
@@ -70,12 +70,15 @@ module Datadog
70
70
 
71
71
  start_test_suite(test_suite_name) unless same_test_suite_as_current?(test_suite_name)
72
72
 
73
- CI.start_test(
73
+ test_span = CI.start_test(
74
74
  event.test_case.name,
75
75
  test_suite_name,
76
76
  tags: tags,
77
77
  service: configuration[:service_name]
78
78
  )
79
+ if event.test_case.match_tags?("@#{CI::Ext::Test::ITR_UNSKIPPABLE_OPTION}")
80
+ test_span&.itr_unskippable!
81
+ end
79
82
  end
80
83
 
81
84
  def on_test_case_finished(event)
@@ -2,7 +2,7 @@
2
2
 
3
3
  require_relative "runner"
4
4
  require_relative "reporter"
5
- require_relative "hooks"
5
+ require_relative "test"
6
6
  require_relative "runnable"
7
7
 
8
8
  module Datadog
@@ -25,7 +25,7 @@ module Datadog
25
25
  # test suites (when not executed concurrently)
26
26
  ::Minitest::Runnable.include(Runnable)
27
27
  # tests; test suites (when executed concurrently)
28
- ::Minitest::Test.include(Hooks)
28
+ ::Minitest::Test.include(Test)
29
29
  # test session finish
30
30
  ::Minitest::CompositeReporter.include(Reporter)
31
31
  end
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../../ext/test"
4
+ require_relative "../../git/local_repository"
5
+ require_relative "ext"
6
+ require_relative "helpers"
7
+
8
+ module Datadog
9
+ module CI
10
+ module Contrib
11
+ module Minitest
12
+ # Lifecycle hooks to instrument Minitest::Test
13
+ module Test
14
+ def self.included(base)
15
+ base.prepend(InstanceMethods)
16
+ base.singleton_class.prepend(ClassMethods)
17
+ end
18
+
19
+ module InstanceMethods
20
+ def before_setup
21
+ super
22
+ return unless datadog_configuration[:enabled]
23
+
24
+ test_suite_name = Helpers.test_suite_name(self.class, name)
25
+ if Helpers.parallel?(self.class)
26
+ test_suite_name = "#{test_suite_name} (#{name} concurrently)"
27
+
28
+ # for parallel execution we need to start a new test suite for each test
29
+ CI.start_test_suite(test_suite_name)
30
+ end
31
+
32
+ source_file, line_number = method(name).source_location
33
+
34
+ test_span = CI.start_test(
35
+ name,
36
+ test_suite_name,
37
+ tags: {
38
+ CI::Ext::Test::TAG_FRAMEWORK => Ext::FRAMEWORK,
39
+ CI::Ext::Test::TAG_FRAMEWORK_VERSION => CI::Contrib::Minitest::Integration.version.to_s,
40
+ CI::Ext::Test::TAG_SOURCE_FILE => Git::LocalRepository.relative_to_root(source_file),
41
+ CI::Ext::Test::TAG_SOURCE_START => line_number.to_s
42
+ },
43
+ service: datadog_configuration[:service_name]
44
+ )
45
+ test_span&.itr_unskippable! if self.class.dd_suite_unskippable? || self.class.dd_test_unskippable?(name)
46
+ skip(CI::Ext::Test::ITR_TEST_SKIP_REASON) if test_span&.skipped_by_itr?
47
+ end
48
+
49
+ def after_teardown
50
+ test_span = CI.active_test
51
+ return super unless test_span
52
+
53
+ finish_with_result(test_span, result_code)
54
+ if Helpers.parallel?(self.class)
55
+ finish_with_result(test_span.test_suite, result_code)
56
+ end
57
+
58
+ super
59
+ end
60
+
61
+ private
62
+
63
+ def finish_with_result(span, result_code)
64
+ return unless span
65
+
66
+ case result_code
67
+ when "."
68
+ span.passed!
69
+ when "E", "F"
70
+ span.failed!(exception: failure)
71
+ when "S"
72
+ span.skipped!(reason: failure.message)
73
+ end
74
+ span.finish
75
+ end
76
+
77
+ def datadog_configuration
78
+ Datadog.configuration.ci[:minitest]
79
+ end
80
+ end
81
+
82
+ module ClassMethods
83
+ def datadog_itr_unskippable(*args)
84
+ if args.nil? || args.empty?
85
+ @datadog_itr_unskippable_suite = true
86
+ else
87
+ @datadog_itr_unskippable_tests = args
88
+ end
89
+ end
90
+
91
+ def dd_suite_unskippable?
92
+ @datadog_itr_unskippable_suite
93
+ end
94
+
95
+ def dd_test_unskippable?(test_name)
96
+ return false unless @datadog_itr_unskippable_tests
97
+
98
+ @datadog_itr_unskippable_tests.include?(test_name)
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -50,6 +50,8 @@ module Datadog
50
50
  },
51
51
  service: datadog_configuration[:service_name]
52
52
  ) do |test_span|
53
+ test_span&.itr_unskippable! if metadata[CI::Ext::Test::ITR_UNSKIPPABLE_OPTION]
54
+
53
55
  metadata[:skip] = CI::Ext::Test::ITR_TEST_SKIP_REASON if test_span&.skipped_by_itr?
54
56
 
55
57
  result = super