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