datadog-ci 0.6.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "open3"
4
+ require "pathname"
5
+
3
6
  module Datadog
4
7
  module CI
5
8
  module Utils
@@ -16,6 +19,73 @@ module Datadog
16
19
  def self.is_git_tag?(ref)
17
20
  !ref.nil? && ref.include?("tags/")
18
21
  end
22
+
23
+ def self.root
24
+ return @root if defined?(@root)
25
+
26
+ @root = exec_git_command("git rev-parse --show-toplevel")
27
+ rescue => e
28
+ Datadog.logger.debug(
29
+ "Unable to read git root: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
30
+ )
31
+ @root = nil
32
+ end
33
+
34
+ def self.relative_to_root(path)
35
+ return nil if path.nil?
36
+
37
+ git_root = root
38
+ return path if git_root.nil?
39
+
40
+ path = Pathname.new(File.expand_path(path))
41
+ git_root = Pathname.new(git_root)
42
+
43
+ path.relative_path_from(git_root).to_s
44
+ end
45
+
46
+ def self.repository_name
47
+ return @repository_name if defined?(@repository_name)
48
+
49
+ git_remote_url = exec_git_command("git ls-remote --get-url origin")
50
+
51
+ # return git repository name from remote url without .git extension
52
+ last_path_segment = git_remote_url.split("/").last if git_remote_url
53
+ @repository_name = last_path_segment.gsub(".git", "") if last_path_segment
54
+ @repository_name ||= current_folder_name
55
+ rescue => e
56
+ Datadog.logger.debug(
57
+ "Unable to get git remote: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
58
+ )
59
+ @repository_name = current_folder_name
60
+ end
61
+
62
+ def self.current_folder_name
63
+ root_folder = root
64
+ if root_folder.nil?
65
+ File.basename(Dir.pwd)
66
+ else
67
+ File.basename(root_folder)
68
+ end
69
+ end
70
+
71
+ def self.exec_git_command(cmd)
72
+ out, status = Open3.capture2e(cmd)
73
+
74
+ raise "Failed to run git command #{cmd}: #{out}" unless status.success?
75
+
76
+ # Sometimes Encoding.default_external is somehow set to US-ASCII which breaks
77
+ # commit messages with UTF-8 characters like emojis
78
+ # We force output's encoding to be UTF-8 in this case
79
+ # This is safe to do as UTF-8 is compatible with US-ASCII
80
+ if Encoding.default_external == Encoding::US_ASCII
81
+ out = out.force_encoding(Encoding::UTF_8)
82
+ end
83
+ out.strip! # There's always a "\n" at the end of the command output
84
+
85
+ return nil if out.empty?
86
+
87
+ out
88
+ end
19
89
  end
20
90
  end
21
91
  end
@@ -4,7 +4,7 @@ module Datadog
4
4
  module CI
5
5
  module VERSION
6
6
  MAJOR = "0"
7
- MINOR = "6"
7
+ MINOR = "8"
8
8
  PATCH = "0"
9
9
  PRE = nil
10
10
  BUILD = nil
data/lib/datadog/ci.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "ci/version"
4
+ require_relative "ci/utils/configuration"
5
+ require_relative "ci/ext/app_types"
4
6
 
5
7
  require "datadog/core"
6
8
 
@@ -9,6 +11,8 @@ module Datadog
9
11
  #
10
12
  # @public_api
11
13
  module CI
14
+ class ReservedTypeError < StandardError; end
15
+
12
16
  class << self
13
17
  # Starts a {Datadog::CI::TestSession ci_test_session} that represents the whole test session run.
14
18
  #
@@ -30,13 +34,11 @@ module Datadog
30
34
  #
31
35
  # Remember that calling {Datadog::CI::TestSession#finish} is mandatory.
32
36
  #
33
- # @param [String] service the service name for this session (optional, defaults to DD_SERVICE)
37
+ # @param [String] service the service name for this session (optional, defaults to DD_SERVICE or repository name)
34
38
  # @param [Hash<String,String>] tags extra tags which should be added to the test session.
