datadog-ci 1.0.0.beta1 → 1.0.0.beta3

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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +105 -60
  3. data/README.md +37 -46
  4. data/lib/datadog/ci/configuration/components.rb +51 -9
  5. data/lib/datadog/ci/configuration/settings.rb +6 -0
  6. data/lib/datadog/ci/contrib/cucumber/formatter.rb +10 -5
  7. data/lib/datadog/ci/contrib/cucumber/patcher.rb +3 -0
  8. data/lib/datadog/ci/contrib/cucumber/step.rb +27 -0
  9. data/lib/datadog/ci/contrib/minitest/patcher.rb +2 -2
  10. data/lib/datadog/ci/contrib/minitest/test.rb +105 -0
  11. data/lib/datadog/ci/contrib/rspec/example.rb +11 -5
  12. data/lib/datadog/ci/ext/environment/providers/local_git.rb +8 -79
  13. data/lib/datadog/ci/ext/environment.rb +11 -16
  14. data/lib/datadog/ci/ext/settings.rb +1 -0
  15. data/lib/datadog/ci/ext/test.rb +8 -1
  16. data/lib/datadog/ci/ext/transport.rb +8 -0
  17. data/lib/datadog/ci/git/local_repository.rb +238 -0
  18. data/lib/datadog/ci/git/packfiles.rb +70 -0
  19. data/lib/datadog/ci/git/search_commits.rb +77 -0
  20. data/lib/datadog/ci/git/tree_uploader.rb +90 -0
  21. data/lib/datadog/ci/git/upload_packfile.rb +66 -0
  22. data/lib/datadog/ci/git/user.rb +29 -0
  23. data/lib/datadog/ci/itr/coverage/event.rb +18 -1
  24. data/lib/datadog/ci/itr/coverage/writer.rb +114 -0
  25. data/lib/datadog/ci/itr/runner.rb +134 -11
  26. data/lib/datadog/ci/itr/skippable.rb +108 -0
  27. data/lib/datadog/ci/span.rb +16 -0
  28. data/lib/datadog/ci/test.rb +37 -12
  29. data/lib/datadog/ci/test_module.rb +2 -2
  30. data/lib/datadog/ci/test_session.rb +2 -2
  31. data/lib/datadog/ci/test_suite.rb +2 -2
  32. data/lib/datadog/ci/test_visibility/null_recorder.rb +4 -1
  33. data/lib/datadog/ci/test_visibility/recorder.rb +47 -9
  34. data/lib/datadog/ci/test_visibility/serializers/base.rb +3 -2
  35. data/lib/datadog/ci/test_visibility/serializers/factories/test_level.rb +3 -3
  36. data/lib/datadog/ci/test_visibility/serializers/factories/test_suite_level.rb +6 -6
  37. data/lib/datadog/ci/test_visibility/serializers/test_v2.rb +14 -2
  38. data/lib/datadog/ci/test_visibility/transport.rb +6 -2
  39. data/lib/datadog/ci/transport/http.rb +24 -4
  40. data/lib/datadog/ci/transport/remote_settings_api.rb +14 -6
  41. data/lib/datadog/ci/utils/configuration.rb +2 -2
  42. data/lib/datadog/ci/utils/git.rb +6 -67
  43. data/lib/datadog/ci/utils/parsing.rb +16 -0
  44. data/lib/datadog/ci/utils/test_run.rb +25 -0
  45. data/lib/datadog/ci/version.rb +1 -1
  46. data/lib/datadog/ci/worker.rb +35 -0
  47. data/lib/datadog/ci.rb +4 -0
  48. metadata +17 -6
  49. data/lib/datadog/ci/contrib/minitest/hooks.rb +0 -75
@@ -13,13 +13,14 @@ require_relative "../codeowners/parser"
13
13
  require_relative "../ext/app_types"
14
14
  require_relative "../ext/test"
15
15
  require_relative "../ext/environment"
