datadog-ci 0.2.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +40 -1
  3. data/README.md +36 -36
  4. data/lib/datadog/ci/configuration/components.rb +51 -25
  5. data/lib/datadog/ci/context/local.rb +50 -0
  6. data/lib/datadog/ci/contrib/cucumber/formatter.rb +23 -29
  7. data/lib/datadog/ci/contrib/minitest/hooks.rb +16 -25
  8. data/lib/datadog/ci/contrib/rspec/example.rb +14 -18
  9. data/lib/datadog/ci/ext/environment/extractor.rb +5 -10
  10. data/lib/datadog/ci/ext/environment/providers/appveyor.rb +4 -0
  11. data/lib/datadog/ci/ext/environment/providers/aws_code_pipeline.rb +39 -0
  12. data/lib/datadog/ci/ext/environment/providers/azure.rb +4 -0
  13. data/lib/datadog/ci/ext/environment/providers/base.rb +4 -0
  14. data/lib/datadog/ci/ext/environment/providers/bitbucket.rb +4 -0
  15. data/lib/datadog/ci/ext/environment/providers/bitrise.rb +4 -0
  16. data/lib/datadog/ci/ext/environment/providers/buddy.rb +4 -0
  17. data/lib/datadog/ci/ext/environment/providers/buildkite.rb +4 -0
  18. data/lib/datadog/ci/ext/environment/providers/circleci.rb +4 -0
  19. data/lib/datadog/ci/ext/environment/providers/codefresh.rb +4 -0
  20. data/lib/datadog/ci/ext/environment/providers/github_actions.rb +17 -4
  21. data/lib/datadog/ci/ext/environment/providers/gitlab.rb +4 -0
  22. data/lib/datadog/ci/ext/environment/providers/jenkins.rb +4 -0
  23. data/lib/datadog/ci/ext/environment/providers/teamcity.rb +4 -0
  24. data/lib/datadog/ci/ext/environment/providers/travis.rb +4 -0
  25. data/lib/datadog/ci/ext/environment/providers.rb +16 -14
  26. data/lib/datadog/ci/ext/transport.rb +5 -0
  27. data/lib/datadog/ci/recorder.rb +82 -46
  28. data/lib/datadog/ci/span.rb +107 -0
  29. data/lib/datadog/ci/test.rb +26 -0
  30. data/lib/datadog/ci/test_visibility/transport.rb +11 -29
  31. data/lib/datadog/ci/transport/api/base.rb +36 -0
  32. data/lib/datadog/ci/transport/api/builder.rb +46 -0
  33. data/lib/datadog/ci/transport/api/ci_test_cycle.rb +30 -0
  34. data/lib/datadog/ci/transport/api/evp_proxy.rb +44 -0
  35. data/lib/datadog/ci/transport/gzip.rb +4 -2
  36. data/lib/datadog/ci/transport/http.rb +25 -101
  37. data/lib/datadog/ci/utils/url.rb +15 -0
  38. data/lib/datadog/ci/version.rb +1 -1
  39. data/lib/datadog/ci.rb +193 -4
  40. data/sig/datadog/ci/configuration/components.rbs +7 -1
  41. data/sig/datadog/ci/context/local.rbs +21 -0
  42. data/sig/datadog/ci/ext/environment/extractor.rbs +0 -2
  43. data/sig/datadog/ci/ext/environment/providers/aws_code_pipeline.rbs +19 -0
  44. data/sig/datadog/ci/ext/environment/providers/base.rbs +2 -0
  45. data/sig/datadog/ci/ext/environment/providers/github_actions.rbs +5 -0
  46. data/sig/datadog/ci/ext/environment/providers.rbs +1 -1
  47. data/sig/datadog/ci/ext/transport.rbs +8 -0
  48. data/sig/datadog/ci/recorder.rbs +20 -8
  49. data/sig/datadog/ci/span.rbs +35 -0
  50. data/sig/datadog/ci/test.rbs +7 -0
  51. data/sig/datadog/ci/test_visibility/transport.rbs +7 -11
  52. data/sig/datadog/ci/transport/api/base.rbs +21 -0
  53. data/sig/datadog/ci/transport/api/builder.rbs +12 -0
  54. data/sig/datadog/ci/transport/api/ci_test_cycle.rbs +21 -0
  55. data/sig/datadog/ci/transport/api/evp_proxy.rbs +19 -0
  56. data/sig/datadog/ci/transport/http.rbs +12 -37
  57. data/sig/datadog/ci/utils/url.rbs +9 -0
  58. data/sig/datadog/ci.rbs +15 -3
  59. metadata +21 -3
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../../ext/transport"
4
+
5
+ module Datadog
6
+ module CI
7
+ module Transport
8
+ module Api
9
+ class Base
10
+ attr_reader :http
11
+
12
+ def initialize(http:)
13
+ @http = http
14
+ end
15
+
16
+ def request(path:, payload:, verb: "post")
17
+ http.request(
18
+ path: path,
19
+ payload: payload,
20
+ verb: verb,
21
+ headers: headers
22
+ )
23
+ end
24
+
25
+ private
26
+
27
+ def headers
28
+ {
29
+ Ext::Transport::HEADER_CONTENT_TYPE => Ext::Transport::CONTENT_TYPE_MESSAGEPACK
30
+ }
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "ci_test_cycle"
4
+ require_relative "evp_proxy"
5
+ require_relative "../http"
6
+ require_relative "../../ext/transport"
7
+
8
+ module Datadog
9
+ module CI
10
+ module Transport
11
+ module Api
12
+ module Builder
13
+ def self.build_ci_test_cycle_api(settings)
14
+ dd_site = settings.site || Ext::Transport::DEFAULT_DD_SITE
15
+ url = settings.ci.agentless_url ||
16
+ "https://#{Ext::Transport::TEST_VISIBILITY_INTAKE_HOST_PREFIX}.#{dd_site}:443"
17
+
18
+ uri = URI.parse(url)
19
+ raise "Invalid agentless mode URL: #{url}" if uri.host.nil?
20
+
21
+ http = Datadog::CI::Transport::HTTP.new(
22
+ host: uri.host,
23
+ port: uri.port,
24
+ ssl: uri.scheme == "https" || uri.port == 443,
25
+ compress: true
26
+ )
27
+
28
+ CiTestCycle.new(api_key: settings.api_key, http: http)
29
+ end
30
+
31
+ def self.build_evp_proxy_api(agent_settings)
32
+ http = Datadog::CI::Transport::HTTP.new(
33
+ host: agent_settings.hostname,
34
+ port: agent_settings.port,
35
+ ssl: agent_settings.ssl,
36
+ timeout: agent_settings.timeout_seconds,
37
+ compress: false
38
+ )
39
+
40
+ EvpProxy.new(http: http)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,30 @@
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
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "datadog/core/environment/container"
4
+
5
+ require_relative "base"
6
+ require_relative "../../ext/transport"
7
+
8
+ module Datadog
9
+ module CI
10
+ module Transport
11
+ module Api
12
+ class EvpProxy < Base
13
+ def request(path:, payload:, verb: "post")
14
+ path = "#{Ext::Transport::EVP_PROXY_PATH_PREFIX}#{path.sub(/^\//, "")}"
15
+
16
+ super(
17
+ path: path,
18
+ payload: payload,
19
+ verb: verb
20
+ )
21
+ end
22
+
23
+ private
24
+
25
+ def container_id
26
+ return @container_id if defined?(@container_id)
27
+
28
+ @container_id = Datadog::Core::Environment::Container.container_id
29
+ end
30
+
31
+ def headers
32
+ headers = super
33
+ headers[Ext::Transport::HEADER_EVP_SUBDOMAIN] = Ext::Transport::TEST_VISIBILITY_INTAKE_HOST_PREFIX
34
+
35
+ c_id = container_id
36
+ headers[Ext::Transport::HEADER_CONTAINER_ID] = c_id unless c_id.nil?
37
+
38
+ headers
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -10,9 +10,11 @@ module Datadog
10
10
  module_function