35
- # @return [Datadog::CI::TestSession] returns the active, running {Datadog::CI::TestSession}.
36
- # @return [Datadog::CI::NullSpan] ci_span null object if CI visibility is disabled or if old Datadog agent is
37
- # detected and test suite level visibility cannot be supported.
38
- def start_test_session(service: nil, tags: {})
39
- service ||= Datadog.configuration.service
39
+ # @return [Datadog::CI::TestSession] the active, running {Datadog::CI::TestSession}.
40
+ # @return [nil] if test suite level visibility is disabled or CI mode is disabled.
41
+ def start_test_session(service: Utils::Configuration.fetch_service_name("test"), tags: {})
40
42
  recorder.start_test_session(service: service, tags: tags)
41
43
  end
42
44
 
@@ -88,9 +90,8 @@ module Datadog
88
90
  # @param [String] test_module_name the name for this module
89
91
  # @param [String] service the service name for this session (optional, inherited from test session if not provided)
90
92
  # @param [Hash<String,String>] tags extra tags which should be added to the test module (optional, some tags are inherited from test session).
91
- # @return [Datadog::CI::TestModule] returns the active, running {Datadog::CI::TestModule}.
92
- # @return [Datadog::CI::NullSpan] ci_span null object if CI visibility is disabled or if old Datadog agent is
93
- # detected and test suite level visibility cannot be supported.
93
+ # @return [Datadog::CI::TestModule] the active, running {Datadog::CI::TestModule}.
94
+ # @return [nil] if test suite level visibility is disabled or CI mode is disabled.
94
95
  def start_test_module(test_module_name, service: nil, tags: {})
95
96
  recorder.start_test_module(test_module_name, service: service, tags: tags)
96
97
  end
@@ -141,9 +142,8 @@ module Datadog
141
142
  # @param [String] test_suite_name the name of the test suite
142
143
  # @param [String] service the service name for this test suite (optional, inherited from test session if not provided)
143
144
  # @param [Hash<String,String>] tags extra tags which should be added to the test module (optional, some tags are inherited from test session)
144
- # @return [Datadog::CI::TestSuite] returns the active, running {Datadog::CI::TestSuite}.
145
- # @return [Datadog::CI::NullSpan] ci_span null object if CI visibility is disabled or if old Datadog agent is
146
- # detected and test suite level visibility cannot be supported.
145
+ # @return [Datadog::CI::TestSuite] the active, running {Datadog::CI::TestSuite}.
146
+ # @return [nil] if test suite level visibility is disabled or CI mode is disabled.
147
147
  def start_test_suite(test_suite_name, service: nil, tags: {})
148
148
  recorder.start_test_suite(test_suite_name, service: service, tags: tags)
149
149
  end
@@ -217,10 +217,10 @@ module Datadog
217
217
  # @return [Object] If a block is provided, returns the result of the block execution.
218
218
  # @return [Datadog::CI::Test] If no block is provided, returns the active,
219
219
  # unfinished {Datadog::CI::Test}.
220
- # @return [Datadog::CI::NullSpan] ci_span null object if CI visibility is disabled
220
+ # @return [nil] if no block is provided and CI mode is disabled.
221
221
  # @yield Optional block where newly created {Datadog::CI::Test} captures the execution.
222
222
  # @yieldparam [Datadog::CI::Test] ci_test the newly created and active [Datadog::CI::Test]
223
- # @yieldparam [Datadog::CI::NullSpan] ci_span null object if CI visibility is disabled
223
+ # @yieldparam [nil] if CI mode is disabled
224
224
  def trace_test(test_name, test_suite_name, service: nil, tags: {}, &block)
225
225
  recorder.trace_test(test_name, test_suite_name, service: service, tags: tags, &block)
226
226
  end
@@ -245,8 +245,8 @@ module Datadog
245
245
  # @param [String] test_suite_name name of test suite this test belongs to (example: "CalculatorTest").
246
246
  # @param [String] service the service name for this span (optional, inherited from test session if not provided)
247
247
  # @param [Hash<String,String>] tags extra tags which should be added to the test.
248
- # @return [Datadog::CI::Test] Returns the active, unfinished {Datadog::CI::Test}.
249
- # @return [Datadog::CI::NullSpan] ci_span null object if CI visibility is disabled
248
+ # @return [Datadog::CI::Test] the active, unfinished {Datadog::CI::Test}.
249
+ # @return [nil] if CI mode is disabled.
250
250
  def start_test(test_name, test_suite_name, service: nil, tags: {})
