datadog-ci 0.8.3 → 1.0.0.beta2

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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +42 -0
  3. data/LICENSE-3rdparty.csv +1 -1
  4. data/README.md +40 -55
  5. data/ext/datadog_cov/datadog_cov.c +192 -0
  6. data/ext/datadog_cov/extconf.rb +18 -0
  7. data/lib/datadog/ci/configuration/components.rb +43 -9
  8. data/lib/datadog/ci/configuration/settings.rb +7 -1
  9. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +0 -15
  10. data/lib/datadog/ci/contrib/cucumber/ext.rb +1 -5
  11. data/lib/datadog/ci/contrib/cucumber/formatter.rb +13 -18
  12. data/lib/datadog/ci/contrib/cucumber/integration.rb +1 -2
  13. data/lib/datadog/ci/contrib/cucumber/patcher.rb +3 -0
  14. data/lib/datadog/ci/contrib/cucumber/step.rb +27 -0
  15. data/lib/datadog/ci/contrib/minitest/configuration/settings.rb +0 -15
  16. data/lib/datadog/ci/contrib/minitest/ext.rb +1 -5
  17. data/lib/datadog/ci/contrib/minitest/helpers.rb +1 -2
  18. data/lib/datadog/ci/contrib/minitest/hooks.rb +4 -2
  19. data/lib/datadog/ci/contrib/minitest/integration.rb +1 -1
  20. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -15
  21. data/lib/datadog/ci/contrib/rspec/example.rb +25 -23
  22. data/lib/datadog/ci/contrib/rspec/ext.rb +0 -4
  23. data/lib/datadog/ci/contrib/rspec/integration.rb +1 -2
  24. data/lib/datadog/ci/contrib/settings.rb +0 -3
  25. data/lib/datadog/ci/ext/environment/providers/base.rb +1 -1
  26. data/lib/datadog/ci/ext/environment/providers/bitbucket.rb +1 -1
  27. data/lib/datadog/ci/ext/environment/providers/local_git.rb +8 -79
  28. data/lib/datadog/ci/ext/environment.rb +11 -16
  29. data/lib/datadog/ci/ext/settings.rb +1 -0
  30. data/lib/datadog/ci/ext/test.rb +5 -0
  31. data/lib/datadog/ci/ext/transport.rb +12 -0
  32. data/lib/datadog/ci/git/local_repository.rb +238 -0
  33. data/lib/datadog/ci/git/packfiles.rb +70 -0
  34. data/lib/datadog/ci/git/search_commits.rb +77 -0
  35. data/lib/datadog/ci/git/tree_uploader.rb +90 -0
  36. data/lib/datadog/ci/git/upload_packfile.rb +66 -0
  37. data/lib/datadog/ci/git/user.rb +29 -0
  38. data/lib/datadog/ci/itr/coverage/ddcov.rb +14 -0
  39. data/lib/datadog/ci/itr/coverage/event.rb +81 -0
  40. data/lib/datadog/ci/itr/coverage/transport.rb +42 -0
  41. data/lib/datadog/ci/itr/coverage/writer.rb +108 -0
  42. data/lib/datadog/ci/itr/runner.rb +143 -6
  43. data/lib/datadog/ci/itr/skippable.rb +106 -0
  44. data/lib/datadog/ci/span.rb +9 -0
  45. data/lib/datadog/ci/test.rb +20 -14
  46. data/lib/datadog/ci/test_module.rb +2 -2
  47. data/lib/datadog/ci/test_session.rb +2 -2
  48. data/lib/datadog/ci/test_suite.rb +2 -2
  49. data/lib/datadog/ci/test_visibility/context/global.rb +1 -3
  50. data/lib/datadog/ci/test_visibility/null_recorder.rb +5 -2
  51. data/lib/datadog/ci/test_visibility/recorder.rb +63 -8
  52. data/lib/datadog/ci/test_visibility/serializers/base.rb +1 -1
  53. data/lib/datadog/ci/test_visibility/serializers/factories/test_level.rb +1 -1
  54. data/lib/datadog/ci/test_visibility/serializers/factories/test_suite_level.rb +1 -1
  55. data/lib/datadog/ci/test_visibility/transport.rb +11 -54
  56. data/lib/datadog/ci/transport/api/agentless.rb +8 -1
  57. data/lib/datadog/ci/transport/api/base.rb +23 -0
  58. data/lib/datadog/ci/transport/api/builder.rb +9 -1
  59. data/lib/datadog/ci/transport/api/evp_proxy.rb +8 -0
  60. data/lib/datadog/ci/transport/event_platform_transport.rb +88 -0
  61. data/lib/datadog/ci/transport/http.rb +43 -6
  62. data/lib/datadog/ci/transport/remote_settings_api.rb +12 -6
  63. data/lib/datadog/ci/utils/configuration.rb +2 -2
  64. data/lib/datadog/ci/utils/git.rb +6 -67
  65. data/lib/datadog/ci/utils/parsing.rb +16 -0
  66. data/lib/datadog/ci/utils/test_run.rb +13 -0
  67. data/lib/datadog/ci/version.rb +5 -5
  68. data/lib/datadog/ci/worker.rb +35 -0
  69. data/lib/datadog/ci.rb +4 -0
  70. metadata +36 -4
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../ext/test"
4
- require_relative "../../utils/git"
4
+ require_relative "../../git/local_repository"
5
+ require_relative "../../utils/test_run"
5
6
  require_relative "ext"