11
11
 
12
12
  def compress(input)
13
- gzip_writer = Zlib::GzipWriter.new(StringIO.new)
13
+ sio = StringIO.new
14
+ gzip_writer = Zlib::GzipWriter.new(sio, Zlib::DEFAULT_COMPRESSION, Zlib::DEFAULT_STRATEGY)
14
15
  gzip_writer << input
15
- gzip_writer.close.string
16
+ gzip_writer.close
17
+ sio.string
16
18
  end
17
19
  end
18
20
  end
@@ -1,6 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "net/http"
3
+ require "delegate"
4
+ require "datadog/core/transport/http/adapters/net"
5
+ require "datadog/core/transport/http/env"
6
+ require "datadog/core/transport/request"
4
7
 
5
8
  require_relative "gzip"
6
9
  require_relative "../ext/transport"
@@ -26,126 +29,47 @@ module Datadog
26
29
  @compress = compress.nil? ? false : compress
27
30
  end
28
31
 
29
- def request(path:, payload:, headers:, method: "post")
30
- raise "Unknown method #{method}" unless respond_to?(method, true)
31
-
32
+ def request(path:, payload:, headers:, verb: "post")
32
33
  if compress
33
34
  headers[Ext::Transport::HEADER_CONTENT_ENCODING] = Ext::Transport::CONTENT_ENCODING_GZIP