251
251
  recorder.trace_test(test_name, test_suite_name, service: service, tags: tags)
252
252
  end
@@ -260,8 +260,8 @@ module Datadog
260
260
  #
261
261
  # ```
262
262
  # Datadog::CI.trace(
263
- # "step",
264
263
  # "Given I have 42 cucumbers",
264
+ # type: "step",
265
265
  # tags: {}
266
266
  # ) do
267
267
  # run_operation
@@ -271,8 +271,8 @@ module Datadog
271
271
  # The {.trace} method can also be used without a block in this way:
272
272
  # ```
273
273
  # ci_span = Datadog::CI.trace(
274
- # "step",
275
274
  # "Given I have 42 cucumbers",
275
+ # type: "step",
276
276
  # tags: {}
277
277
  # )
278
278
  # # ... run test here ...
@@ -280,22 +280,31 @@ module Datadog
280
280
  # ```
281
281
  # Remember that in this case, calling {Datadog::CI::Span#finish} is mandatory.
282
282
  #
283
- # @param [String] span_type custom, user-defined span type (for example "step" or "query").
284
283
  # @param [String] span_name the resource this span refers, or `test` if it's missing
284
+ # @param [String] type custom, user-defined span type (for example "step" or "query").
285
285
  # @param [Hash<String,String>] tags extra tags which should be added to the span.
286
286
  # @return [Object] If a block is provided, returns the result of the block execution.
287
287
  # @return [Datadog::CI::Span] If no block is provided, returns the active,
288
288
  # unfinished {Datadog::CI::Span}.
289
- # @return [Datadog::CI::NullSpan] ci_span null object if CI visibility is disabled
289
+ # @return [nil] if CI visibility is disabled
290
+ # @raise [ReservedTypeError] if provided type is reserved for Datadog CI visibility
290
291
  # @yield Optional block where newly created {Datadog::CI::Span} captures the execution.
291
292
  # @yieldparam [Datadog::CI::Span] ci_span the newly created and active [Datadog::CI::Span]
292
- # @yieldparam [Datadog::CI::NullSpan] ci_span null object if CI visibility is disabled
293
- def trace(span_type, span_name, tags: {}, &block)
294
- recorder.trace(span_type, span_name, tags: tags, &block)
293
+ # @yieldparam [nil] ci_span if CI visibility is disabled
294
+ def trace(span_name, type: "span", tags: {}, &block)
295
+ if Ext::AppTypes::CI_SPAN_TYPES.include?(type)
296
+ raise(
297
+ ReservedTypeError,
298
+ "Span type #{type} is reserved for Datadog CI visibility. " \
299
+ "Reserved types are: #{Ext::AppTypes::CI_SPAN_TYPES}"
300
+ )
301
+ end
302
+
303
+ recorder.trace(span_name, type: type, tags: tags, &block)
295
304
  end
296
305
 
297
- # The active, unfinished custom span if it matches given type.
298
- # If no span is active, or if the active span is not a custom span with given type, returns nil.
306
+ # The active, unfinished custom (i.e. not test/suite/module/session) span.
307
+ # If no span is active, or if the active span is not a custom span, returns nil.
299
308
  #
300
309
  # The active span belongs to an {.active_test}.
301
310
  #
@@ -304,22 +313,21 @@ module Datadog
304
313
  # ```
305
314
  # # start span
306
315
  # Datadog::CI.trace(
307
- # "step",
308
316
  # "Given I have 42 cucumbers",
317
+ # type: "step",
309
318
  # tags: {}
310
319
  # )
311
320
  #
312
- # # somewhere else, access the active "step" span
313
- # step_span = Datadog::CI.active_span("step")
321
+ # # somewhere else, access the active step span
322
+ # step_span = Datadog::CI.active_span
314
323
  # step_span.finish()
315
324
  # ```
316
325
  #
317
- # @param [String] span_type type of the span to retrieve (for example "step" or "query") that was provided to {.trace}
318
326
  # @return [Datadog::CI::Span] the active span
319
- # @return [nil] if no span is active, or if the active span is not a custom span with given type
320
- def active_span(span_type)
327
+ # @return [nil] if no span is active, or if the active span is not a custom span
328
+ def active_span
321
329
  span = recorder.active_span