6
7
 
7
8
  module Datadog
@@ -55,25 +56,26 @@ module Datadog
55
56
  def on_test_case_started(event)
56
57
  test_suite_name = test_suite_name(event.test_case)
57
58
 
59
+ # @type var tags: Hash[String, String]
58
60
  tags = {
59
61
  CI::Ext::Test::TAG_FRAMEWORK => Ext::FRAMEWORK,
60
62
  CI::Ext::Test::TAG_FRAMEWORK_VERSION => CI::Contrib::Cucumber::Integration.version.to_s,
61
- CI::Ext::Test::TAG_SOURCE_FILE => Utils::Git.relative_to_root(event.test_case.location.file),
63
+ CI::Ext::Test::TAG_SOURCE_FILE => Git::LocalRepository.relative_to_root(event.test_case.location.file),
62
64
  CI::Ext::Test::TAG_SOURCE_START => event.test_case.location.line.to_s
63
65
  }
64
66
 
67
+ if (parameters = extract_parameters_hash(event.test_case))
68
+ tags[CI::Ext::Test::TAG_PARAMETERS] = Utils::TestRun.test_parameters(arguments: parameters)
69
+ end
70
+
65
71
  start_test_suite(test_suite_name) unless same_test_suite_as_current?(test_suite_name)
66
72
 