16
- require_relative "../utils/git"
16
+ require_relative "../git/local_repository"
17
17
 
18
18
  require_relative "../span"
19
19
  require_relative "../test"
20
20
  require_relative "../test_session"
21
21
  require_relative "../test_module"
22
22
  require_relative "../test_suite"
23
+ require_relative "../worker"
23
24
 
24
25
  module Datadog
25
26
  module CI
@@ -30,8 +31,11 @@ module Datadog
30
31
  attr_reader :environment_tags, :test_suite_level_visibility_enabled
31
32
 
32
33
  def initialize(
33
- itr:, remote_settings_api:, test_suite_level_visibility_enabled: false,
34
- codeowners: Codeowners::Parser.new(Utils::Git.root).parse
34
+ itr:,
35
+ remote_settings_api:,
36
+ git_tree_upload_worker: DummyWorker.new,
37
+ test_suite_level_visibility_enabled: false,
38
+ codeowners: Codeowners::Parser.new(Git::LocalRepository.root).parse
35
39
  )
36
40
  @test_suite_level_visibility_enabled = test_suite_level_visibility_enabled
37
41
 
@@ -43,6 +47,11 @@ module Datadog
43
47
 
44
48
  @itr = itr
45
49
  @remote_settings_api = remote_settings_api
50
+ @git_tree_upload_worker = git_tree_upload_worker
51
+ end
52
+
53
+ def shutdown!
54
+ @git_tree_upload_worker.stop
46
55
  end
47
56
 
48
57
  def start_test_session(service: nil, tags: {})
@@ -56,6 +65,7 @@ module Datadog
56
65
 
57
66
  test_session = build_test_session(tracer_span, tags)
58
67
 
68
+ @git_tree_upload_worker.perform(test_session.git_repository_url)
59
69
  configure_library(test_session)
60
70
 
61
71
  test_session
@@ -117,21 +127,18 @@ module Datadog
117
127
  test = build_test(tracer_span, tags)
118
128
 
119
129
  @local_context.activate_test(test) do
120
- @itr.start_coverage
121
-
130
+ on_test_started(test)
122
131
  res = block.call(test)
123
132
  on_test_finished(test)
124
-
125
133
  res
126
134
  end
127
135
  end
128
136
  else
129
137
  tracer_span = start_datadog_tracer_span(test_name, span_options)
130
-
131
138
  test = build_test(tracer_span, tags)
132
139
 
133
140
  @local_context.activate_test(test)
134
- @itr.start_coverage
141
+ on_test_started(test)
135
142
 
136
143
  test
137
144
  end
@@ -184,6 +191,9 @@ module Datadog
184
191
  end
185
192
 
186
193
  def deactivate_test_session
194
+ test_session = active_test_session
195
+ on_test_session_finished(test_session) if test_session
196
+
187
197
  @global_context.deactivate_test_session!
188
198
  end
189
199
 
@@ -206,7 +216,25 @@ module Datadog
206
216
  return unless itr_enabled?
207
217
 
208
218
  remote_configuration = @remote_settings_api.fetch_library_settings(test_session)
209
- @itr.configure(remote_configuration.payload, test_session)
219
+ # sometimes we can skip code coverage for default branch if there are no changes in the repository
220
+ # backend needs git metadata uploaded for this test session to check if we can skip code coverage
221
+ if remote_configuration.require_git?
222
+ Datadog.logger.debug { "Library configuration endpoint requires git upload to be finished, waiting..." }
223
+ @git_tree_upload_worker.wait_until_done
224
+
225
+ Datadog.logger.debug { "Requesting library configuration again..." }
226
+ remote_configuration = @remote_settings_api.fetch_library_settings(test_session)
227
+
228
+ if remote_configuration.require_git?
229
+ Datadog.logger.debug { "git metadata upload did not complete in time when configuring library" }
230
+ end
231
+ end
232
+
233
+ @itr.configure(
234
+ remote_configuration.payload,
235
+ test_session: test_session,
236
+ git_tree_upload_worker: @git_tree_upload_worker
237
+ )
210
238
  end
