dd-trace 5.115.0 → 5.117.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.
- package/README.electron.md +7 -0
- package/README.md +17 -0
- package/ci/diagnose.js +2100 -0
- package/ci/init.js +23 -2
- package/ci/runbook.md +198 -0
- package/ci/test-optimization-validation/approval-artifacts.js +143 -0
- package/ci/test-optimization-validation/approval.js +299 -0
- package/ci/test-optimization-validation/artifact-id.js +20 -0
- package/ci/test-optimization-validation/bounded-json.js +121 -0
- package/ci/test-optimization-validation/ci-command-candidate.js +83 -0
- package/ci/test-optimization-validation/ci-discovery.js +181 -0
- package/ci/test-optimization-validation/ci-remediation.js +210 -0
- package/ci/test-optimization-validation/cli.js +903 -0
- package/ci/test-optimization-validation/command-blocker.js +81 -0
- package/ci/test-optimization-validation/command-output-policy.js +206 -0
- package/ci/test-optimization-validation/command-runner.js +707 -0
- package/ci/test-optimization-validation/command-suitability.js +471 -0
- package/ci/test-optimization-validation/executable-approval.js +48 -0
- package/ci/test-optimization-validation/executable.js +480 -0
- package/ci/test-optimization-validation/generated-file-policy.js +63 -0
- package/ci/test-optimization-validation/generated-files.js +351 -0
- package/ci/test-optimization-validation/generated-verifier.js +196 -0
- package/ci/test-optimization-validation/init-probe-preload.js +163 -0
- package/ci/test-optimization-validation/init-probe.js +246 -0
- package/ci/test-optimization-validation/late-initialization.js +63 -0
- package/ci/test-optimization-validation/local-command.js +163 -0
- package/ci/test-optimization-validation/manifest-loader.js +133 -0
- package/ci/test-optimization-validation/manifest-scaffold.js +738 -0
- package/ci/test-optimization-validation/manifest-schema.js +862 -0
- package/ci/test-optimization-validation/offline-fixtures.js +327 -0
- package/ci/test-optimization-validation/offline-output.js +406 -0
- package/ci/test-optimization-validation/payload-normalizer.js +72 -0
- package/ci/test-optimization-validation/plan-writer.js +1120 -0
- package/ci/test-optimization-validation/preflight-runner.js +114 -0
- package/ci/test-optimization-validation/redaction.js +331 -0
- package/ci/test-optimization-validation/report-writer.js +1508 -0
- package/ci/test-optimization-validation/safe-files.js +203 -0
- package/ci/test-optimization-validation/scenarios/auto-test-retries.js +159 -0
- package/ci/test-optimization-validation/scenarios/basic-reporting.js +657 -0
- package/ci/test-optimization-validation/scenarios/ci-wiring.js +780 -0
- package/ci/test-optimization-validation/scenarios/early-flake-detection.js +141 -0
- package/ci/test-optimization-validation/scenarios/helpers.js +539 -0
- package/ci/test-optimization-validation/scenarios/test-management.js +218 -0
- package/ci/test-optimization-validation/setup-runner.js +97 -0
- package/ci/test-optimization-validation/static-diagnosis.js +159 -0
- package/ci/test-optimization-validation/test-output.js +129 -0
- package/ci/test-optimization-validation-manifest.schema.json +1 -0
- package/ci/validate-test-optimization.js +3 -0
- package/ext/exporters.js +1 -0
- package/index.d.ts +121 -8
- package/init.js +18 -0
- package/initialize.mjs +1 -1
- package/loader-hook.mjs +28 -18
- package/openfeature.d.ts +1 -0
- package/openfeature.js +4 -0
- package/package.json +11 -8
- package/packages/datadog-instrumentations/src/ai.js +8 -2
- package/packages/datadog-instrumentations/src/child_process.js +1 -1
- package/packages/datadog-instrumentations/src/claude-agent-sdk.js +1 -1
- package/packages/datadog-instrumentations/src/cucumber-worker-threads.js +9 -3
- package/packages/datadog-instrumentations/src/cucumber.js +31 -19
- package/packages/datadog-instrumentations/src/cypress-config.js +398 -52
- package/packages/datadog-instrumentations/src/fastify.js +7 -11
- package/packages/datadog-instrumentations/src/helpers/channel.js +74 -0
- package/packages/datadog-instrumentations/src/helpers/hook.js +27 -6
- package/packages/datadog-instrumentations/src/helpers/optional-peer-bundler.js +8 -8
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/playwright.js +28 -2
- package/packages/datadog-instrumentations/src/jest.js +44 -17
- package/packages/datadog-instrumentations/src/mariadb.js +1 -1
- package/packages/datadog-instrumentations/src/mocha/main.js +79 -32
- package/packages/datadog-instrumentations/src/mocha/utils.js +0 -4
- package/packages/datadog-instrumentations/src/mongodb.js +3 -3
- package/packages/datadog-instrumentations/src/mongoose.js +3 -3
- package/packages/datadog-instrumentations/src/mquery.js +2 -2
- package/packages/datadog-instrumentations/src/mysql.js +1 -1
- package/packages/datadog-instrumentations/src/next.js +24 -0
- package/packages/datadog-instrumentations/src/nyc.js +0 -2
- package/packages/datadog-instrumentations/src/oracledb.js +2 -2
- package/packages/datadog-instrumentations/src/pg.js +2 -2
- package/packages/datadog-instrumentations/src/playwright.js +162 -46
- package/packages/datadog-instrumentations/src/process.js +3 -0
- package/packages/datadog-instrumentations/src/router.js +18 -8
- package/packages/datadog-instrumentations/src/selenium.js +52 -26
- package/packages/datadog-instrumentations/src/vitest-main-no-worker-init.js +3 -3
- package/packages/datadog-instrumentations/src/vitest-main.js +14 -28
- package/packages/datadog-instrumentations/src/vitest-util.js +0 -7
- package/packages/datadog-instrumentations/src/vitest-worker.js +5 -8
- package/packages/datadog-instrumentations/src/ws.js +2 -1
- package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/context.js +2 -2
- package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/util.js +2 -1
- package/packages/datadog-plugin-aws-sdk/src/util.js +2 -2
- package/packages/datadog-plugin-cucumber/src/index.js +3 -2
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +19 -57
- package/packages/datadog-plugin-cypress/src/index.js +6 -1
- package/packages/datadog-plugin-cypress/src/support.js +92 -26
- package/packages/datadog-plugin-electron/src/ipc.js +1 -1
- package/packages/datadog-plugin-graphql/src/execute.js +87 -45
- package/packages/datadog-plugin-graphql/src/validate.js +2 -2
- package/packages/datadog-plugin-http2/src/client.js +1 -1
- package/packages/datadog-plugin-langchain/src/handlers/embedding.js +2 -1
- package/packages/datadog-plugin-langchain/src/handlers/language_models.js +2 -1
- package/packages/datadog-plugin-langchain/src/tokens.js +2 -2
- package/packages/datadog-plugin-mocha/src/index.js +2 -1
- package/packages/datadog-plugin-playwright/src/index.js +181 -65
- package/packages/datadog-plugin-router/src/index.js +11 -2
- package/packages/datadog-plugin-selenium/src/index.js +5 -36
- package/packages/datadog-plugin-vitest/src/index.js +5 -5
- package/packages/datadog-plugin-ws/src/close.js +2 -1
- package/packages/datadog-plugin-ws/src/producer.js +2 -1
- package/packages/datadog-plugin-ws/src/receiver.js +2 -1
- package/packages/datadog-plugin-ws/src/server.js +2 -1
- package/packages/dd-trace/src/aiguard/sdk.js +1 -1
- package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +2 -2
- package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +3 -1
- package/packages/dd-trace/src/azure_metadata.js +2 -1
- package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +93 -28
- package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +1 -1
- package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/index.js +160 -0
- package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/msgpack-to-json.js +288 -0
- package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/payload-projection.js +84 -0
- package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/sink.js +369 -0
- package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/writer.js +60 -0
- package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +41 -3
- package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +7 -2
- package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +1 -1
- package/packages/dd-trace/src/ci-visibility/requests/upload-coverage-report.js +6 -2
- package/packages/dd-trace/src/ci-visibility/rum.js +7 -0
- package/packages/dd-trace/src/ci-visibility/test-api-manual/test-api-manual-plugin.js +4 -0
- package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +1 -1
- package/packages/dd-trace/src/ci-visibility/test-optimization-http-cache-schema.js +137 -9
- package/packages/dd-trace/src/ci-visibility/test-optimization-http-cache.js +168 -8
- package/packages/dd-trace/src/ci-visibility/test-screenshot.js +90 -0
- package/packages/dd-trace/src/config/generated-config-types.d.ts +16 -0
- package/packages/dd-trace/src/config/helper.js +1 -0
- package/packages/dd-trace/src/config/index.js +10 -0
- package/packages/dd-trace/src/config/supported-configurations.json +66 -0
- package/packages/dd-trace/src/exporter.js +2 -0
- package/packages/dd-trace/src/exporters/common/client-library-headers.js +21 -0
- package/packages/dd-trace/src/exporters/common/request.js +59 -30
- package/packages/dd-trace/src/exporters/common/url.js +15 -1
- package/packages/dd-trace/src/feature-registry.js +10 -3
- package/packages/dd-trace/src/llmobs/experiments/client.js +113 -0
- package/packages/dd-trace/src/llmobs/experiments/dataset.js +154 -0
- package/packages/dd-trace/src/llmobs/experiments/experiment.js +283 -0
- package/packages/dd-trace/src/llmobs/experiments/index.js +152 -0
- package/packages/dd-trace/src/llmobs/experiments/noop.js +30 -0
- package/packages/dd-trace/src/llmobs/experiments/result.js +34 -0
- package/packages/dd-trace/src/llmobs/noop.js +6 -0
- package/packages/dd-trace/src/llmobs/plugins/ai/vercelTelemetry.js +20 -3
- package/packages/dd-trace/src/llmobs/plugins/anthropic/index.js +2 -2
- package/packages/dd-trace/src/llmobs/plugins/langgraph/index.js +1 -1
- package/packages/dd-trace/src/llmobs/plugins/openai/constants.js +8 -0
- package/packages/dd-trace/src/llmobs/plugins/openai/index.js +48 -14
- package/packages/dd-trace/src/llmobs/plugins/openai/utils.js +43 -0
- package/packages/dd-trace/src/llmobs/sdk.js +17 -0
- package/packages/dd-trace/src/llmobs/tagger.js +68 -0
- package/packages/dd-trace/src/llmobs/telemetry.js +2 -1
- package/packages/dd-trace/src/llmobs/util.js +32 -0
- package/packages/dd-trace/src/openfeature/agentless_configuration_source.js +322 -0
- package/packages/dd-trace/src/openfeature/configuration_source.js +90 -0
- package/packages/dd-trace/src/openfeature/flagging_provider.js +14 -23
- package/packages/dd-trace/src/openfeature/index.js +0 -2
- package/packages/dd-trace/src/openfeature/noop.js +1 -28
- package/packages/dd-trace/src/openfeature/register.js +16 -27
- package/packages/dd-trace/src/openfeature/remote_config.js +15 -18
- package/packages/dd-trace/src/openfeature/require-provider.js +18 -0
- package/packages/dd-trace/src/opentelemetry/span-ending-hook.js +10 -0
- package/packages/dd-trace/src/opentelemetry/span.js +5 -0
- package/packages/dd-trace/src/plugins/ci_plugin.js +20 -6
- package/packages/dd-trace/src/plugins/util/git.js +3 -2
- package/packages/dd-trace/src/plugins/util/inferred_proxy.js +29 -5
- package/packages/dd-trace/src/plugins/util/test.js +56 -4
- package/packages/dd-trace/src/profiling/profilers/space.js +1 -1
- package/packages/dd-trace/src/profiling/profilers/wall.js +1 -0
- package/packages/dd-trace/src/proxy.js +84 -7
- package/packages/dd-trace/src/span_processor.js +5 -0
- package/packages/dd-trace/src/standalone/index.js +0 -14
- package/packages/dd-trace/src/telemetry/send-data.js +2 -2
- package/packages/dd-trace/src/util.js +26 -0
- package/vendor/dist/@apm-js-collab/code-transformer/index.js +1 -1
- package/vendor/dist/@datadog/sketches-js/index.js +1 -1
- package/vendor/dist/protobufjs/index.js +1 -1
- package/vendor/dist/protobufjs/minimal/index.js +1 -1
- package/vendor/dist/shell-quote/index.js +1 -1
- package/packages/datadog-instrumentations/src/helpers/require-optional-peer.js +0 -17
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const path = require('node:path')
|
|
4
|
+
|
|
5
|
+
const { serializeDisplayCommand } = require('./command-runner')
|
|
6
|
+
|
|
7
|
+
const GITHUB_API_KEY_REFERENCE = '$' + '{{ secrets.DD_API_KEY }}'
|
|
8
|
+
const AGENTLESS_ENV = {
|
|
9
|
+
DD_CIVISIBILITY_AGENTLESS_ENABLED: 'true',
|
|
10
|
+
DD_API_KEY: GITHUB_API_KEY_REFERENCE,
|
|
11
|
+
}
|
|
12
|
+
const OPTIONAL_VALUES = {
|
|
13
|
+
agent: [],
|
|
14
|
+
agentless: [
|
|
15
|
+
{
|
|
16
|
+
name: 'DD_SITE',
|
|
17
|
+
description: 'Set when the Datadog account does not use the default datadoghq.com site.',
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Builds a customer-facing CI configuration fix without including real credentials.
|
|
24
|
+
*
|
|
25
|
+
* @param {object} framework normalized framework manifest entry
|
|
26
|
+
* @returns {object} structured remediation
|
|
27
|
+
*/
|
|
28
|
+
function buildCiRemediation (framework) {
|
|
29
|
+
const ciWiring = framework.ciWiring || {}
|
|
30
|
+
const transport = getConfiguredTransport(framework)
|
|
31
|
+
const location = getCiLocation(ciWiring)
|
|
32
|
+
const nodeOptions = getNodeOptions(framework)
|
|
33
|
+
const recommendedValues = getRecommendedValues(framework)
|
|
34
|
+
const variants = getVariants(transport, ciWiring, framework.ciWiringCommand, recommendedValues, nodeOptions)
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
provider: ciWiring.provider || 'unknown',
|
|
38
|
+
configFile: ciWiring.configFile,
|
|
39
|
+
workflow: ciWiring.workflow,
|
|
40
|
+
job: ciWiring.job,
|
|
41
|
+
step: ciWiring.step,
|
|
42
|
+
location,
|
|
43
|
+
transport,
|
|
44
|
+
summary: getSummary({ location, transport, recommendedValues, nodeOptions }),
|
|
45
|
+
variants,
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function getConfiguredTransport (framework) {
|
|
50
|
+
const env = collectCiEnv(framework)
|
|
51
|
+
if (isTrue(env.DD_CIVISIBILITY_AGENTLESS_ENABLED)) return 'agentless'
|
|
52
|
+
if (env.DD_AGENT_HOST || env.DD_TRACE_AGENT_URL || env.DD_TRACE_AGENT_HOSTNAME) return 'agent'
|
|
53
|
+
return 'unknown'
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function collectCiEnv (framework) {
|
|
57
|
+
const ciWiring = framework.ciWiring || {}
|
|
58
|
+
return {
|
|
59
|
+
...ciWiring.workflowEnv,
|
|
60
|
+
...ciWiring.jobEnv,
|
|
61
|
+
...ciWiring.stepEnv,
|
|
62
|
+
...ciWiring.inheritedEnv,
|
|
63
|
+
...framework.ciWiringCommand?.env,
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function isTrue (value) {
|
|
68
|
+
return ['1', 'true'].includes(String(value || '').toLowerCase())
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function getCiLocation (ciWiring) {
|
|
72
|
+
const parts = []
|
|
73
|
+
if (ciWiring.configFile) parts.push(`configuration ${formatPath(ciWiring.configFile)}`)
|
|
74
|
+
if (ciWiring.workflow) parts.push(`workflow ${JSON.stringify(String(ciWiring.workflow))}`)
|
|
75
|
+
if (ciWiring.job) parts.push(`job ${JSON.stringify(String(ciWiring.job))}`)
|
|
76
|
+
if (ciWiring.step) parts.push(`step ${JSON.stringify(String(ciWiring.step))}`)
|
|
77
|
+
return parts.length > 0 ? parts.join(', ') : 'the selected CI test step'
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function formatPath (filename) {
|
|
81
|
+
const value = String(filename)
|
|
82
|
+
const cwd = process.cwd()
|
|
83
|
+
const relative = path.relative(cwd, value)
|
|
84
|
+
return JSON.stringify(relative && !relative.startsWith('..') && !path.isAbsolute(relative) ? relative : value)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function getSummary ({ location, transport, recommendedValues, nodeOptions }) {
|
|
88
|
+
const recommended = recommendedValues.map(({ name, value }) => `${name}=${value}`).join(' and ')
|
|
89
|
+
if (transport === 'agentless') {
|
|
90
|
+
return `In ${location}, set NODE_OPTIONS=${nodeOptions}, keep ` +
|
|
91
|
+
`DD_CIVISIBILITY_AGENTLESS_ENABLED=true, provide DD_API_KEY from the CI secret store, and set ${recommended}. ` +
|
|
92
|
+
getAgentAlternative()
|
|
93
|
+
}
|
|
94
|
+
if (transport === 'agent') {
|
|
95
|
+
return `In ${location}, set NODE_OPTIONS=${nodeOptions} and set ${recommended}. A Datadog Agent is ` +
|
|
96
|
+
'already configured; when it is reachable by the test process, do not pass DD_API_KEY or ' +
|
|
97
|
+
'DD_CIVISIBILITY_AGENTLESS_ENABLED.'
|
|
98
|
+
}
|
|
99
|
+
return `In ${location}, set NODE_OPTIONS=${nodeOptions}, ` +
|
|
100
|
+
`DD_CIVISIBILITY_AGENTLESS_ENABLED=true, provide DD_API_KEY from the CI secret store, and set ${recommended}. ` +
|
|
101
|
+
getAgentAlternative()
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function getAgentAlternative () {
|
|
105
|
+
return 'If a Datadog Agent is available and reachable by the test process, do not pass DD_API_KEY or ' +
|
|
106
|
+
'DD_CIVISIBILITY_AGENTLESS_ENABLED.'
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function getVariants (transport, ciWiring, command, recommendedValues, nodeOptions) {
|
|
110
|
+
if (transport === 'agent') return [getVariant('agent', ciWiring, command, recommendedValues, nodeOptions)]
|
|
111
|
+
return [getVariant('agentless', ciWiring, command, recommendedValues, nodeOptions)]
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function getVariant (transport, ciWiring, command, recommendedValues, nodeOptions) {
|
|
115
|
+
const transportEnv = transport === 'agentless' ? AGENTLESS_ENV : {}
|
|
116
|
+
const requiredEnv = { NODE_OPTIONS: nodeOptions, ...transportEnv }
|
|
117
|
+
const recommendedEnv = Object.fromEntries(recommendedValues.map(({ name, value }) => [name, value]))
|
|
118
|
+
return {
|
|
119
|
+
id: transport,
|
|
120
|
+
name: transport === 'agentless' ? 'Agentless reporting' : 'Datadog Agent available to the CI job',
|
|
121
|
+
prerequisite: transport === 'agentless'
|
|
122
|
+
? 'Store the Datadog API key in the CI provider secret store.'
|
|
123
|
+
: 'A Datadog Agent must be reachable from the CI test job.',
|
|
124
|
+
requiredValues: Object.entries(requiredEnv).map(([name, value]) => ({
|
|
125
|
+
name,
|
|
126
|
+
value,
|
|
127
|
+
source: name === 'DD_API_KEY' ? 'ci-secret-store' : 'literal',
|
|
128
|
+
})),
|
|
129
|
+
recommendedValues,
|
|
130
|
+
optionalValues: OPTIONAL_VALUES[transport],
|
|
131
|
+
snippet: formatSnippet({ ...requiredEnv, ...recommendedEnv }, ciWiring, command),
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function getNodeOptions (framework) {
|
|
136
|
+
if (framework.framework === 'vitest') return '--import dd-trace/register.js -r dd-trace/ci/init'
|
|
137
|
+
return '-r dd-trace/ci/init'
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function getRecommendedValues (framework) {
|
|
141
|
+
const projectName = normalizeName(framework.project?.name || framework.id || 'test')
|
|
142
|
+
const context = [
|
|
143
|
+
framework.ciWiring?.step,
|
|
144
|
+
framework.ciWiring?.job,
|
|
145
|
+
framework.existingTestCommand?.description,
|
|
146
|
+
framework.ciWiringCommand?.description,
|
|
147
|
+
].filter(Boolean).join(' ')
|
|
148
|
+
const testKind = /\bunit\b/i.test(context)
|
|
149
|
+
? 'unit-tests'
|
|
150
|
+
: /\bintegration\b/i.test(context) ? 'integration-tests' : 'tests'
|
|
151
|
+
const frameworkName = normalizeName(framework.framework || 'test')
|
|
152
|
+
|
|
153
|
+
return [
|
|
154
|
+
{
|
|
155
|
+
name: 'DD_SERVICE',
|
|
156
|
+
value: `${projectName}-tests`,
|
|
157
|
+
description: 'Use a service name that identifies this project test suite.',
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
name: 'DD_TEST_SESSION_NAME',
|
|
161
|
+
value: `${frameworkName}-${testKind}`,
|
|
162
|
+
description: 'Use a session name that identifies this test runner and suite.',
|
|
163
|
+
},
|
|
164
|
+
]
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function normalizeName (value) {
|
|
168
|
+
return String(value)
|
|
169
|
+
.toLowerCase()
|
|
170
|
+
.replaceAll(/^@/g, '')
|
|
171
|
+
.replaceAll(/[^a-z0-9]+/g, '-')
|
|
172
|
+
.replaceAll(/^-|-$/g, '') || 'test'
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function formatSnippet (env, ciWiring, command) {
|
|
176
|
+
if (ciWiring.provider === 'github-actions') {
|
|
177
|
+
const testCommand = getTestCommand(ciWiring, command)
|
|
178
|
+
return [
|
|
179
|
+
ciWiring.configFile ? `# ${formatPath(ciWiring.configFile)}` : '# GitHub Actions workflow',
|
|
180
|
+
ciWiring.job ? `# Job: ${ciWiring.job}` : '# Selected test job',
|
|
181
|
+
`- name: ${quoteYamlValue(ciWiring.step || 'Run tests with Datadog')}`,
|
|
182
|
+
' env:',
|
|
183
|
+
...Object.entries(env).map(([name, value]) => ` ${name}: ${quoteYamlValue(value)}`),
|
|
184
|
+
' run: |',
|
|
185
|
+
...String(testCommand).split(/\r?\n/).map(line => ` ${line}`),
|
|
186
|
+
].join('\n')
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return Object.entries(env).map(([name, value]) => {
|
|
190
|
+
const safeValue = name === 'DD_API_KEY' ? '<DD_API_KEY_FROM_CI_SECRET_STORE>' : value
|
|
191
|
+
return `${name}=${quoteShellValue(safeValue)}`
|
|
192
|
+
}).join('\n')
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function quoteShellValue (value) {
|
|
196
|
+
return JSON.stringify(String(value))
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function getTestCommand (ciWiring, command) {
|
|
200
|
+
if (command) return serializeDisplayCommand(command)
|
|
201
|
+
return ciWiring.packageScriptExpansionChain?.[0] || ciWiring.runnerToolChain?.[0] ||
|
|
202
|
+
'# keep the existing test command here'
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function quoteYamlValue (value) {
|
|
206
|
+
if (String(value).startsWith('${{')) return value
|
|
207
|
+
return JSON.stringify(String(value))
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
module.exports = { buildCiRemediation }
|