datadog-ci 0.6.0 → 0.8.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.
Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +63 -2
  3. data/README.md +21 -2
  4. data/lib/datadog/ci/codeowners/matcher.rb +102 -0
  5. data/lib/datadog/ci/codeowners/parser.rb +42 -0
  6. data/lib/datadog/ci/codeowners/rule.rb +33 -0
  7. data/lib/datadog/ci/concurrent_span.rb +2 -1
  8. data/lib/datadog/ci/configuration/components.rb +59 -57
  9. data/lib/datadog/ci/configuration/settings.rb +21 -0
  10. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +4 -1
  11. data/lib/datadog/ci/contrib/cucumber/formatter.rb +69 -38
  12. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +2 -1
  13. data/lib/datadog/ci/contrib/minitest/configuration/settings.rb +4 -1
  14. data/lib/datadog/ci/contrib/minitest/helpers.rb +2 -1
  15. data/lib/datadog/ci/contrib/minitest/hooks.rb +9 -22
  16. data/lib/datadog/ci/contrib/minitest/patcher.rb +9 -6
  17. data/lib/datadog/ci/contrib/minitest/reporter.rb +50 -0
  18. data/lib/datadog/ci/contrib/minitest/runnable.rb +1 -1
  19. data/lib/datadog/ci/contrib/minitest/runner.rb +41 -0
  20. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +4 -1
  21. data/lib/datadog/ci/contrib/rspec/example.rb +55 -14
  22. data/lib/datadog/ci/contrib/rspec/example_group.rb +12 -7
  23. data/lib/datadog/ci/contrib/rspec/patcher.rb +10 -1
  24. data/lib/datadog/ci/contrib/rspec/runner.rb +7 -8
  25. data/lib/datadog/ci/ext/app_types.rb +2 -0
  26. data/lib/datadog/ci/ext/environment/providers/local_git.rb +8 -29
  27. data/lib/datadog/ci/ext/settings.rb +2 -0
  28. data/lib/datadog/ci/ext/test.rb +29 -7
  29. data/lib/datadog/ci/ext/transport.rb +19 -1
  30. data/lib/datadog/ci/itr/runner.rb +67 -0
  31. data/lib/datadog/ci/span.rb +51 -2
  32. data/lib/datadog/ci/test.rb +67 -2
  33. data/lib/datadog/ci/test_module.rb +1 -1
  34. data/lib/datadog/ci/test_session.rb +10 -2
  35. data/lib/datadog/ci/test_suite.rb +53 -2
  36. data/lib/datadog/ci/test_visibility/context/local.rb +3 -9
  37. data/lib/datadog/ci/test_visibility/null_recorder.rb +2 -22
  38. data/lib/datadog/ci/test_visibility/recorder.rb +46 -20
  39. data/lib/datadog/ci/test_visibility/serializers/base.rb +6 -5
  40. data/lib/datadog/ci/test_visibility/serializers/span.rb +1 -1
  41. data/lib/datadog/ci/test_visibility/serializers/test_module.rb +1 -1
  42. data/lib/datadog/ci/test_visibility/serializers/test_session.rb +1 -1
  43. data/lib/datadog/ci/test_visibility/serializers/test_suite.rb +1 -1
  44. data/lib/datadog/ci/test_visibility/serializers/test_v1.rb +1 -1
  45. data/lib/datadog/ci/test_visibility/transport.rb +1 -5
  46. data/lib/datadog/ci/transport/api/agentless.rb +63 -0
  47. data/lib/datadog/ci/transport/api/base.rb +10 -14
  48. data/lib/datadog/ci/transport/api/builder.rb +25 -22
  49. data/lib/datadog/ci/transport/api/evp_proxy.rb +47 -7
  50. data/lib/datadog/ci/transport/http.rb +7 -1
  51. data/lib/datadog/ci/transport/remote_settings_api.rb +96 -0
  52. data/lib/datadog/ci/utils/configuration.rb +15 -0
  53. data/lib/datadog/ci/utils/git.rb +70 -0
  54. data/lib/datadog/ci/version.rb +1 -1
  55. data/lib/datadog/ci.rb +40 -56
  56. metadata +12 -90
  57. data/lib/datadog/ci/contrib/minitest/plugin.rb +0 -73
  58. data/lib/datadog/ci/null_span.rb +0 -63
  59. data/lib/datadog/ci/transport/api/ci_test_cycle.rb +0 -30
  60. data/sig/datadog/ci/concurrent_span.rbs +0 -23
  61. data/sig/datadog/ci/configuration/components.rbs +0 -21
  62. data/sig/datadog/ci/configuration/extensions.rbs +0 -9
  63. data/sig/datadog/ci/configuration/settings.rbs +0 -16
  64. data/sig/datadog/ci/contrib/cucumber/configuration/settings.rbs +0 -12
  65. data/sig/datadog/ci/contrib/cucumber/ext.rbs +0 -21
  66. data/sig/datadog/ci/contrib/cucumber/formatter.rbs +0 -48
  67. data/sig/datadog/ci/contrib/cucumber/instrumentation.rbs +0 -16
  68. data/sig/datadog/ci/contrib/cucumber/integration.rbs +0 -26
  69. data/sig/datadog/ci/contrib/cucumber/patcher.rbs +0 -15
  70. data/sig/datadog/ci/contrib/integration.rbs +0 -44
  71. data/sig/datadog/ci/contrib/minitest/configuration/settings.rbs +0 -12
  72. data/sig/datadog/ci/contrib/minitest/ext.rbs +0 -19
  73. data/sig/datadog/ci/contrib/minitest/helpers.rbs +0 -13
  74. data/sig/datadog/ci/contrib/minitest/hooks.rbs +0 -27
  75. data/sig/datadog/ci/contrib/minitest/integration.rbs +0 -26
  76. data/sig/datadog/ci/contrib/minitest/patcher.rbs +0 -15
  77. data/sig/datadog/ci/contrib/minitest/plugin.rbs +0 -31
  78. data/sig/datadog/ci/contrib/minitest/runnable.rbs +0 -24
  79. data/sig/datadog/ci/contrib/rspec/configuration/settings.rbs +0 -12
  80. data/sig/datadog/ci/contrib/rspec/example.rbs +0 -20
  81. data/sig/datadog/ci/contrib/rspec/example_group.rbs +0 -21
  82. data/sig/datadog/ci/contrib/rspec/ext.rbs +0 -17
  83. data/sig/datadog/ci/contrib/rspec/integration.rbs +0 -26
  84. data/sig/datadog/ci/contrib/rspec/patcher.rbs +0 -15
  85. data/sig/datadog/ci/contrib/rspec/runner.rbs +0 -21
  86. data/sig/datadog/ci/contrib/settings.rbs +0 -25
  87. data/sig/datadog/ci/ext/app_types.rbs +0 -14
  88. data/sig/datadog/ci/ext/environment/extractor.rbs +0 -25
  89. data/sig/datadog/ci/ext/environment/providers/appveyor.rbs +0 -48
  90. data/sig/datadog/ci/ext/environment/providers/aws_code_pipeline.rbs +0 -19
  91. data/sig/datadog/ci/ext/environment/providers/azure.rbs +0 -56
  92. data/sig/datadog/ci/ext/environment/providers/base.rbs +0 -71
  93. data/sig/datadog/ci/ext/environment/providers/bitbucket.rbs +0 -37
  94. data/sig/datadog/ci/ext/environment/providers/bitrise.rbs +0 -41
  95. data/sig/datadog/ci/ext/environment/providers/buddy.rbs +0 -37
  96. data/sig/datadog/ci/ext/environment/providers/buildkite.rbs +0 -45
  97. data/sig/datadog/ci/ext/environment/providers/circleci.rbs +0 -41
  98. data/sig/datadog/ci/ext/environment/providers/codefresh.rbs +0 -25
  99. data/sig/datadog/ci/ext/environment/providers/github_actions.rbs +0 -42
  100. data/sig/datadog/ci/ext/environment/providers/gitlab.rbs +0 -57
  101. data/sig/datadog/ci/ext/environment/providers/jenkins.rbs +0 -35
  102. data/sig/datadog/ci/ext/environment/providers/local_git.rbs +0 -66
  103. data/sig/datadog/ci/ext/environment/providers/teamcity.rbs +0 -17
  104. data/sig/datadog/ci/ext/environment/providers/travis.rbs +0 -35
  105. data/sig/datadog/ci/ext/environment/providers/user_defined_tags.rbs +0 -33
  106. data/sig/datadog/ci/ext/environment/providers.rbs +0 -13
  107. data/sig/datadog/ci/ext/environment.rbs +0 -44
  108. data/sig/datadog/ci/ext/git.rbs +0 -53
  109. data/sig/datadog/ci/ext/settings.rbs +0 -14
  110. data/sig/datadog/ci/ext/test.rbs +0 -60
  111. data/sig/datadog/ci/ext/transport.rbs +0 -29
  112. data/sig/datadog/ci/null_span.rbs +0 -37
  113. data/sig/datadog/ci/span.rbs +0 -47
  114. data/sig/datadog/ci/test.rbs +0 -12
  115. data/sig/datadog/ci/test_module.rbs +0 -6
  116. data/sig/datadog/ci/test_session.rbs +0 -9
  117. data/sig/datadog/ci/test_suite.rbs +0 -6
  118. data/sig/datadog/ci/test_visibility/context/global.rbs +0 -39
  119. data/sig/datadog/ci/test_visibility/context/local.rbs +0 -23
  120. data/sig/datadog/ci/test_visibility/flush.rbs +0 -17
  121. data/sig/datadog/ci/test_visibility/null_recorder.rbs +0 -45
  122. data/sig/datadog/ci/test_visibility/recorder.rbs +0 -85
  123. data/sig/datadog/ci/test_visibility/serializers/base.rbs +0 -94
  124. data/sig/datadog/ci/test_visibility/serializers/factories/test_level.rbs +0 -13
  125. data/sig/datadog/ci/test_visibility/serializers/factories/test_suite_level.rbs +0 -13
  126. data/sig/datadog/ci/test_visibility/serializers/span.rbs +0 -18
  127. data/sig/datadog/ci/test_visibility/serializers/test_module.rbs +0 -26
  128. data/sig/datadog/ci/test_visibility/serializers/test_session.rbs +0 -26
  129. data/sig/datadog/ci/test_visibility/serializers/test_suite.rbs +0 -26
  130. data/sig/datadog/ci/test_visibility/serializers/test_v1.rbs +0 -23
  131. data/sig/datadog/ci/test_visibility/serializers/test_v2.rbs +0 -25
  132. data/sig/datadog/ci/test_visibility/transport.rbs +0 -35
  133. data/sig/datadog/ci/transport/api/base.rbs +0 -21
  134. data/sig/datadog/ci/transport/api/builder.rbs +0 -12
  135. data/sig/datadog/ci/transport/api/ci_test_cycle.rbs +0 -21
  136. data/sig/datadog/ci/transport/api/evp_proxy.rbs +0 -19
  137. data/sig/datadog/ci/transport/gzip.rbs +0 -9
  138. data/sig/datadog/ci/transport/http.rbs +0 -36
  139. data/sig/datadog/ci/utils/git.rbs +0 -11
  140. data/sig/datadog/ci/utils/test_run.rbs +0 -11
  141. data/sig/datadog/ci/utils/url.rbs +0 -9
  142. data/sig/datadog/ci/version.rbs +0 -16
  143. data/sig/datadog/ci.rbs +0 -37
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 63e9fdf2c856764bb9567cf89d76f27a4f327244152c510abcd4d64e180a0cc6
4
- data.tar.gz: 963f5b534027215799efe65a108a4aa8267c2c31aa4fc1402d19d02f996fc2e9
3
+ metadata.gz: ae9b964bc83f82487cc72d99641bcd08a575c104ec311327d49715d88852d02d
4
+ data.tar.gz: 7f787507a51166a49e95c9b55049fc68f3b1d0952fa49d7974f857b37b10e56f
5
5
  SHA512:
6
- metadata.gz: e94bbd5cc929f95a386cadd633b93f2a53962eefe686354712a9801a8b9865a52fc74c6401f96635a47b9001d71287cadc568ba3bb81ed764d68bdf232b85e5b
7
- data.tar.gz: 7a33d2dc09b32798f2fcae80a96bec0e919b4c60f65283f4cf158a020ecd573e450bb925c790c822c63a86b4cf214fae4427e7d4bdb6cde28ca1105dcc95a20a
6
+ metadata.gz: 5947c6dd42ab0d629d1e7eecd2f116ea2c28e89b657e47e80eb0b127caf21e25b68e182ba5f3039671491f9335b0dda917091cbd43f18f64c9136e3e38ef1239
7
+ data.tar.gz: 7790297ed83c4bfedc4cfb9c2b9116a540c8f7c3cdc78ccd9b5ece5ecb506be427765851834f8abca4594ff5908ca99c4e7f4cd8ab601fe5c0228cf2c62f8971
data/CHANGELOG.md CHANGED
@@ -1,5 +1,45 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.8.0] - 2024-03-08
4
+
5
+ ### Added
6
+
7
+ * gzip agent payloads support via evp_proxy/v4 ([#123][])
8
+
9
+ ### Changed
10
+
11
+ * Add note to README on using VCR ([#122][])
12
+
13
+ ### Fixed
14
+
15
+ * use framework name as test module name to make test fingerprints stable ([#131][])
16
+
17
+ ## [0.7.0] - 2024-01-26
18
+
19
+ ### Added
20
+
21
+ * Source code integration ([#95][])
22
+ * CODEOWNERS support ([#98][])
23
+ * Cucumber scenarios with examples are treated as parametrized tests ([#100][])
24
+ * Deduplicate dynamically generated RSpec examples using test.parameters ([#101][])
25
+ * Repository name is used as default test service name ([#104][])
26
+ * Cucumber v9 support ([#99][])
27
+ * ci-queue runner support for minitest ([#110][])
28
+ * ci-queue support for rspec ([#112][])
29
+
30
+ ### Fixed
31
+
32
+ * do not publish sig folder when publishing this gem to prevent steep errors in client applications ([#114][])
33
+ * minitest: fix rails parallel test runner ([#115][])
34
+ * Test suites and tests skipped by frameworks are correctly reported as skipped to Datadog ([#113][])
35
+
36
+ ### Changed
37
+
38
+ * Enable test suite level visibility by default (with killswitch) ([#109][])
39
+ * Test suite names are more human-readable now ([#105][])
40
+ * Remove span_type method in tracer-related models ([#107][])
41
+ * Manual tracing API: convert type parameter to keyword in Datadog::CI.trace, remove internal-only methods from public API ([#108][])
42
+
3
43
  ## [0.6.0] - 2024-01-03
4
44
 
5
45
  ### Added
@@ -124,7 +164,10 @@ Currently test suite level visibility is not used by our instrumentation: it wil
124
164
 
125
165
  * Ruby versions < 2.7 no longer supported ([#8][])
126
166
 
127
- [Unreleased]: https://github.com/DataDog/datadog-ci-rb/compare/v0.5.1...main
167
+ [Unreleased]: https://github.com/DataDog/datadog-ci-rb/compare/v0.8.0...main
168
+ [0.8.0]: https://github.com/DataDog/datadog-ci-rb/compare/v0.7.0...v0.8.0
169
+ [0.7.0]: https://github.com/DataDog/datadog-ci-rb/compare/v0.6.0...v0.7.0
170
+ [0.6.0]: https://github.com/DataDog/datadog-ci-rb/compare/v0.5.1...v0.6.0
128
171
  [0.5.1]: https://github.com/DataDog/datadog-ci-rb/compare/v0.5.0...v0.5.1
129
172
  [0.5.0]: https://github.com/DataDog/datadog-ci-rb/compare/v0.4.1...v0.5.0
130
173
  [0.4.1]: https://github.com/DataDog/datadog-ci-rb/compare/v0.4.0...v0.4.1
@@ -169,4 +212,22 @@ Currently test suite level visibility is not used by our instrumentation: it wil
169
212
  [#87]: https://github.com/DataDog/datadog-ci-rb/issues/87
170
213
  [#89]: https://github.com/DataDog/datadog-ci-rb/issues/89
171
214
  [#90]: https://github.com/DataDog/datadog-ci-rb/issues/90
172
- [#92]: https://github.com/DataDog/datadog-ci-rb/issues/92
215
+ [#92]: https://github.com/DataDog/datadog-ci-rb/issues/92
216
+ [#95]: https://github.com/DataDog/datadog-ci-rb/issues/95
217
+ [#98]: https://github.com/DataDog/datadog-ci-rb/issues/98
218
+ [#99]: https://github.com/DataDog/datadog-ci-rb/issues/99
219
+ [#100]: https://github.com/DataDog/datadog-ci-rb/issues/100
220
+ [#101]: https://github.com/DataDog/datadog-ci-rb/issues/101
221
+ [#104]: https://github.com/DataDog/datadog-ci-rb/issues/104
222
+ [#105]: https://github.com/DataDog/datadog-ci-rb/issues/105
223
+ [#107]: https://github.com/DataDog/datadog-ci-rb/issues/107
224
+ [#108]: https://github.com/DataDog/datadog-ci-rb/issues/108
225
+ [#109]: https://github.com/DataDog/datadog-ci-rb/issues/109
226
+ [#110]: https://github.com/DataDog/datadog-ci-rb/issues/110
227
+ [#112]: https://github.com/DataDog/datadog-ci-rb/issues/112
228
+ [#113]: https://github.com/DataDog/datadog-ci-rb/issues/113
229
+ [#114]: https://github.com/DataDog/datadog-ci-rb/issues/114
230
+ [#115]: https://github.com/DataDog/datadog-ci-rb/issues/115
231
+ [#122]: https://github.com/DataDog/datadog-ci-rb/issues/122
232
+ [#123]: https://github.com/DataDog/datadog-ci-rb/issues/123
233
+ [#131]: https://github.com/DataDog/datadog-ci-rb/issues/131
data/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
  [![CircleCI](https://dl.circleci.com/status-badge/img/gh/DataDog/datadog-ci-rb/tree/main.svg?style=svg)](https://dl.circleci.com/status-badge/redirect/gh/DataDog/datadog-ci-rb/tree/main)
7
7
 
8
8
  Datadog's Ruby Library for instrumenting your test and continuous integration pipeline.
9
- Learn more on our [official website](https://docs.datadoghq.com/continuous_integration/tests/ruby/).
9
+ Learn more on our [official website](https://docs.datadoghq.com/tests/) and check out our [documentation for this library](https://docs.datadoghq.com/tests/setup/ruby/?tab=cloudciprovideragentless).
10
10
 
11
11
  > [!IMPORTANT]
12
12
  > The `datadog-ci` gem is currently a component of [`ddtrace`](https://github.com/datadog/dd-trace-rb) and should not be used without it.
@@ -175,7 +175,7 @@ Webmock accordingly.
175
175
  ```ruby
176
176
  # when using agentless mode
177
177
  # note to use the correct datadog site (e.g. datadoghq.eu, etc)
178
- WebMock.disable_net_connect!(:allow => "citestcycle-intake.datadoghq.com")
178
+ WebMock.disable_net_connect!(:allow => /datadoghq.com/)
179
179
 
180
180
  # when using agent
181
181
  WebMock.disable_net_connect!(:allow_localhost => true)
@@ -184,6 +184,25 @@ WebMock.disable_net_connect!(:allow_localhost => true)
184
184
  WebMock.disable_net_connect!(:allow => "localhost:8126")
185
185
  ```
186
186
 
187
+ ### VCR
188
+
189
+ [VCR](https://github.com/vcr/vcr) is another popular testing library for HTTP interactions.
190
+
191
+ It requires additional configuration to correctly work with datadog-ci:
192
+
193
+ ```ruby
194
+ VCR.configure do |config|
195
+ # ... your usual configuration here ...
196
+
197
+ # when using agent
198
+ config.ignore_hosts "127.0.0.1", "localhost"
199
+
200
+ # when using agentless mode
201
+ # note to use the correct datadog site (e.g. datadoghq.eu, etc)
202
+ config.ignore_hosts "citestcycle-intake.datadoghq.com", "api.datadoghq.com"
203
+ end
204
+ ```
205
+
187
206
  ### Disabling startup logs
188
207
 
189
208
  Startup logs produce a report of tracing state when the application is initially configured.
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "rule"
4
+
5
+ module Datadog
6
+ module CI
7
+ module Codeowners
8
+ # Responsible for matching a test source file path to a list of owners
9
+ class Matcher
10
+ def initialize(codeowners_file_path)
11
+ @rules = parse(codeowners_file_path)
12
+ @rules.reverse!
13
+ end
14
+
15
+ def list_owners(file_path)
16
+ # treat all file paths that we check as absolute from the repository root
17
+ file_path = "/#{file_path}" unless file_path.start_with?("/")
18
+
19
+ Datadog.logger.debug { "Matching file path #{file_path} to CODEOWNERS rules" }
20
+
21
+ @rules.each do |rule|
22
+ if rule.match?(file_path)
23
+ Datadog.logger.debug { "Matched rule [#{rule.pattern}] with owners #{rule.owners}" }
24
+ return rule.owners
25
+ end
26
+ end
27
+
28
+ Datadog.logger.debug { "CODEOWNERS rule not matched" }
29
+ nil
30
+ end
31
+
32
+ private
33
+
34
+ def parse(codeowners_file_path)
35
+ unless File.exist?(codeowners_file_path)
36
+ Datadog.logger.debug { "CODEOWNERS file not found at #{codeowners_file_path}" }
37
+ return []
38
+ end
39
+
40
+ result = []
41
+ section_default_owners = []
42
+
43
+ File.open(codeowners_file_path, "r") do |f|
44
+ f.each_line do |line|
45
+ line.strip!
46
+
47
+ next if line.empty?
48
+ next if comment?(line)
49
+
50
+ pattern, *line_owners = line.strip.split(/\s+/)
51
+ next if pattern.nil? || pattern.empty?
52
+
53
+ # if the current line starts with section record the default owners for this section
54
+ if section?(pattern)
55
+ section_default_owners = line_owners
56
+ next
57
+ end
58
+
59
+ pattern = expand_pattern(pattern)
60
+ # if the current line doesn't have any owners then use the default owners for this section
61
+ if line_owners.empty? && !section_default_owners.empty?
62
+ line_owners = section_default_owners
63
+ end
64
+
65
+ result << Rule.new(pattern, line_owners)
66
+ end
67
+ end
68
+
69
+ result
70
+ rescue => e
71
+ Datadog.logger.warn(
72
+ "Failed to parse codeowners file at #{codeowners_file_path}: " \
73
+ "#{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
74
+ )
75
+ []
76
+ end
77
+
78
+ def comment?(line)
79
+ line.start_with?("#")
80
+ end
81
+
82
+ def section?(line)
83
+ line.start_with?("[", "^[") && line.end_with?("]")
84
+ end
85
+
86
+ def expand_pattern(pattern)
87
+ return pattern if pattern == "*"
88
+
89
+ # if pattern ends with a slash then it matches everything deeply nested in this directory
90
+ pattern += "**" if pattern.end_with?(::File::SEPARATOR)
91
+
92
+ # if pattern doesn't start with a slash then it matches anywhere in the repository
93
+ if !pattern.start_with?(::File::SEPARATOR, "**#{::File::SEPARATOR}", "*#{::File::SEPARATOR}")
94
+ pattern = "**#{::File::SEPARATOR}#{pattern}"
95
+ end
96
+
97
+ pattern
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "matcher"
4
+
5
+ module Datadog
6
+ module CI
7
+ module Codeowners
8
+ # Responsible for parsing a CODEOWNERS file
9
+ class Parser
10
+ DEFAULT_LOCATION = "CODEOWNERS"
11
+ POSSIBLE_CODEOWNERS_LOCATIONS = [
12
+ "CODEOWNERS",
13
+ ".github/CODEOWNERS",
14
+ ".gitlab/CODEOWNERS",
15
+ "docs/CODEOWNERS"
16
+ ].freeze
17
+
18
+ def initialize(root_file_path)
19
+ @root_file_path = root_file_path || Dir.pwd
20
+ end
21
+
22
+ def parse
23
+ default_path = File.join(@root_file_path, DEFAULT_LOCATION)
24
+ # We are using the first codeowners file that we find or
25
+ # default location if nothing is found
26
+ #
27
+ # Matcher handles it internally and creates a class with
28
+ # an empty list of rules if the file is not found
29
+ codeowners_file_path = POSSIBLE_CODEOWNERS_LOCATIONS.map do |codeowners_location|
30
+ File.join(@root_file_path, codeowners_location)
31
+ end.find do |path|
32
+ File.exist?(path)
33
+ end || default_path
34
+
35
+ ::Datadog.logger.debug { "Using CODEOWNERS file from: #{codeowners_file_path}" }
36
+
37
+ Matcher.new(codeowners_file_path)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,33 @@
1
+ module Datadog
2
+ module CI
3
+ module Codeowners
4
+ class Rule
5
+ attr_reader :pattern, :owners
6
+
7
+ def initialize(pattern, owners)
8
+ @pattern = pattern
9
+ @owners = owners
10
+ end
11
+
12
+ def match?(file_path)
13
+ res = false
14
+ # if pattern does not end with a separator or a wildcard, it could be either a directory or a file
15
+ if !pattern.end_with?(::File::SEPARATOR, "*")
16
+ directory_pattern = "#{pattern}#{::File::SEPARATOR}*"
17
+ res ||= File.fnmatch?(directory_pattern, file_path, flags)
18
+ end
19
+
20
+ res ||= File.fnmatch?(pattern, file_path, flags)
21
+ res
22
+ end
23
+
24
+ private
25
+
26
+ def flags
27
+ return ::File::FNM_PATHNAME if pattern.end_with?("#{::File::SEPARATOR}*")
28
+ 0
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -12,7 +12,8 @@ module Datadog
12
12
  def initialize(tracer_span)
13
13
  super
14
14
 
15
- @mutex = Mutex.new
15
+ # we use Monitor instead of Mutex because it is reentrant
16
+ @mutex = Monitor.new
16
17
  end
17
18
 
18
19
  # Gets tag value by key. This method is thread-safe.
@@ -1,10 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "datadog/core/configuration/agent_settings_resolver"
4
- require "datadog/core/remote/negotiation"
5
-
6
- require_relative "../ext/transport"
7
3
  require_relative "../ext/settings"
4
+ require_relative "../itr/runner"
8
5
  require_relative "../test_visibility/flush"
9
6
  require_relative "../test_visibility/recorder"
10
7
  require_relative "../test_visibility/null_recorder"
@@ -12,6 +9,7 @@ require_relative "../test_visibility/serializers/factories/test_level"
12
9
  require_relative "../test_visibility/serializers/factories/test_suite_level"
13
10
  require_relative "../test_visibility/transport"
14
11
  require_relative "../transport/api/builder"
12
+ require_relative "../transport/remote_settings_api"
15
13
 
16
14
  module Datadog
17
15
  module CI
@@ -32,18 +30,7 @@ module Datadog
32
30
  end
33
31
 
34
32
  def activate_ci!(settings)
35
- test_visibility_transport = nil
36
- agent_settings = Datadog::Core::Configuration::AgentSettingsResolver.call(settings)
37
-
38
- if settings.ci.agentless_mode_enabled
39
- check_dd_site(settings)
40
- test_visibility_transport = build_agentless_transport(settings)
41
- elsif can_use_evp_proxy?(settings, agent_settings)
42
- test_visibility_transport = build_evp_proxy_transport(settings, agent_settings)
43
- else
44
- settings.ci.experimental_test_suite_level_visibility_enabled = false
45
- end
46
-
33
+ # Configure ddtrace library for CI visibility mode
47
34
  # Deactivate telemetry
48
35
  settings.telemetry.enabled = false
49
36
 
@@ -60,69 +47,84 @@ module Datadog
60
47
  # Choose user defined TraceFlush or default to CI TraceFlush
61
48
  settings.tracing.test_mode.trace_flush = settings.ci.trace_flush || CI::TestVisibility::Flush::Partial.new
62
49
 
50
+ # transport creation
63
51
  writer_options = settings.ci.writer_options
64
- if test_visibility_transport
65
- writer_options[:transport] = test_visibility_transport
52
+ test_visibility_api = build_test_visibility_api(settings)
53
+
54
+ if test_visibility_api
55
+ writer_options[:transport] = Datadog::CI::TestVisibility::Transport.new(
56
+ api: test_visibility_api,
57
+ serializers_factory: serializers_factory(settings),
58
+ dd_env: settings.env
59
+ )
66
60
  writer_options[:shutdown_timeout] = 60
67
61
  writer_options[:buffer_size] = 10_000
68
62
 
69
63
  settings.tracing.test_mode.async = true
64
+ else
65
+ # only legacy APM protocol is supported, so no test suite level visibility
66
+ settings.ci.force_test_level_visibility = true
67
+
68
+ # ITR is not supported with APM protocol
69
+ settings.ci.itr_enabled = false
70
70
  end
71
71
 
72
72
  settings.tracing.test_mode.writer_options = writer_options
73
73
 
74
- @ci_recorder = TestVisibility::Recorder.new(
75
- test_suite_level_visibility_enabled: settings.ci.experimental_test_suite_level_visibility_enabled
74
+ itr = Datadog::CI::ITR::Runner.new(
75
+ enabled: settings.ci.enabled && settings.ci.itr_enabled
76
76
  )
77
- end
78
77
 
79
- def can_use_evp_proxy?(settings, agent_settings)
80
- Datadog::Core::Remote::Negotiation.new(settings, agent_settings).endpoint?(
81
- Ext::Transport::EVP_PROXY_PATH_PREFIX
78
+ remote_settings_api = Transport::RemoteSettingsApi.new(
79
+ api: test_visibility_api,
80
+ dd_env: settings.env
81
+ )
82
+
83
+ # CI visibility recorder global instance
84
+ @ci_recorder = TestVisibility::Recorder.new(
85
+ test_suite_level_visibility_enabled: !settings.ci.force_test_level_visibility,
86
+ itr: itr,
87
+ remote_settings_api: remote_settings_api
82
88
  )
83
89
  end
84
90
 
85
- def build_agentless_transport(settings)
86
- if settings.api_key.nil?
87
- # agentless mode is requested but no API key is provided -
88
- # we cannot continue and log an error
89
- # Tests are running without CI visibility enabled
91
+ def build_test_visibility_api(settings)
92
+ if settings.ci.agentless_mode_enabled
93
+ check_dd_site(settings)
90
94
 
91
- Datadog.logger.error(
92
- "DATADOG CONFIGURATION - CI VISIBILITY - ATTENTION - " \
93
- "Agentless mode was enabled but DD_API_KEY is not set: CI visibility is disabled. " \
94
- "Please make sure to set valid api key in DD_API_KEY environment variable"
95
- )
95
+ Datadog.logger.debug("CI visibility configured to use agentless transport")
96
96
 
97
- settings.ci.enabled = false
97
+ api = Transport::Api::Builder.build_agentless_api(settings)
98
+ if api.nil?
99
+ Datadog.logger.error do
100
+ "DATADOG CONFIGURATION - CI VISIBILITY - ATTENTION - " \
101
+ "Agentless mode was enabled but DD_API_KEY is not set: CI visibility is disabled. " \
102
+ "Please make sure to set valid api key in DD_API_KEY environment variable"
103
+ end
98
104
 
99
- nil
100
- else
101
- Datadog.logger.debug("CI visibility configured to use agentless transport")
105
+ # Tests are running without CI visibility enabled
106
+ settings.ci.enabled = false
107
+ end
102
108
 
103
- Datadog::CI::TestVisibility::Transport.new(
104
- api: Transport::Api::Builder.build_ci_test_cycle_api(settings),
105
- serializers_factory: serializers_factory(settings),
106
- dd_env: settings.env
107
- )
109
+ else
110
+ Datadog.logger.debug("CI visibility configured to use agent transport via EVP proxy")
111
+
112
+ api = Transport::Api::Builder.build_evp_proxy_api(settings)
113
+ if api.nil?
114
+ Datadog.logger.debug(
115
+ "Old agent version detected, no evp_proxy support. Forcing test level visibility mode"
116
+ )
117
+ end
108
118
  end
109
- end
110
119
 
111
- def build_evp_proxy_transport(settings, agent_settings)
112
- Datadog.logger.debug("CI visibility configured to use agent transport via EVP proxy")
113
-
114
- Datadog::CI::TestVisibility::Transport.new(
115
- api: Transport::Api::Builder.build_evp_proxy_api(agent_settings),
116
- serializers_factory: serializers_factory(settings),
117
- dd_env: settings.env
118
- )
120
+ api
119
121
  end
120
122
 
121
123
  def serializers_factory(settings)
122
- if settings.ci.experimental_test_suite_level_visibility_enabled
123
- Datadog::CI::TestVisibility::Serializers::Factories::TestSuiteLevel
124
- else
124
+ if settings.ci.force_test_level_visibility
125
125
  Datadog::CI::TestVisibility::Serializers::Factories::TestLevel
126
+ else
127
+ Datadog::CI::TestVisibility::Serializers::Factories::TestSuiteLevel
126
128
  end
127
129
  end
128
130
 
@@ -130,11 +132,11 @@ module Datadog
130
132
  return if settings.site.nil?
131
133
  return if Ext::Settings::DD_SITE_ALLOWLIST.include?(settings.site)
132
134
 
133
- Datadog.logger.warn(
135
+ Datadog.logger.warn do
134
136
  "CI VISIBILITY CONFIGURATION " \
135
137
  "Agentless mode was enabled but DD_SITE is not set to one of the following: #{Ext::Settings::DD_SITE_ALLOWLIST.join(", ")}. " \
136
138
  "Please make sure to set valid site in DD_SITE environment variable"
137
- )
139
+ end
138
140
  end
139
141
  end
140
142
  end
@@ -34,10 +34,31 @@ module Datadog
34
34
  o.env CI::Ext::Settings::ENV_AGENTLESS_URL
35
35
  end
36
36
 
37
+ option :force_test_level_visibility do |o|
38
+ o.type :bool
39
+ o.env CI::Ext::Settings::ENV_FORCE_TEST_LEVEL_VISIBILITY
40
+ o.default false
41
+ end
42
+
37
43
  option :experimental_test_suite_level_visibility_enabled do |o|
38
44
  o.type :bool
39
45
  o.env CI::Ext::Settings::ENV_EXPERIMENTAL_TEST_SUITE_LEVEL_VISIBILITY_ENABLED
40
46
  o.default false
47
+ o.after_set do |value|
48
+ if value
49
+ Datadog::Core.log_deprecation do
50
+ "The experimental_test_suite_level_visibility_enabled setting has no effect and will be removed in 1.0. " \
51
+ "Test suite level visibility is now enabled by default. " \
52
+ "If you want to disable test suite level visibility set configuration.ci.force_test_level_visibility = true."
53
+ end
54
+ end
55
+ end
56
+ end
57
+
58
+ option :itr_enabled do |o|
59
+ o.type :bool
60
+ o.env CI::Ext::Settings::ENV_ITR_ENABLED
61
+ o.default false
41
62
  end
42
63
 
43
64
  define_method(:instrument) do |integration_name, options = {}, &block|
@@ -4,6 +4,7 @@ require "datadog/core"
4
4
 
5
5
  require_relative "../ext"
6
6
  require_relative "../../settings"
7
+ require_relative "../../../utils/configuration"
7
8
 
8
9
  module Datadog
9
10
  module CI
@@ -21,7 +22,9 @@ module Datadog
21
22
 
22
23
  option :service_name do |o|
23
24
  o.type :string
24
- o.default { Datadog.configuration.service_without_fallback || Ext::DEFAULT_SERVICE_NAME }
25
+ o.default do
26
+ Utils::Configuration.fetch_service_name(Ext::DEFAULT_SERVICE_NAME)
27
+ end
25
28
  end
26
29
 
27
30
  # @deprecated Will be removed in 1.0