322
- span if span && span.span_type == span_type
330
+ span if span && !Ext::AppTypes::CI_SPAN_TYPES.include?(span.type)
323
331
  end
324
332
 
325
333
  # The active, unfinished test span.
@@ -347,30 +355,6 @@ module Datadog
347
355
  recorder.active_test
348
356
  end
349
357
 
350
- # Internal only, to finish a test use {Datadog::CI::Test#finish}
351
- # @private
352
- def deactivate_test(test)
353
- recorder.deactivate_test(test)
354
- end
355
-
356
- # Internal only, to finish a test session use {Datadog::CI::TestSession#finish}
357
- # @private
358
- def deactivate_test_session
359
- recorder.deactivate_test_session
360
- end
361
-
362
- # Internal only, to finish a test module use {Datadog::CI::TestModule#finish}
363
- # @private
364
- def deactivate_test_module
365
- recorder.deactivate_test_module
366
- end
367
-
368
- # Internal only, to finish a test suite use {Datadog::CI::TestSuite#finish}
369
- # @private
370
- def deactivate_test_suite(test_suite_name)
371
- recorder.deactivate_test_suite(test_suite_name)
372
- end
373
-
374
358
  private
375
359
 
376
360
  def components
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: 0.6.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Datadog, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-03 00:00:00.000000000 Z
11
+ date: 2024-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -42,6 +42,9 @@ files:
42
42
  - NOTICE
43
43
  - README.md
44
44
  - lib/datadog/ci.rb
45
+ - lib/datadog/ci/codeowners/matcher.rb
46
+ - lib/datadog/ci/codeowners/parser.rb
47
+ - lib/datadog/ci/codeowners/rule.rb
45
48
  - lib/datadog/ci/concurrent_span.rb
46
49
  - lib/datadog/ci/configuration/components.rb
47
50
  - lib/datadog/ci/configuration/extensions.rb
@@ -59,8 +62,9 @@ files:
59
62
  - lib/datadog/ci/contrib/minitest/hooks.rb
60
63
  - lib/datadog/ci/contrib/minitest/integration.rb
61
64
  - lib/datadog/ci/contrib/minitest/patcher.rb
62
- - lib/datadog/ci/contrib/minitest/plugin.rb
65
+ - lib/datadog/ci/contrib/minitest/reporter.rb
63
66
  - lib/datadog/ci/contrib/minitest/runnable.rb
67
+ - lib/datadog/ci/contrib/minitest/runner.rb
64
68
  - lib/datadog/ci/contrib/rspec/configuration/settings.rb
65
69
  - lib/datadog/ci/contrib/rspec/example.rb
66
70
  - lib/datadog/ci/contrib/rspec/example_group.rb
@@ -94,7 +98,7 @@ files:
94
98
  - lib/datadog/ci/ext/settings.rb
95
99
  - lib/datadog/ci/ext/test.rb
96
100
  - lib/datadog/ci/ext/transport.rb
97
- - lib/datadog/ci/null_span.rb
101
+ - lib/datadog/ci/itr/runner.rb
98
102
  - lib/datadog/ci/span.rb
99
103
  - lib/datadog/ci/test.rb
100
104
  - lib/datadog/ci/test_module.rb
@@ -115,100 +119,18 @@ files:
115
119
  - lib/datadog/ci/test_visibility/serializers/test_v1.rb
116
120
  - lib/datadog/ci/test_visibility/serializers/test_v2.rb
117
121
  - lib/datadog/ci/test_visibility/transport.rb
122
+ - lib/datadog/ci/transport/api/agentless.rb
118
123
  - lib/datadog/ci/transport/api/base.rb
119
124
  - lib/datadog/ci/transport/api/builder.rb
120
- - lib/datadog/ci/transport/api/ci_test_cycle.rb
121
125
  - lib/datadog/ci/transport/api/evp_proxy.rb
122
126
  - lib/datadog/ci/transport/gzip.rb
123
127
  - lib/datadog/ci/transport/http.rb
128
+ - lib/datadog/ci/transport/remote_settings_api.rb
129
+ - lib/datadog/ci/utils/configuration.rb
124
130
  - lib/datadog/ci/utils/git.rb
125
131
  - lib/datadog/ci/utils/test_run.rb
126
132
  - lib/datadog/ci/utils/url.rb