211
239
 
212
240
  def skip_tracing(block = nil)
@@ -373,6 +401,16 @@ module Datadog
373
401
  # TODO: use kind of event system to notify about test finished?
374
402
  def on_test_finished(test)
375
403
  @itr.stop_coverage(test)
404
+ @itr.count_skipped_test(test)
405
+ end
406
+
407
+ def on_test_started(test)
408
+ @itr.mark_if_skippable(test)
409
+ @itr.start_coverage(test)
410
+ end
411
+
412
+ def on_test_session_finished(test_session)
413
+ @itr.write_test_session_tags(test_session)
376
414
  end
377
415
  end
378
416
  end
@@ -28,11 +28,12 @@ module Datadog
28
28
  "duration"
29
29
  ].freeze
30
30
 
31
- attr_reader :trace, :span, :meta
31
+ attr_reader :trace, :span, :meta, :options
32
32
 
33
- def initialize(trace, span)
33
+ def initialize(trace, span, options: {})
34
34
  @trace = trace
35
35
  @span = span
36
+ @options = options
36
37
 
37
38
  @meta = @span.meta.reject { |key, _| Ext::Test::TRANSIENT_TAGS.include?(key) }
38
39
 
@@ -14,12 +14,12 @@ module Datadog
14
14
  module TestLevel
15
15
  module_function
16
16
 
17
- def serializer(trace, span)
17
+ def serializer(trace, span, options: {})
18
18
  case span.type
19
19
  when Datadog::CI::Ext::AppTypes::TYPE_TEST
20
- Serializers::TestV1.new(trace, span)
20
+ Serializers::TestV1.new(trace, span, options: options)
21
21
  else
22
- Serializers::Span.new(trace, span)
22
+ Serializers::Span.new(trace, span, options: options)
23
23
  end
24
24
  end
25
25
  end
@@ -15,18 +15,18 @@ module Datadog
15
15
  module TestSuiteLevel
16
16
  module_function
17
17
 
18
- def serializer(trace, span)
18
+ def serializer(trace, span, options: {})
19
19
  case span.type
20
20
  when Datadog::CI::Ext::AppTypes::TYPE_TEST
21
- Serializers::TestV2.new(trace, span)
21
+ Serializers::TestV2.new(trace, span, options: options)
22
22
  when Datadog::CI::Ext::AppTypes::TYPE_TEST_SESSION
23
- Serializers::TestSession.new(trace, span)
23
+ Serializers::TestSession.new(trace, span, options: options)
24
24
  when Datadog::CI::Ext::AppTypes::TYPE_TEST_MODULE
25
- Serializers::TestModule.new(trace, span)
25
+ Serializers::TestModule.new(trace, span, options: options)
26
26
  when Datadog::CI::Ext::AppTypes::TYPE_TEST_SUITE
27
- Serializers::TestSuite.new(trace, span)
27
+ Serializers::TestSuite.new(trace, span, options: options)
28
28
  else
29
- Serializers::Span.new(trace, span)
29
+ Serializers::Span.new(trace, span, options: options)
30
30
  end
31
31
  end
32
32
  end
@@ -10,22 +10,34 @@ module Datadog
10
10
  class TestV2 < TestV1
11
11
  CONTENT_FIELDS = (["test_session_id", "test_module_id", "test_suite_id"] + TestV1::CONTENT_FIELDS).freeze
12
12
 
13
+ CONTENT_FIELDS_WITH_ITR_CORRELATION_ID = (CONTENT_FIELDS + ["itr_correlation_id"]).freeze
14
+
13
15
  CONTENT_MAP_SIZE = calculate_content_map_size(CONTENT_FIELDS)
14
16
 