67
- test_span = CI.start_test(
73
+ CI.start_test(
68
74
  event.test_case.name,
69
75
  test_suite_name,
70
76
  tags: tags,
71
77
  service: configuration[:service_name]
72
78
  )
73
-
74
- if test_span && (parameters = extract_parameters_hash(event.test_case))
75
- test_span.set_parameters(parameters)
76
- end
77
79
  end
78
80
 
79
81
  def on_test_case_finished(event)
@@ -100,9 +102,8 @@ module Datadog
100
102
  def test_suite_name(test_case)
101
103
  feature = if test_case.respond_to?(:feature)
102
104
  test_case.feature
103
- elsif @ast_lookup
104
- gherkin_doc = @ast_lookup.gherkin_document(test_case.location.file)
105
- gherkin_doc.feature if gherkin_doc
105
+ else
106
+ @ast_lookup&.gherkin_document(test_case.location.file)&.feature
106
107
  end
107
108
 
108
109
  if feature
@@ -150,19 +151,13 @@ module Datadog
150
151
  end
151
152
 
152
153
  def finish_current_test_suite
153
- test_suite = @current_test_suite
154
- return unless test_suite
155
-
156
- test_suite.finish
154
+ @current_test_suite&.finish
157
155
 
158
156
  @current_test_suite = nil
159
157
  end
160
158
 
161
159
  def same_test_suite_as_current?(test_suite_name)
162
- test_suite = @current_test_suite
163
- return false unless test_suite
164
-
165
- test_suite.name == test_suite_name
160
+ @current_test_suite&.name == test_suite_name
166
161
  end
167
162
 
168
163
  def extract_parameters_hash(test_case)
@@ -17,8 +17,7 @@ module Datadog
17
17
  register_as :cucumber
18
18
 
19
19
  def self.version
20
- Gem.loaded_specs["cucumber"] \
21
- && Gem.loaded_specs["cucumber"].version
20
+ Gem.loaded_specs["cucumber"]&.version
22
21
  end
23
22
 
24
23
  def self.loaded?
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "datadog/tracing/contrib/patcher"
4
+
4
5
  require_relative "instrumentation"
6
+ require_relative "step"
5
7
 
6
8
  module Datadog
7
9
  module CI
@@ -19,6 +21,7 @@ module Datadog
19
21
 
20
22
  def patch
21
23
  ::Cucumber::Runtime.include(Instrumentation)
24
+ ::Cucumber::Core::Test::Step.include(Datadog::CI::Contrib::Cucumber::Step)
22
25
  end
23
26
  end
24
27
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module CI
5
+ module Contrib
6
+ module Cucumber
7
+ # instruments Cucumber::Core::Test::Step from cucumber-ruby-core to change
8
+ module Step
9
+ def self.included(base)
10
+ base.prepend(InstanceMethods)
11
+ end
12
+
13
+ module InstanceMethods
14
+ def execute(*args)
15
+ test_span = CI.active_test
16
+ if test_span&.skipped_by_itr?
17
+ @action.skip(*args)
18
+ else
19
+ super
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -24,21 +24,6 @@ module Datadog
24
24
  Utils::Configuration.fetch_service_name(Ext::DEFAULT_SERVICE_NAME)
25
25
  end
26
26
  end
27
-
28
- # @deprecated Will be removed in 1.0
29
- option :operation_name do |o|
30
- o.type :string
31
- o.env Ext::ENV_OPERATION_NAME
32
- o.default Ext::OPERATION_NAME
33
-
34
- o.after_set do |value|
35
- if value && value != Ext::OPERATION_NAME
36
- Datadog::Core.log_deprecation do
37
- "The operation_name setting has no effect and will be removed in 1.0"
38
- end
39
- end
40
- end
41
- end
42
27
  end
43
28
  end
44
29
  end
@@ -5,17 +5,13 @@ module Datadog
5
5
  module Contrib
6
6
  module Minitest
7
7
  # Minitest integration constants
8
- # TODO: mark as `@public_api` when GA, to protect from resource and tag name changes.
8
+ # @public_api
9
9
  module Ext
10
10
  ENV_ENABLED = "DD_TRACE_MINITEST_ENABLED"
11
11
 
12
12
  FRAMEWORK = "minitest"
13
13
 
14
14
  DEFAULT_SERVICE_NAME = "minitest"
15
-
16
- # TODO: remove in 1.0
17
- ENV_OPERATION_NAME = "DD_TRACE_MINITEST_OPERATION_NAME"
18
- OPERATION_NAME = "minitest.test"
19
15
  end
20
16
  end
21
17
  end
@@ -25,8 +25,7 @@ module Datadog
25
25
  def self.extract_source_location_from_class(klass)
26
26
  return nil if klass.nil? || klass.name.nil?
27
27
 
28
- source_location = klass.const_source_location(klass.name)
29
- source_location.first unless source_location.nil?
28
+ klass.const_source_location(klass.name)&.first
30
29
  rescue
31
30
  nil
32
31
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../ext/test"
4
+ require_relative "../../git/local_repository"
4
5
  require_relative "ext"
5
6
  require_relative "helpers"
6
7
 
@@ -24,17 +25,18 @@ module Datadog
24
25
 
25
26
  source_file, line_number = method(name).source_location
26
27
 
27
- CI.start_test(
28
+ test_span = CI.start_test(
28
29
  name,
29
30
  test_suite_name,
30
31
  tags: {
31
32
  CI::Ext::Test::TAG_FRAMEWORK => Ext::FRAMEWORK,
32
33
  CI::Ext::Test::TAG_FRAMEWORK_VERSION => CI::Contrib::Minitest::Integration.version.to_s,
33
- CI::Ext::Test::TAG_SOURCE_FILE => Utils::Git.relative_to_root(source_file),
34
+ CI::Ext::Test::TAG_SOURCE_FILE => Git::LocalRepository.relative_to_root(source_file),
34
35
  CI::Ext::Test::TAG_SOURCE_START => line_number.to_s
35
36
  },
36
37
  service: datadog_configuration[:service_name]
37
38
  )
39
+ skip(CI::Ext::Test::ITR_TEST_SKIP_REASON) if test_span&.skipped_by_itr?
38
40
  end
39
41
 
40
42
  def after_teardown
@@ -17,7 +17,7 @@ module Datadog
17
17
  register_as :minitest
18
18
 
19
19
  def self.version
20
- Gem.loaded_specs["minitest"] && Gem.loaded_specs["minitest"].version
20
+ Gem.loaded_specs["minitest"]&.version
21
21
  end
22
22
 
23
23
  def self.loaded?
@@ -24,21 +24,6 @@ module Datadog
24
24
  Utils::Configuration.fetch_service_name(Ext::DEFAULT_SERVICE_NAME)
25
25
  end
26
26
  end
27
-
28
- # @deprecated Will be removed in 1.0
29
- option :operation_name do |o|
30
- o.type :string
31
- o.env Ext::ENV_OPERATION_NAME
32
- o.default Ext::OPERATION_NAME
33
-
34
- o.after_set do |value|
35
- if value && value != Ext::OPERATION_NAME
36
- Datadog::Core.log_deprecation do
37
- "The operation_name setting has no effect and will be removed in 1.0"
38
- end
39
- end
40
- end
41
- end
42
27
  end
43
28
  end
44
29
  end
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../../ext/test"
4
- require_relative "../../utils/git"
4
+ require_relative "../../git/local_repository"
5
+ require_relative "../../utils/test_run"
5
6
  require_relative "ext"
6
7
 
7
8
  module Datadog
@@ -41,35 +42,36 @@ module Datadog
41
42
  tags: {
42
43
  CI::Ext::Test::TAG_FRAMEWORK => Ext::FRAMEWORK,
43
44
  CI::Ext::Test::TAG_FRAMEWORK_VERSION => CI::Contrib::RSpec::Integration.version.to_s,
44
- CI::Ext::Test::TAG_SOURCE_FILE => Utils::Git.relative_to_root(metadata[:file_path]),
45
- CI::Ext::Test::TAG_SOURCE_START => metadata[:line_number].to_s
45
+ CI::Ext::Test::TAG_SOURCE_FILE => Git::LocalRepository.relative_to_root(metadata[:file_path]),
46
+ CI::Ext::Test::TAG_SOURCE_START => metadata[:line_number].to_s,
47
+ CI::Ext::Test::TAG_PARAMETERS => Utils::TestRun.test_parameters(
48
+ metadata: {"scoped_id" => metadata[:scoped_id]}
49
+ )
46
50
  },
47
51
  service: datadog_configuration[:service_name]
48
52
  ) do |test_span|
53
+ metadata[:skip] = CI::Ext::Test::ITR_TEST_SKIP_REASON if test_span&.skipped_by_itr?
54
+
49
55
  result = super
50
56
 
51
- if test_span
52
- test_span.set_parameters({}, {"scoped_id" => metadata[:scoped_id]})
53
-
54
- case execution_result.status
55
- when :passed
56
- test_span.passed!
57
- test_suite_span.passed! if test_suite_span
58
- when :failed
59
- test_span.failed!(exception: execution_result.exception)
60
- test_suite_span.failed! if test_suite_span
61
- else
62
- # :pending or nil
63
- test_span.skipped!(
64
- reason: execution_result.pending_message,
65
- exception: execution_result.pending_exception
66
- )
67
-
68
- test_suite_span.skipped! if test_suite_span
69
- end
57
+ case execution_result.status
58
+ when :passed
59
+ test_span&.passed!
60
+ test_suite_span&.passed!
61
+ when :failed
62
+ test_span&.failed!(exception: execution_result.exception)
63
+ test_suite_span&.failed!
64
+ else
65
+ # :pending or nil
66
+ test_span&.skipped!(
67
+ reason: execution_result.pending_message,
68
+ exception: execution_result.pending_exception
69
+ )
70
+
71
+ test_suite_span&.skipped!
70
72
  end
71
73
 
72
- test_suite_span.finish if test_suite_span
74
+ test_suite_span&.finish
73
75
 
74
76
  result
75
77
  end
@@ -11,10 +11,6 @@ module Datadog
11
11
  DEFAULT_SERVICE_NAME = "rspec"
12
12
 
13
13
  ENV_ENABLED = "DD_TRACE_RSPEC_ENABLED"
14
-
15
- # TODO: remove in 1.0
16
- ENV_OPERATION_NAME = "DD_TRACE_RSPEC_OPERATION_NAME"
17
- OPERATION_NAME = "rspec.example"
18
14
  end
19
15
  end
20
16
  end
@@ -17,8 +17,7 @@ module Datadog
17
17
  register_as :rspec
18
18
 
19
19
  def self.version
20
- Gem.loaded_specs["rspec-core"] \
21
- && Gem.loaded_specs["rspec-core"].version
20
+ Gem.loaded_specs["rspec-core"]&.version
22
21
  end
23
22
 
24
23
  def self.loaded?
@@ -11,9 +11,6 @@ module Datadog
11
11
  option :enabled, default: true
12
12
  option :service_name
13
13
 
14
- # @deprecated Will be removed in 1.0
15
- option :operation_name
16
-
17
14
  def configure(options = {})
18
15
  self.class.options.each do |name, _value|
19
16
  self[name] = options[name] if options.key?(name)
@@ -103,7 +103,7 @@ module Datadog
103
103
  @branch = @tag = nil
104
104
 
105
105
  # @type var branch_or_tag_string: untyped
106
- if branch_or_tag_string && branch_or_tag_string.include?("tags/")
106
+ if branch_or_tag_string&.include?("tags/")
107
107
  @tag = branch_or_tag_string
108
108
  else
109
109
  @branch = branch_or_tag_string
@@ -20,7 +20,7 @@ module Datadog
20
20
  end
21
21
 
22
22
  def pipeline_id
23
- env["BITBUCKET_PIPELINE_UUID"] ? env["BITBUCKET_PIPELINE_UUID"].tr("{}", "") : nil
23
+ env["BITBUCKET_PIPELINE_UUID"]&.tr("{}", "")
24
24
  end
25
25
 
26
26
  def pipeline_name
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "base"
4
- require_relative "../../../utils/git"
4
+ require_relative "../../../git/local_repository"
5
5
 
6
6
  module Datadog
7
7
  module CI
@@ -11,48 +11,23 @@ module Datadog
11
11
  # As a fallback we try to fetch git information from the local git repository
12
12
  class LocalGit < Base
13
13
  def git_repository_url
14
- Utils::Git.exec_git_command("git ls-remote --get-url")
15
- rescue => e
16
- Datadog.logger.debug(
17
- "Unable to read git repository url: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
18
- )
19
- nil
14
+ CI::Git::LocalRepository.git_repository_url
20
15
  end
21
16
 
22
17
  def git_commit_sha
23
- Utils::Git.exec_git_command("git rev-parse HEAD")
24
- rescue => e
25
- Datadog.logger.debug(
26
- "Unable to read git commit SHA: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
27
- )
28
- nil
18
+ CI::Git::LocalRepository.git_commit_sha
29
19
  end
30
20
 
31
21
  def git_branch
32
- Utils::Git.exec_git_command("git rev-parse --abbrev-ref HEAD")
33
- rescue => e
34
- Datadog.logger.debug(
35
- "Unable to read git branch: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
36
- )
37
- nil
22
+ CI::Git::LocalRepository.git_branch
38
23
  end
39
24
 
40
25
  def git_tag
41
- Utils::Git.exec_git_command("git tag --points-at HEAD")
42
- rescue => e
43
- Datadog.logger.debug(
44
- "Unable to read git tag: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
45
- )
46
- nil
26
+ CI::Git::LocalRepository.git_tag
47
27
  end
48
28
 
49
29
  def git_commit_message
50
- Utils::Git.exec_git_command("git show -s --format=%s")
51
- rescue => e
52
- Datadog.logger.debug(
53
- "Unable to read git commit message: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
54
- )
55
- nil
30
+ CI::Git::LocalRepository.git_commit_message
56
31
  end
57
32
 
58
33
  def git_commit_author_name
@@ -80,12 +55,7 @@ module Datadog
80
55
  end
81
56
 
82
57
  def workspace_path
83
- Utils::Git.exec_git_command("git rev-parse --show-toplevel")
84
- rescue => e
85
- Datadog.logger.debug(
86
- "Unable to read git base directory: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
87
- )
88
- nil
58
+ CI::Git::LocalRepository.git_root
89
59
  end
90
60
 
91
61
  private
@@ -105,48 +75,7 @@ module Datadog
105
75
  end
106
76
 
107
77
  def set_git_commit_users
108
- # Get committer and author information in one command.
109
- output = Utils::Git.exec_git_command("git show -s --format='%an\t%ae\t%at\t%cn\t%ce\t%ct'")
110
- unless output
111
- Datadog.logger.debug(
112
- "Unable to read git commit users: git command output is nil"
113
- )
114
- @author = @committer = NilUser.new
115
- return
116
- end
117
-
118
- author_name, author_email, author_timestamp,
119
- committer_name, committer_email, committer_timestamp = output.split("\t").each(&:strip!)
120
-
121
- @author = GitUser.new(author_name, author_email, author_timestamp)
122
- @committer = GitUser.new(committer_name, committer_email, committer_timestamp)
123
- rescue => e
124
- Datadog.logger.debug(
125
- "Unable to read git commit users: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
126
- )
127
- @author = @committer = NilUser.new
128
- end
129
-
130
- class GitUser
131
- attr_reader :name, :email, :timestamp
132
-
133
- def initialize(name, email, timestamp)
134
- @name = name
135
- @email = email
136
- @timestamp = timestamp
137
- end
138
-
139
- def date
140
- return nil if timestamp.nil?
141
-
142
- Time.at(timestamp.to_i).utc.to_datetime.iso8601
143
- end
144
- end
145
-
146
- class NilUser < GitUser
147
- def initialize
148
- super(nil, nil, nil)
149
- end
78
+ @author, @committer = CI::Git::LocalRepository.git_commit_users
150
79
  end
151
80
  end
152
81
  end
@@ -3,6 +3,8 @@
3
3
  require_relative "git"
4
4
  require_relative "environment/extractor"
5
5
 
6
+ require_relative "../utils/git"
7
+
6
8
  module Datadog
7
9
  module CI
8
10
  module Ext
@@ -21,8 +23,6 @@ module Datadog
21
23
  TAG_NODE_NAME = "ci.node.name"
22
24
  TAG_CI_ENV_VARS = "_dd.ci.env_vars"
23
25
 
24
- HEX_NUMBER_REGEXP = /[0-9a-f]{40}/i.freeze
25
-
26
26
  module_function
27
27
 
28
28
  def tags(env)
@@ -57,24 +57,19 @@ module Datadog
57
57
  end
58
58
 
59
59
  def validate_git_sha(git_sha)
60
- message = "DD_GIT_COMMIT_SHA must be a full-length git SHA."
60
+ return if Utils::Git.valid_commit_sha?(git_sha)
61
61
 
62
- if git_sha.nil? || git_sha.empty?
63
- message += " No value was set and no SHA was automatically extracted."
64
- Datadog.logger.error(message)
65
- return
66
- end
62
+ message = "DD_GIT_COMMIT_SHA must be a full-length git SHA."
67
63
 
68
- if git_sha.length < Git::SHA_LENGTH
69
- message += " Expected SHA length #{Git::SHA_LENGTH}, was #{git_sha.length}."
70
- Datadog.logger.error(message)
71
- return
64
+ message += if git_sha.nil? || git_sha.empty?
65
+ " No value was set and no SHA was automatically extracted."
66
+ elsif git_sha.length < Git::SHA_LENGTH
67
+ " Expected SHA length #{Git::SHA_LENGTH}, was #{git_sha.length}."
68
+ else
69
+ " Expected SHA to be a valid HEX number, got #{git_sha}."
72
70
  end
73
71
 
74
- unless HEX_NUMBER_REGEXP =~ git_sha
75
- message += " Expected SHA to be a valid HEX number, got #{git_sha}."
76
- Datadog.logger.error(message)
77
- end
72
+ Datadog.logger.error(message)
78
73
  end
79
74
  end
80
75
  end
@@ -11,6 +11,7 @@ module Datadog
11
11
  ENV_EXPERIMENTAL_TEST_SUITE_LEVEL_VISIBILITY_ENABLED = "DD_CIVISIBILITY_EXPERIMENTAL_TEST_SUITE_LEVEL_VISIBILITY_ENABLED"
12
12
  ENV_FORCE_TEST_LEVEL_VISIBILITY = "DD_CIVISIBILITY_FORCE_TEST_LEVEL_VISIBILITY"
13
13
  ENV_ITR_ENABLED = "DD_CIVISIBILITY_ITR_ENABLED"
14
+ ENV_GIT_METADATA_UPLOAD_ENABLED = "DD_CIVISIBILITY_GIT_METADATA_UPLOAD_ENABLED"
14
15
 
15
16
  # Source: https://docs.datadoghq.com/getting_started/site/
16
17
  DD_SITE_ALLOWLIST = [
@@ -26,6 +26,9 @@ module Datadog
26
26
  # ITR tags
27
27
  TAG_ITR_TEST_SKIPPING_ENABLED = "test.itr.tests_skipping.enabled"
28
28
  TAG_ITR_TEST_SKIPPING_TYPE = "test.itr.tests_skipping.type"
29
+ TAG_ITR_TEST_SKIPPING_COUNT = "test.itr.tests_skipping.count"
30
+ TAG_ITR_SKIPPED_BY_ITR = "test.skipped_by_itr"
31
+ TAG_ITR_TESTS_SKIPPED = "_dd.ci.itr.tests_skipped"
29
32
 
30
33
  # Code coverage tags
31
34
  TAG_CODE_COVERAGE_ENABLED = "test.code_coverage.enabled"
@@ -43,6 +46,7 @@ module Datadog
43
46
  # Environment runtime tags
44
47
  TAG_OS_ARCHITECTURE = "os.architecture"
45
48
  TAG_OS_PLATFORM = "os.platform"
49
+ TAG_OS_VERSION = "os.version"
46
50
  TAG_RUNTIME_NAME = "runtime.name"
47
51
  TAG_RUNTIME_VERSION = "runtime.version"
48
52
 
@@ -53,6 +57,7 @@ module Datadog
53
57
  # could be either "test" or "suite" depending on whether we skip individual tests or whole suites
54
58
  # we use test skipping for Ruby
55
59
  ITR_TEST_SKIPPING_MODE = "test"
60
+ ITR_TEST_SKIP_REASON = "Skipped by Datadog's intelligent test runner"
56
61
 
57
62
  # test status as recognized by Datadog
58
63
  module Status
@@ -23,7 +23,11 @@ module Datadog
23
23
  TEST_VISIBILITY_INTAKE_HOST_PREFIX = "citestcycle-intake"
24
24
  TEST_VISIBILITY_INTAKE_PATH = "/api/v2/citestcycle"
25
25
 
26
+ TEST_COVERAGE_INTAKE_HOST_PREFIX = "citestcov-intake"
27
+ TEST_COVERAGE_INTAKE_PATH = "/api/v2/citestcov"
28
+
26
29
  DD_API_HOST_PREFIX = "api"
30
+
27
31
  DD_API_SETTINGS_PATH = "/api/v2/libraries/tests/services/setting"
28
32
  DD_API_SETTINGS_TYPE = "ci_app_test_service_libraries_settings"
29
33
  DD_API_SETTINGS_RESPONSE_DIG_KEYS = %w[data attributes].freeze
@@ -33,8 +37,16 @@ module Datadog
33
37
  DD_API_SETTINGS_RESPONSE_REQUIRE_GIT_KEY = "require_git"
34
38
  DD_API_SETTINGS_RESPONSE_DEFAULT = {DD_API_SETTINGS_RESPONSE_ITR_ENABLED_KEY => false}.freeze
35
39
 
40
+ DD_API_GIT_SEARCH_COMMITS_PATH = "/api/v2/git/repository/search_commits"
41
+
42
+ DD_API_GIT_UPLOAD_PACKFILE_PATH = "/api/v2/git/repository/packfile"
43
+
44
+ DD_API_SKIPPABLE_TESTS_PATH = "/api/v2/ci/tests/skippable"
45
+ DD_API_SKIPPABLE_TESTS_TYPE = "test_params"
46
+
36
47
  CONTENT_TYPE_MESSAGEPACK = "application/msgpack"
37
48
  CONTENT_TYPE_JSON = "application/json"
49
+ CONTENT_TYPE_MULTIPART_FORM_DATA = "multipart/form-data"
38
50
  CONTENT_ENCODING_GZIP = "gzip"
39
51
  end
40
52
  end