127
133
  - lib/datadog/ci/version.rb
128
- - sig/datadog/ci.rbs
129
- - sig/datadog/ci/concurrent_span.rbs
130
- - sig/datadog/ci/configuration/components.rbs
131
- - sig/datadog/ci/configuration/extensions.rbs
132
- - sig/datadog/ci/configuration/settings.rbs
133
- - sig/datadog/ci/contrib/cucumber/configuration/settings.rbs
134
- - sig/datadog/ci/contrib/cucumber/ext.rbs
135
- - sig/datadog/ci/contrib/cucumber/formatter.rbs
136
- - sig/datadog/ci/contrib/cucumber/instrumentation.rbs
137
- - sig/datadog/ci/contrib/cucumber/integration.rbs
138
- - sig/datadog/ci/contrib/cucumber/patcher.rbs
139
- - sig/datadog/ci/contrib/integration.rbs
140
- - sig/datadog/ci/contrib/minitest/configuration/settings.rbs
141
- - sig/datadog/ci/contrib/minitest/ext.rbs
142
- - sig/datadog/ci/contrib/minitest/helpers.rbs
143
- - sig/datadog/ci/contrib/minitest/hooks.rbs
144
- - sig/datadog/ci/contrib/minitest/integration.rbs
145
- - sig/datadog/ci/contrib/minitest/patcher.rbs
146
- - sig/datadog/ci/contrib/minitest/plugin.rbs
147
- - sig/datadog/ci/contrib/minitest/runnable.rbs
148
- - sig/datadog/ci/contrib/rspec/configuration/settings.rbs
149
- - sig/datadog/ci/contrib/rspec/example.rbs
150
- - sig/datadog/ci/contrib/rspec/example_group.rbs
151
- - sig/datadog/ci/contrib/rspec/ext.rbs
152
- - sig/datadog/ci/contrib/rspec/integration.rbs
153
- - sig/datadog/ci/contrib/rspec/patcher.rbs
154
- - sig/datadog/ci/contrib/rspec/runner.rbs
155
- - sig/datadog/ci/contrib/settings.rbs
156
- - sig/datadog/ci/ext/app_types.rbs
157
- - sig/datadog/ci/ext/environment.rbs
158
- - sig/datadog/ci/ext/environment/extractor.rbs
159
- - sig/datadog/ci/ext/environment/providers.rbs
160
- - sig/datadog/ci/ext/environment/providers/appveyor.rbs
161
- - sig/datadog/ci/ext/environment/providers/aws_code_pipeline.rbs
162
- - sig/datadog/ci/ext/environment/providers/azure.rbs
163
- - sig/datadog/ci/ext/environment/providers/base.rbs
164
- - sig/datadog/ci/ext/environment/providers/bitbucket.rbs
165
- - sig/datadog/ci/ext/environment/providers/bitrise.rbs
166
- - sig/datadog/ci/ext/environment/providers/buddy.rbs
167
- - sig/datadog/ci/ext/environment/providers/buildkite.rbs
168
- - sig/datadog/ci/ext/environment/providers/circleci.rbs
169
- - sig/datadog/ci/ext/environment/providers/codefresh.rbs
170
- - sig/datadog/ci/ext/environment/providers/github_actions.rbs
171
- - sig/datadog/ci/ext/environment/providers/gitlab.rbs
172
- - sig/datadog/ci/ext/environment/providers/jenkins.rbs
173
- - sig/datadog/ci/ext/environment/providers/local_git.rbs
174
- - sig/datadog/ci/ext/environment/providers/teamcity.rbs
175
- - sig/datadog/ci/ext/environment/providers/travis.rbs
176
- - sig/datadog/ci/ext/environment/providers/user_defined_tags.rbs
177
- - sig/datadog/ci/ext/git.rbs
178
- - sig/datadog/ci/ext/settings.rbs
179
- - sig/datadog/ci/ext/test.rbs
180
- - sig/datadog/ci/ext/transport.rbs
181
- - sig/datadog/ci/null_span.rbs
182
- - sig/datadog/ci/span.rbs
183
- - sig/datadog/ci/test.rbs
184
- - sig/datadog/ci/test_module.rbs
185
- - sig/datadog/ci/test_session.rbs
186
- - sig/datadog/ci/test_suite.rbs
187
- - sig/datadog/ci/test_visibility/context/global.rbs
188
- - sig/datadog/ci/test_visibility/context/local.rbs
189
- - sig/datadog/ci/test_visibility/flush.rbs
190
- - sig/datadog/ci/test_visibility/null_recorder.rbs
191
- - sig/datadog/ci/test_visibility/recorder.rbs
192
- - sig/datadog/ci/test_visibility/serializers/base.rbs
193
- - sig/datadog/ci/test_visibility/serializers/factories/test_level.rbs
194
- - sig/datadog/ci/test_visibility/serializers/factories/test_suite_level.rbs
195
- - sig/datadog/ci/test_visibility/serializers/span.rbs
196
- - sig/datadog/ci/test_visibility/serializers/test_module.rbs
197
- - sig/datadog/ci/test_visibility/serializers/test_session.rbs
198
- - sig/datadog/ci/test_visibility/serializers/test_suite.rbs
199
- - sig/datadog/ci/test_visibility/serializers/test_v1.rbs
200
- - sig/datadog/ci/test_visibility/serializers/test_v2.rbs
201
- - sig/datadog/ci/test_visibility/transport.rbs
202
- - sig/datadog/ci/transport/api/base.rbs
203
- - sig/datadog/ci/transport/api/builder.rbs
204
- - sig/datadog/ci/transport/api/ci_test_cycle.rbs
205
- - sig/datadog/ci/transport/api/evp_proxy.rbs
206
- - sig/datadog/ci/transport/gzip.rbs
207
- - sig/datadog/ci/transport/http.rbs
208
- - sig/datadog/ci/utils/git.rbs
209
- - sig/datadog/ci/utils/test_run.rbs
210
- - sig/datadog/ci/utils/url.rbs
211
- - sig/datadog/ci/version.rbs
212
134
  homepage: https://github.com/DataDog/datadog-ci-rb