17
+ CONTENT_MAP_SIZE_WITH_ITR_CORRELATION_ID = calculate_content_map_size(CONTENT_FIELDS_WITH_ITR_CORRELATION_ID)
18
+
15
19
  REQUIRED_FIELDS = (["test_session_id", "test_module_id", "test_suite_id"] + TestV1::REQUIRED_FIELDS).freeze
16
20
 
17
21
  def content_fields
18
- CONTENT_FIELDS
22
+ return CONTENT_FIELDS if itr_correlation_id.nil?
23
+
24
+ CONTENT_FIELDS_WITH_ITR_CORRELATION_ID
19
25
  end
20
26
 
21
27
  def content_map_size
22
- CONTENT_MAP_SIZE
28
+ return CONTENT_MAP_SIZE if itr_correlation_id.nil?
29
+
30
+ CONTENT_MAP_SIZE_WITH_ITR_CORRELATION_ID
23
31
  end
24
32
 
25
33
  def version
26
34
  2
27
35
  end
28
36
 
37
+ def itr_correlation_id
38
+ options[:itr_correlation_id]
39
+ end
40
+
29
41
  private
30
42
 
31
43
  def required_fields
@@ -14,7 +14,7 @@ module Datadog
14
14
 
15
15
  def initialize(
16
16
  api:,
17
- dd_env: nil,
17
+ dd_env:,
18
18
  serializers_factory: Datadog::CI::TestVisibility::Serializers::Factories::TestLevel,
19
19
  max_payload_size: DEFAULT_MAX_PAYLOAD_SIZE
20
20
  )
@@ -45,7 +45,7 @@ module Datadog
45
45
  end
46
46
 
47
47
  def encode_span(trace, span)
48
- serializer = serializers_factory.serializer(trace, span)
48
+ serializer = serializers_factory.serializer(trace, span, options: {itr_correlation_id: itr&.correlation_id})
49
49
 
50
50
  if serializer.valid?
51
51
  encoded = encoder.encode(serializer)
@@ -98,6 +98,10 @@ module Datadog
98
98
 
99
99
  packer.write("events")
100
100
  end
101
+
102
+ def itr
103
+ @itr ||= Datadog::CI.send(:itr_runner)
104
+ end
101
105
  end
102
106
  end
103
107
  end
@@ -4,6 +4,7 @@ require "delegate"
4
4
  require "datadog/core/transport/http/adapters/net"
5
5
  require "datadog/core/transport/http/env"
6
6
  require "datadog/core/transport/request"
7
+ require "socket"
7
8
 
8
9
  require_relative "gzip"
9
10
  require_relative "../ext/transport"
@@ -20,6 +21,8 @@ module Datadog
20
21
  :compress
21
22
 
22
23
  DEFAULT_TIMEOUT = 30
24
+ MAX_RETRIES = 3
25
+ INITIAL_BACKOFF = 1
23
26
 
24
27
  def initialize(host:, timeout: DEFAULT_TIMEOUT, port: nil, ssl: true, compress: false)
25
28
  @host = host
@@ -29,7 +32,7 @@ module Datadog
29
32
  @compress = compress.nil? ? false : compress
30
33
  end
31
34
 
32
- def request(path:, payload:, headers:, verb: "post")
35
+ def request(path:, payload:, headers:, verb: "post", retries: MAX_RETRIES, backoff: INITIAL_BACKOFF)
33
36
  if compress
34
37
  headers[Ext::Transport::HEADER_CONTENT_ENCODING] = Ext::Transport::CONTENT_ENCODING_GZIP
35
38
  payload = Gzip.compress(payload)
@@ -41,9 +44,7 @@ module Datadog
41
44
  end
42
45
 
43
46
  response = ResponseDecorator.new(
44
- adapter.call(
45
- build_env(path: path, payload: payload, headers: headers, verb: verb)
46
- )
47
+ perform_http_call(path: path, payload: payload, headers: headers, verb: verb, retries: retries, backoff: backoff)
47
48
  )
48
49
 
49
50
  Datadog.logger.debug do
@@ -55,6 +56,25 @@ module Datadog
55
56
 