34
35
  payload = Gzip.compress(payload)
35
36
  end
36
37
 
37
38
  Datadog.logger.debug do
38
- "Sending #{method} request: host=#{host}; port=#{port}; ssl_enabled=#{ssl}; " \
39
+ "Sending #{verb} request: host=#{host}; port=#{port}; ssl_enabled=#{ssl}; " \
39
40
  "compression_enabled=#{compress}; path=#{path}; payload_size=#{payload.size}"
40
41
  end
41
42
 
42
- send(method, path: path, payload: payload, headers: headers)
43
+ ResponseDecorator.new(
44
+ adapter.call(
45
+ build_env(path: path, payload: payload, headers: headers, verb: verb)
46
+ )
47
+ )
43
48
  end
44
49
 
45
50
  private
46
51
 
47
- def open(&block)
48
- req = ::Net::HTTP.new(@host, @port)
49
-
50
- req.use_ssl = @ssl
51
- req.open_timeout = req.read_timeout = @timeout
52
-
53
- req.start(&block)
52
+ def build_env(path:, payload:, headers:, verb:)
53
+ env = Datadog::Core::Transport::HTTP::Env.new(
54
+ Datadog::Core::Transport::Request.new
55
+ )
56
+ env.body = payload
57
+ env.path = path
58
+ env.headers = headers
59
+ env.verb = verb
60
+ env
54
61
  end
55
62
 
56
- def post(path:, headers:, payload:)
57
- post = ::Net::HTTP::Post.new(path, headers)
58
- post.body = payload
59
-
60
- http_response = open do |http|
61
- http.request(post)
62
- end
63
-
64
- Response.new(http_response)
65
- rescue => e
66
- Datadog.logger.debug("Unable to send events: #{e}")
67
-
68
- InternalErrorResponse.new(e)
63
+ def adapter
64
+ @adapter ||= Datadog::Core::Transport::HTTP::Adapters::Net.new(host, port, timeout: timeout, ssl: ssl)
69
65
  end
70
66
 
71
- # Data structure for an HTTP Response
72
- class Response
73
- attr_reader :http_response
74
-
75
- def initialize(http_response)
76
- @http_response = http_response
77
- end
78
-
79
- def payload
80
- http_response.body
81
- end
82
-
83
- def code
84
- http_response.code.to_i
85
- end
86
-
87
- def ok?
88
- code.between?(200, 299)
89
- end
90
-
91
- def unsupported?
92
- code == 415
93
- end
94
-
95
- def not_found?
96
- code == 404
97
- end
98
-
99
- def client_error?
100
- code.between?(400, 499)
101
- end
102
-
103
- def server_error?
104
- code.between?(500, 599)
105
- end
106
-
107
- def internal_error?
108
- false
109
- end
110
-
67
+ # this is needed because Datadog::Tracing::Writer is not fully compatiple with Datadog::Core::Transport
68
+ # TODO: remove before 1.0 when CI implements its own worker
69
+ class ResponseDecorator < ::SimpleDelegator
111
70
  def trace_count
112
71
  0
113
72
  end