213
135
  licenses:
214
136
  - BSD-3-Clause
@@ -235,7 +157,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
235
157
  - !ruby/object:Gem::Version
236
158
  version: 2.0.0
237
159
  requirements: []
238
- rubygems_version: 3.4.22
160
+ rubygems_version: 3.5.3
239
161
  signing_key:
240
162
  specification_version: 4
241
163
  summary: Datadog CI visibility for your ruby application
@@ -1,73 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "weakref"
4
-
5
- require_relative "../../ext/test"
6
- require_relative "ext"
7
-
8
- module Datadog
9
- module CI
10
- module Contrib
11
- module Minitest
12
- module Plugin
13
- def self.included(base)
14
- base.extend(ClassMethods)
15
- end
16
-
17
- class DatadogReporter < ::Minitest::AbstractReporter
18
- def initialize(minitest_reporter)
19
- # This creates circular reference as minitest_reporter also holds reference to DatadogReporter.
20
- # To make sure that minitest_reporter can be garbage collected, we use WeakRef.
21
- @reporter = WeakRef.new(minitest_reporter)
22
- end
23
-
24
- def report
25
- active_test_session = CI.active_test_session
26
- active_test_module = CI.active_test_module
27
-
28
- return unless @reporter.weakref_alive?
29
- return if active_test_session.nil? || active_test_module.nil?
30
-
31
- if @reporter.passed?
32
- active_test_module.passed!
33
- active_test_session.passed!
34
- else
35
- active_test_module.failed!
36
- active_test_session.failed!
37
- end
38
-
39
- active_test_module.finish
40
- active_test_session.finish
41
-
42
- nil
43
- end
44
- end
45
-
46
- module ClassMethods
47
- def plugin_datadog_ci_init(*)
48
- return unless datadog_configuration[:enabled]
49
-
50
- test_session = CI.start_test_session(
51
- tags: {
52
- CI::Ext::Test::TAG_FRAMEWORK => Ext::FRAMEWORK,
53
- CI::Ext::Test::TAG_FRAMEWORK_VERSION => CI::Contrib::Minitest::Integration.version.to_s,
54
- CI::Ext::Test::TAG_TYPE => CI::Ext::Test::TEST_TYPE
55
- },
56
- service: datadog_configuration[:service_name]
57
- )
58
- CI.start_test_module(test_session.name)
59
-
60
- reporter.reporters << DatadogReporter.new(reporter)
61
- end
62
-
63
- private
64
-
65
- def datadog_configuration
66
- Datadog.configuration.ci[:minitest]
67
- end
68
- end
69
- end
70
- end
71
- end
72
- end
73
- end
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "datadog/tracing/span_operation"
4
-
5
- module Datadog
6
- module CI
7
- # Represents an ignored span when CI visibility is disabled.
8
- # Replaces all methods with no-op.
9
- #
10
- # @public_api
11
- class NullSpan < Span
12
- def initialize
13
- super(Datadog::Tracing::SpanOperation.new("null.span"))
14
- end
15
-
16
- def id
17
- end
18
-
19
- def name
20
- end
21
-
22
- def service
23
- end
24
-
25
- def span_type
26
- end
27
-
28
- def passed!
29
- end
30
-
31
- def failed!(exception: nil)
32
- end
33
-
34
- def skipped!(exception: nil, reason: nil)
35
- end
36
-
37
- def get_tag(key)
38
- end
39
-
40
- def set_tag(key, value)
41
- end
42
-
43
- def set_metric(key, value)
44
- end
45
-
46
- def finish
47
- end
48
-
49
- def set_tags(tags)
50
- end
51
-
52
- def set_environment_runtime_tags
53
- end
54
-
55
- def set_default_tags
56
- end
57
-
58
- def to_s
59
- self.class.to_s
60
- end
61
- end
62
- end
63
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "base"
4
- require_relative "../../ext/transport"
5
-
6
- module Datadog
7
- module CI
8
- module Transport
9
- module Api
10
- class CiTestCycle < Base
11
- attr_reader :api_key
12
-
13
- def initialize(api_key:, http:)
14
- @api_key = api_key
15
-
16
- super(http: http)
17
- end
18
-
19
- private
20
-
21
- def headers
22
- headers = super
23
- headers[Ext::Transport::HEADER_DD_API_KEY] = api_key
24
- headers
25
- end
26
- end
27
- end
28
- end
29
- end
30
- end
@@ -1,23 +0,0 @@
1
- module Datadog
2
- module CI
3
- class ConcurrentSpan < Span
4
- @mutex: Thread::Mutex
5
-
6
- def initialize: (Datadog::Tracing::SpanOperation tracer_span) -> void
7
- def passed!: () -> void
8
- def failed!: (?exception: untyped?) -> void
9
- def skipped!: (?exception: untyped?, ?reason: String?) -> void
10
- def get_tag: (String key) -> untyped?
11
- def set_tag: (String key, untyped? value) -> void
12
- def set_metric: (String key, untyped value) -> void
13
- def finish: () -> void
14
- def set_tags: (Hash[untyped, untyped] tags) -> void
15
-
16
- def set_environment_runtime_tags: () -> void
17
-
18
- def set_default_tags: () -> void
19
-
20
- def synchronize: () { () -> untyped } -> untyped
21
- end
22
- end
23
- end
@@ -1,21 +0,0 @@
1
- module Datadog
2
- module CI
3
- module Configuration
4
- module Components : Datadog::Core::Configuration::Components
5
- @ci_recorder: Datadog::CI::TestVisibility::Recorder
6
-
7
- attr_reader ci_recorder: Datadog::CI::TestVisibility::Recorder
8
-
9
- def initialize: (untyped settings) -> void
10
-
11
- def activate_ci!: (untyped settings) -> untyped
12
-
13
- def build_agentless_transport: (untyped settings) -> Datadog::CI::TestVisibility::Transport?
14
- def build_evp_proxy_transport: (untyped settings, untyped agent_settings) -> Datadog::CI::TestVisibility::Transport
15
- def can_use_evp_proxy?: (untyped settings, untyped agent_settings) -> bool
16
- def serializers_factory: (untyped settings) -> (singleton(Datadog::CI::TestVisibility::Serializers::Factories::TestSuiteLevel) | singleton(Datadog::CI::TestVisibility::Serializers::Factories::TestLevel))
17
- def check_dd_site: (untyped settings) -> void
18
- end
19
- end
20
- end
21
- end
@@ -1,9 +0,0 @@
1
- module Datadog
2
- module CI
3
- module Configuration
4
- module Extensions
5
- def self.activate!: () -> untyped
6
- end
7
- end
8
- end
9
- end