56
57
  private
57
58
 
59
+ def perform_http_call(path:, payload:, headers:, verb:, retries: MAX_RETRIES, backoff: INITIAL_BACKOFF)
60
+ adapter.call(
61
+ build_env(path: path, payload: payload, headers: headers, verb: verb)
62
+ )
63
+ rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, SocketError, Net::HTTPBadResponse => e
64
+ Datadog.logger.debug("Failed to send request with #{e} (#{e.message})")
65
+
66
+ if retries.positive?
67
+ sleep(backoff)
68
+
69
+ perform_http_call(
70
+ path: path, payload: payload, headers: headers, verb: verb, retries: retries - 1, backoff: backoff * 2
71
+ )
72
+ else
73
+ Datadog.logger.error("Failed to send request after #{MAX_RETRIES} retries")
74
+ raise e
75
+ end
76
+ end
77
+
58
78
  def build_env(path:, payload:, headers:, verb:)
59
79
  env = Datadog::Core::Transport::HTTP::Env.new(
60
80
  Datadog::Core::Transport::Request.new
@@ -5,6 +5,7 @@ require "json"
5
5
  require "datadog/core/environment/identity"
6
6
 
7
7
  require_relative "../ext/transport"
8
+ require_relative "../utils/parsing"
8
9
 
9
10
  module Datadog
10
11
  module CI
@@ -28,7 +29,7 @@ module Datadog
28
29
  return cached unless cached.nil?
29
30
 
30
31
  resp = @http_response
31
- return @json = default_payload if resp.nil? || !resp.ok?
32
+ return @json = default_payload if resp.nil? || !ok?
32
33
 
33
34
  begin
34
35
  @json = JSON.parse(resp.payload).dig(*Ext::Transport::DD_API_SETTINGS_RESPONSE_DIG_KEYS) ||
@@ -39,6 +40,10 @@ module Datadog
39
40
  end
40
41
  end
41
42
 
43
+ def require_git?
44
+ Utils::Parsing.convert_to_bool(payload[Ext::Transport::DD_API_SETTINGS_RESPONSE_REQUIRE_GIT_KEY])
45
+ end
46
+
42
47
  private
43
48
 
44
49
  def default_payload
@@ -46,9 +51,10 @@ module Datadog
46
51
  end
47
52
  end
48
53
 
49
- def initialize(api: nil, dd_env: nil)
54
+ def initialize(dd_env:, api: nil, config_tags: {})
50
55
  @api = api
51
56
  @dd_env = dd_env
57
+ @config_tags = config_tags || {}
52
58
  end
53
59
 
54
60
  def fetch_library_settings(test_session)
@@ -81,10 +87,12 @@ module Datadog
81
87
  "sha" => test_session.git_commit_sha,
82
88
  "test_level" => Ext::Test::ITR_TEST_SKIPPING_MODE,
83
89
  "configurations" => {
84
- "os.platform" => test_session.os_platform,
85
- "os.arch" => test_session.os_architecture,
86
- "runtime.name" => test_session.runtime_name,
87
- "runtime.version" => test_session.runtime_version
90
+ Ext::Test::TAG_OS_PLATFORM => test_session.os_platform,
91
+ Ext::Test::TAG_OS_ARCHITECTURE => test_session.os_architecture,
92
+ Ext::Test::TAG_OS_VERSION => test_session.os_version,
93
+ Ext::Test::TAG_RUNTIME_NAME => test_session.runtime_name,
94
+ Ext::Test::TAG_RUNTIME_VERSION => test_session.runtime_version,
95
+ "custom" => @config_tags
88
96
  }
89
97
  }
90
98
  }
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "git"
3
+ require_relative "../git/local_repository"
4
4
 
5
5
  module Datadog
6
6
  module CI
7
7
  module Utils
8
8
  module Configuration
9
9
  def self.fetch_service_name(default)