114
-
115
- def inspect
116
- "#{self.class} ok?:#{ok?} unsupported?:#{unsupported?}, " \
117
- "not_found?:#{not_found?}, client_error?:#{client_error?}, " \
118
- "server_error?:#{server_error?}, internal_error?:#{internal_error?}, " \
119
- "payload:#{payload}"
120
- end
121
- end
122
-
123
- class InternalErrorResponse < Response
124
- class DummyNetHTTPResponse
125
- def body
126
- ""
127
- end
128
-
129
- def code
130
- "-1"
131
- end
132
- end
133
-
134
- attr_reader :error
135
-
136
- def initialize(error)
137
- super(DummyNetHTTPResponse.new)
138
-
139
- @error = error
140
- end
141
-
142
- def internal_error?
143
- true
144
- end
145
-
146
- def inspect
147
- "#{super}, error_class:#{error.class}, error:#{error}"
148
- end
149
73
  end
150
74
  end
151
75
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module CI
5
+ module Utils
6
+ module Url
7
+ def self.filter_sensitive_info(url)
8
+ return nil if url.nil?
9
+
10
+ url.gsub(%r{((https?|ssh)://)[^/]*@}, '\1')
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -4,7 +4,7 @@ module Datadog
4
4
  module CI
5
5
  module VERSION
6
6
  MAJOR = "0"
7
- MINOR = "2"
7
+ MINOR = "4"
8
8
  PATCH = "0"
9
9
  PRE = nil
10
10
  BUILD = nil
data/lib/datadog/ci.rb CHANGED
@@ -5,11 +5,200 @@ require_relative "ci/version"
5
5
  require "datadog/core"
6
6
 
7
7
  module Datadog
8
- # Namespace for Datadog CI instrumentation:
9
- # e.g. rspec, cucumber, etc...
8
+ # Datadog CI visibility public API.
9
+ #
10
+ # @public_api
10
11
  module CI
11
- class Error < StandardError; end
12
- # Your code goes here...
12
+ class << self
13
+ # Return a {Datadog::CI::Test ci_test} that will trace a test called `test_name`.
14
+ # Raises an error if a test is already active.
15
+ #
16
+ # You could trace your test using a <tt>do-block</tt> like:
17
+ #
18
+ # ```
19
+ # Datadog::CI.trace_test(
20
+ # "test_add_two_numbers",
21
+ # service_name: "my-web-site-tests",
22
+ # operation_name: "test",
23
+ # tags: { Datadog::CI::Ext::Test::TAG_FRAMEWORK => "my-test-framework" }
24
+ # ) do |ci_test|
25
+ # result = run_test
26
+ #
27
+ # if result.ok?
28
+ # ci_test.passed!
29
+ # else
30
+ # ci_test.failed!(exception: result.exception)
31
+ # end
32
+ # end
33
+ # ```
34
+ #
35
+ # The {#trace_test} method can also be used without a block in this way:
36
+ # ```
37
+ # ci_test = Datadog::CI.trace_test(
38
+ # "test_add_two_numbers',
39
+ # service: "my-web-site-tests",
40
+ # operation_name: "test",
41
+ # tags: { Datadog::CI::Ext::Test::TAG_FRAMEWORK => "my-test-framework" }
42
+ # )
43
+ # run_test
44
+ # ci_test.finish
45
+ # ```
46
+ #
47
+ # Remember that in this case, calling {Datadog::CI::Test#finish} is mandatory.
48
+ #
49
+ # @param [String] test_name {Datadog::CI::Test} name (example: "test_add_two_numbers").
50
+ # @param [String] operation_name defines label for a test span in trace view ("test" if it's missing)
51
+ # @param [String] service_name the service name for this test
52
+ # @param [Hash<String,String>] tags extra tags which should be added to the test.
53
+ # @return [Object] If a block is provided, returns the result of the block execution.
54
+ # @return [Datadog::CI::Test] If no block is provided, returns the active,
55
+ # unfinished {Datadog::CI::Test}.
56
+ # @yield Optional block where new newly created {Datadog::CI::Test} captures the execution.
57
+ # @yieldparam [Datadog::CI::Test] ci_test the newly created and active [Datadog::CI::Test]
58
+ #
59
+ # @public_api
60
+ def trace_test(test_name, service_name: nil, operation_name: "test", tags: {}, &block)
61
+ recorder.trace_test(test_name, service_name: service_name, operation_name: operation_name, tags: tags, &block)
62
+ end
63
+
64
+ # Same as {#trace_test} but it does not accept a block.
65
+ # Raises an error if a test is already active.
66
+ #
67
+ # Usage:
68
+ #
69
+ # ```
70
+ # ci_test = Datadog::CI.start_test(
71
+ # "test_add_two_numbers',
72
+ # service: "my-web-site-tests",
73
+ # operation_name: "test",
74
+ # tags: { Datadog::CI::Ext::Test::TAG_FRAMEWORK => "my-test-framework" }
75
+ # )
76
+ # run_test
77
+ # ci_test.finish
78
+ # ```
79
+ #
80
+ # @param [String] test_name {Datadog::CI::Test} name (example: "test_add_two_numbers").
81
+ # @param [String] operation_name the resource this span refers, or `test` if it's missing
82
+ # @param [String] service_name the service name for this span.
83
+ # @param [Hash<String,String>] tags extra tags which should be added to the test.
84
+ # @return [Datadog::CI::Test] Returns the active, unfinished {Datadog::CI::Test}.
85
+ #
86
+ # @public_api
87
+ def start_test(test_name, service_name: nil, operation_name: "test", tags: {})
88
+ recorder.trace_test(test_name, service_name: service_name, operation_name: operation_name, tags: tags)
89
+ end
90
+
91
+ # Trace any custom span inside a test. For example, you could trace:
92
+ # - cucumber step
93
+ # - database query
94
+ # - any custom operation you want to see in your trace view
95
+ #
96
+ # You can use thi method with a <tt>do-block</tt> like:
97
+ #
98
+ # ```
99
+ # Datadog::CI.trace(
100
+ # "step",
101
+ # "Given I have 42 cucumbers",
102
+ # tags: {}
103
+ # ) do
104
+ # run_operation
105
+ # end
106
+ # ```
107
+ #
108
+ # The {#trace} method can also be used without a block in this way:
109
+ # ```
110
+ # ci_span = Datadog::CI.trace(
111
+ # "step",
112
+ # "Given I have 42 cucumbers",
113
+ # tags: {}
114
+ # )
115
+ # run_test
116
+ # ci_span.finish
117
+ # ```
118
+ # Remember that in this case, calling {Datadog::CI::Span#finish} is mandatory.
119
+ #
120
+ # @param [String] span_type custom, user-defined span type (for example "step" or "query").
121
+ # @param [String] span_name the resource this span refers, or `test` if it's missing
122
+ # @param [Hash<String,String>] tags extra tags which should be added to the span.
123
+ # @return [Object] If a block is provided, returns the result of the block execution.
124
+ # @return [Datadog::CI::Span] If no block is provided, returns the active,
125
+ # unfinished {Datadog::CI::Span}.
126
+ # @yield Optional block where new newly created {Datadog::CI::Span} captures the execution.
127
+ # @yieldparam [Datadog::CI::Span] ci_span the newly created and active [Datadog::CI::Span]
128
+ #
129
+ # @public_api
130
+ def trace(span_type, span_name, tags: {}, &block)
131
+ recorder.trace(span_type, span_name, tags: tags, &block)
132
+ end
133
+
134
+ # The active, unfinished custom span if it matches given type.
135
+ # If no span is active, or if the active span is not a custom span with given type, returns nil.
136
+ #
137
+ # The active span belongs to an {.active_test}.
138
+ #
139
+ # Usage:
140
+ #
141
+ # ```
142
+ # # start span
143
+ # Datadog::CI.trace(
144
+ # "step",
145
+ # "Given I have 42 cucumbers",
146
+ # tags: {}
147
+ # )
148
+ #
149
+ # # somewhere else, access the active "step" span
150
+ # step_span = Datadog::CI.active_span("step")
151
+ # step_span.finish()
152
+ # ```
153
+ #
154
+ # @param [String] span_type type of the span to retrieve (for example "step" or "query") that was provided to {.trace}
155
+ # @return [Datadog::CI::Span] the active span
156
+ # @return [nil] if no span is active, or if the active span is not a custom span with given type
157
+ def active_span(span_type)
158
+ span = recorder.active_span
159
+ span if span && span.span_type == span_type
160
+ end
161
+
162
+ # The active, unfinished test span.
163
+ #
164
+ # Usage:
165
+ #
166
+ # ```
167
+ # # start a test
168
+ # Datadog::CI.start_test(
169
+ # "test_add_two_numbers',
170
+ # service: "my-web-site-tests",
171
+ # operation_name: "test",
172
+ # tags: { Datadog::CI::Ext::Test::TAG_FRAMEWORK => "my-test-framework" }
173
+ # )
174
+ #
175
+ # # somewhere else, access the active test
176
+ # test_span = Datadog::CI.active_test
177
+ # test_span.passed!
178
+ # test_span.finish
179
+ # ```
180
+ #
181
+ # @return [Datadog::CI::Test] the active test
182
+ # @return [nil] if no test is active
183
+ def active_test
184
+ recorder.active_test
185
+ end
186
+
187
+ # Internal only, to finish a test use Datadog::CI::Test#finish
188
+ def deactivate_test(test)
189
+ recorder.deactivate_test(test)
190
+ end
191
+
192
+ private
193
+
194
+ def components
195
+ Datadog.send(:components)
196
+ end
197
+
198
+ def recorder
199
+ components.ci_recorder
200
+ end
201
+ end
13
202
  end
14
203
  end
15
204
 
@@ -2,11 +2,17 @@ module Datadog
2
2
  module CI
3
3
  module Configuration
4
4
  module Components : Datadog::Core::Configuration::Components
5
+ @ci_recorder: Datadog::CI::Recorder
6
+
7
+ attr_reader ci_recorder: Datadog::CI::Recorder
8
+
5
9
  def initialize: (untyped settings) -> void
6
10
 
7
11
  def activate_ci!: (untyped settings) -> untyped
8
12
 
9
- def build_agentless_transport: (untyped settings) -> Datadog::CI::TestVisibility::Transport
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
10
16
  end
11
17
  end
12
18
  end
@@ -0,0 +1,21 @@
1
+ module Datadog
2
+ module CI
3
+ module Context
4
+ class Local
5
+ @key: Symbol
6
+
7
+ def initialize: () -> void
8
+
9
+ def activate_test!: (Datadog::CI::Test test) ?{ () -> untyped } -> void
10
+
11
+ def deactivate_test!: (Datadog::CI::Test test) -> void
12
+
13
+ def active_test: () -> Datadog::CI::Test?
14
+
15
+ private
16
+
17
+ def active_test=: (Datadog::CI::Test? test) -> untyped
18
+ end
19
+ end
20
+ end
21
+ end
@@ -18,8 +18,6 @@ module Datadog
18
18
  def normalize_git!: () -> void
19
19
 
20
20
  def expand_workspace!: () -> void
21
-
22
- def filter_sensitive_info: (String? url) -> String?
23
21
  end
24
22
  end
25
23
  end
@@ -0,0 +1,19 @@
1
+ module Datadog
2
+ module CI
3
+ module Ext
4
+ module Environment
5
+ module Providers
6
+ class AwsCodePipeline < Base
7
+ def self.handles?: (Hash[String, String?] env) -> bool
8
+
9
+ def provider_name: () -> "awscodepipeline"
10
+
11
+ def pipeline_id: () -> String?
12
+
13
+ def ci_env_vars: () -> String?
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -8,6 +8,8 @@ module Datadog
8
8
  @branch: String?
9
9
  @tag: String?
10
10
 
11
+ def self.handles?: (Hash[String, String?] env) -> bool
12
+
11
13
  def initialize: (Hash[String, String?] env) -> void
12
14
 
13
15
  def job_name: () -> nil
@@ -5,6 +5,7 @@ module Datadog
5
5
  module Providers
6
6
  class GithubActions < Extractor
7
7
  @ref: String
8
+ @github_server_url: String?
8
9
 
9
10
  def provider_name: () -> "github"
10
11
 
@@ -29,6 +30,10 @@ module Datadog
29
30
  def git_branch_or_tag: () -> String?
30
31
 
31
32
  def ci_env_vars: () -> String?
33
+
34
+ private
35
+
36
+ def github_server_url: () -> String?
32
37
  end
33
38
  end
34
39
  end
@@ -3,7 +3,7 @@ module Datadog
3
3
  module Ext
4
4
  module Environment
5
5
  module Providers
6
- PROVIDERS: ::Array[[String, untyped]]
6
+ PROVIDERS: ::Array[untyped]
7
7
 
8
8
  def self.for_environment: (Hash[String, String?] env) -> Providers::Base
9
9
  end