10
- Datadog.configuration.service_without_fallback || Git.repository_name || default
10
+ Datadog.configuration.service_without_fallback || CI::Git::LocalRepository.repository_name || default
11
11
  end
12
12
  end
13
13
  end
@@ -7,6 +7,12 @@ module Datadog
7
7
  module CI
8
8
  module Utils
9
9
  module Git
10
+ def self.valid_commit_sha?(sha)
11
+ return false if sha.nil?
12
+
13
+ sha.match?(/\A[0-9a-f]{40}\Z/) || sha.match?(/\A[0-9a-f]{64}\Z/)
14
+ end
15
+
10
16
  def self.normalize_ref(ref)
11
17
  return nil if ref.nil?
12
18
 
@@ -19,73 +25,6 @@ module Datadog
19
25
  def self.is_git_tag?(ref)
20
26
  !ref.nil? && ref.include?("tags/")
21
27
  end
22
-
23
- def self.root
24
- return @root if defined?(@root)
25
-
26
- @root = exec_git_command("git rev-parse --show-toplevel") || Dir.pwd
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 = Dir.pwd
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
89
28
  end
90
29
  end
91
30
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+ require "pathname"
5
+
6
+ module Datadog
7
+ module CI
8
+ module Utils
9
+ module Parsing
10
+ def self.convert_to_bool(value)
11
+ value.to_s.downcase == "true"
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -9,6 +9,31 @@ module Datadog
9
9
 
10
10
  @command = "#{$0} #{ARGV.join(" ")}"
11
11
  end
12
+
13
+ def self.skippable_test_id(test_name, suite, parameters = nil)
14
+ "#{suite}.#{test_name}.#{parameters}"
15
+ end
16
+
17
+ def self.test_parameters(arguments: {}, metadata: {})
18
+ JSON.generate(
19
+ {
20
+ arguments: arguments,
21
+ metadata: metadata
22
+ }
23
+ )
24
+ end
25
+
26
+ def self.custom_configuration(env_tags)
27
+ return {} if env_tags.nil?
28
+
29
+ res = {}
30
+ env_tags.each do |tag, value|
31
+ next unless tag.start_with?("test.configuration.")
32
+
33
+ res[tag.sub("test.configuration.", "")] = value
34
+ end
35
+ res
36
+ end
12
37
  end
13
38
  end
14
39
  end
@@ -6,7 +6,7 @@ module Datadog
6
6
  MAJOR = "1"
7
7
  MINOR = "0"
8
8
  PATCH = "0"
9
- PRE = "beta1"
9
+ PRE = "beta3"
10
10
  BUILD = nil
11
11
  # PRE and BUILD above are modified for dev gems during gem build GHA workflow
12
12
 
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "datadog/core/worker"
4
+ require "datadog/core/workers/async"
5
+
6
+ # general purpose async worker for CI
7
+ # executes given task once in separate thread
8
+ module Datadog
9
+ module CI
10
+ class Worker < Datadog::Core::Worker
11
+ include Datadog::Core::Workers::Async::Thread
12
+
13
+ DEFAULT_SHUTDOWN_TIMEOUT = 60
14
+ DEFAULT_WAIT_TIMEOUT = 60
15
+
16
+ def stop(timeout = DEFAULT_SHUTDOWN_TIMEOUT)
17
+ join(timeout)
18
+ end
19
+
20
+ def wait_until_done(timeout = DEFAULT_WAIT_TIMEOUT)
21
+ join(timeout)
22
+ end
23
+
24
+ def done?
25
+ started? && !running?
26
+ end
27
+ end
28
+
29
+ class DummyWorker < Worker
30
+ def initialize
31
+ super { nil }
32
+ end
33
+ end
34
+ end
35
+ end
data/lib/datadog/ci.rb CHANGED
@@ -364,6 +364,10 @@ module Datadog
364
364
  def recorder
365
365
  components.ci_recorder
366
366
  end
367
+
368
+ def itr_runner
369
+ components.itr
370
+ end
367
371
  end
368
372
  end
369
373
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datadog-ci
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta1
4
+ version: 1.0.0.beta3
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-03-25 00:00:00.000000000 Z
11
+ date: 2024-04-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: datadog
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 2.0.0.beta1
19
+ version: 2.0.0.beta2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 2.0.0.beta1
26
+ version: 2.0.0.beta2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: msgpack
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -72,16 +72,17 @@ files:
72
72
  - lib/datadog/ci/contrib/cucumber/instrumentation.rb
73
73
  - lib/datadog/ci/contrib/cucumber/integration.rb
74
74
  - lib/datadog/ci/contrib/cucumber/patcher.rb
75
+ - lib/datadog/ci/contrib/cucumber/step.rb
75
76
  - lib/datadog/ci/contrib/integration.rb
76
77
  - lib/datadog/ci/contrib/minitest/configuration/settings.rb
77
78
  - lib/datadog/ci/contrib/minitest/ext.rb
78
79
  - lib/datadog/ci/contrib/minitest/helpers.rb
79
- - lib/datadog/ci/contrib/minitest/hooks.rb
80
80
  - lib/datadog/ci/contrib/minitest/integration.rb
81
81
  - lib/datadog/ci/contrib/minitest/patcher.rb
82
82
  - lib/datadog/ci/contrib/minitest/reporter.rb
83
83
  - lib/datadog/ci/contrib/minitest/runnable.rb
84
84
  - lib/datadog/ci/contrib/minitest/runner.rb
85
+ - lib/datadog/ci/contrib/minitest/test.rb
85
86
  - lib/datadog/ci/contrib/rspec/configuration/settings.rb
86
87
  - lib/datadog/ci/contrib/rspec/example.rb
87
88
  - lib/datadog/ci/contrib/rspec/example_group.rb
@@ -115,10 +116,18 @@ files:
115
116
  - lib/datadog/ci/ext/settings.rb
116
117
  - lib/datadog/ci/ext/test.rb
117
118
  - lib/datadog/ci/ext/transport.rb
119
+ - lib/datadog/ci/git/local_repository.rb
120
+ - lib/datadog/ci/git/packfiles.rb
121
+ - lib/datadog/ci/git/search_commits.rb
122
+ - lib/datadog/ci/git/tree_uploader.rb
123
+ - lib/datadog/ci/git/upload_packfile.rb
124
+ - lib/datadog/ci/git/user.rb
118
125
  - lib/datadog/ci/itr/coverage/ddcov.rb
119
126
  - lib/datadog/ci/itr/coverage/event.rb
120
127
  - lib/datadog/ci/itr/coverage/transport.rb
128
+ - lib/datadog/ci/itr/coverage/writer.rb
121
129
  - lib/datadog/ci/itr/runner.rb
130
+ - lib/datadog/ci/itr/skippable.rb
122
131
  - lib/datadog/ci/span.rb
123
132
  - lib/datadog/ci/test.rb
124
133
  - lib/datadog/ci/test_module.rb
@@ -149,8 +158,10 @@ files:
149
158
  - lib/datadog/ci/transport/remote_settings_api.rb
150
159
  - lib/datadog/ci/utils/configuration.rb
151
160
  - lib/datadog/ci/utils/git.rb
161
+ - lib/datadog/ci/utils/parsing.rb
152
162
  - lib/datadog/ci/utils/test_run.rb
153
163
  - lib/datadog/ci/version.rb
164
+ - lib/datadog/ci/worker.rb
154
165
  homepage: https://github.com/DataDog/datadog-ci-rb
155
166
  licenses:
156
167
  - BSD-3-Clause
@@ -177,7 +188,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
177
188
  - !ruby/object:Gem::Version
178
189
  version: 2.0.0
179
190
  requirements: []
180
- rubygems_version: 3.5.6
191
+ rubygems_version: 3.5.9
181
192
  signing_key:
182
193
  specification_version: 4
183
194
  summary: Datadog CI visibility for your ruby application