@datadog/datadog-ci 0.17.7 → 0.17.11

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 (86) hide show
  1. package/LICENSE-3rdparty.csv +2 -0
  2. package/README.md +3 -1
  3. package/dist/{commands/dependencies/index.d.ts → cli.d.ts} +0 -0
  4. package/dist/cli.js +34 -0
  5. package/dist/commands/{dsyms/index.d.ts → dependencies/cli.d.ts} +0 -0
  6. package/dist/commands/dependencies/{index.js → cli.js} +0 -0
  7. package/dist/commands/dependencies/upload.d.ts +1 -1
  8. package/dist/commands/{git-metadata/index.d.ts → dsyms/cli.d.ts} +0 -0
  9. package/dist/commands/dsyms/{index.js → cli.js} +0 -0
  10. package/dist/commands/dsyms/upload.d.ts +1 -1
  11. package/dist/commands/{junit/index.d.ts → git-metadata/cli.d.ts} +0 -0
  12. package/dist/commands/git-metadata/{index.js → cli.js} +0 -0
  13. package/dist/commands/git-metadata/upload.d.ts +1 -1
  14. package/dist/commands/git-metadata/upload.js +6 -1
  15. package/dist/commands/{lambda/__tests__/function.test.d.ts → junit/cli.d.ts} +0 -0
  16. package/dist/commands/junit/{index.js → cli.js} +0 -0
  17. package/dist/commands/junit/upload.d.ts +1 -1
  18. package/dist/commands/lambda/__tests__/fixtures.d.ts +42 -0
  19. package/dist/commands/lambda/__tests__/fixtures.js +73 -0
  20. package/dist/commands/lambda/{index.d.ts → __tests__/functions/commons.test.d.ts} +0 -0
  21. package/dist/commands/lambda/__tests__/functions/commons.test.js +350 -0
  22. package/dist/commands/{sourcemaps/index.d.ts → lambda/__tests__/functions/instrument.test.d.ts} +0 -0
  23. package/dist/commands/lambda/__tests__/{function.test.js → functions/instrument.test.js} +504 -476
  24. package/dist/commands/{trace/index.d.ts → lambda/__tests__/functions/uninstrument.test.d.ts} +0 -0
  25. package/dist/commands/lambda/__tests__/functions/uninstrument.test.js +371 -0
  26. package/dist/commands/lambda/__tests__/instrument.test.js +351 -234
  27. package/dist/commands/lambda/__tests__/loggroup.test.js +98 -34
  28. package/dist/commands/lambda/__tests__/tags.test.js +107 -31
  29. package/dist/commands/lambda/__tests__/uninstrument.test.d.ts +1 -0
  30. package/dist/commands/lambda/__tests__/uninstrument.test.js +281 -0
  31. package/dist/commands/lambda/cli.d.ts +1 -0
  32. package/dist/commands/lambda/cli.js +5 -0
  33. package/dist/commands/lambda/constants.d.ts +18 -6
  34. package/dist/commands/lambda/constants.js +30 -6
  35. package/dist/commands/lambda/functions/commons.d.ts +101 -0
  36. package/dist/commands/lambda/functions/commons.js +258 -0
  37. package/dist/commands/lambda/functions/instrument.d.ts +7 -0
  38. package/dist/commands/lambda/functions/instrument.js +186 -0
  39. package/dist/commands/lambda/functions/uninstrument.d.ts +7 -0
  40. package/dist/commands/lambda/functions/uninstrument.js +121 -0
  41. package/dist/commands/lambda/instrument.d.ts +4 -4
  42. package/dist/commands/lambda/instrument.js +103 -57
  43. package/dist/commands/lambda/interfaces.d.ts +53 -0
  44. package/dist/commands/lambda/loggroup.d.ts +4 -7
  45. package/dist/commands/lambda/loggroup.js +30 -5
  46. package/dist/commands/lambda/tags.d.ts +3 -4
  47. package/dist/commands/lambda/tags.js +19 -3
  48. package/dist/commands/lambda/uninstrument.d.ts +12 -0
  49. package/dist/commands/lambda/uninstrument.js +166 -0
  50. package/dist/commands/sourcemaps/cli.d.ts +1 -0
  51. package/dist/commands/sourcemaps/{index.js → cli.js} +0 -0
  52. package/dist/commands/sourcemaps/upload.d.ts +1 -1
  53. package/dist/commands/synthetics/__tests__/cli.test.js +13 -13
  54. package/dist/commands/synthetics/__tests__/fixtures.js +0 -1
  55. package/dist/commands/synthetics/__tests__/reporters/default.test.js +3 -2
  56. package/dist/commands/synthetics/__tests__/run-test.test.js +6 -6
  57. package/dist/commands/synthetics/__tests__/utils.test.js +9 -5
  58. package/dist/commands/synthetics/__tests__/websocket.test.js +3 -3
  59. package/dist/commands/synthetics/cli.d.ts +1 -26
  60. package/dist/commands/synthetics/cli.js +2 -227
  61. package/dist/commands/synthetics/command.d.ts +26 -0
  62. package/dist/commands/synthetics/command.js +229 -0
  63. package/dist/commands/synthetics/index.d.ts +5 -1
  64. package/dist/commands/synthetics/index.js +31 -2
  65. package/dist/commands/synthetics/interfaces.d.ts +1 -1
  66. package/dist/commands/synthetics/reporters/default.d.ts +3 -3
  67. package/dist/commands/synthetics/reporters/default.js +4 -3
  68. package/dist/commands/synthetics/utils.d.ts +1 -3
  69. package/dist/commands/synthetics/utils.js +14 -15
  70. package/dist/commands/trace/cli.d.ts +1 -0
  71. package/dist/commands/trace/{index.js → cli.js} +0 -0
  72. package/dist/commands/trace/trace.d.ts +1 -1
  73. package/dist/helpers/__tests__/ci.test.js +51 -114
  74. package/dist/helpers/__tests__/user-provided-git.test.js +14 -2
  75. package/dist/helpers/__tests__/utils.test.js +4 -0
  76. package/dist/helpers/ci.js +62 -96
  77. package/dist/helpers/interfaces.d.ts +28 -2
  78. package/dist/helpers/user-provided-git.js +11 -2
  79. package/dist/helpers/utils.d.ts +4 -0
  80. package/dist/helpers/utils.js +18 -1
  81. package/dist/index.d.ts +3 -1
  82. package/dist/index.js +23 -31
  83. package/package.json +8 -6
  84. package/dist/commands/lambda/function.d.ts +0 -43
  85. package/dist/commands/lambda/function.js +0 -273
  86. package/dist/commands/lambda/index.js +0 -4
@@ -1,7 +1,7 @@
1
1
  import { Command } from 'clipanion';
2
2
  import { Provider } from './interfaces';
3
3
  export declare class TraceCommand extends Command {
4
- static usage: import("clipanion/lib/advanced").Usage;
4
+ static usage: import("clipanion").Usage;
5
5
  private command?;
6
6
  private config;
7
7
  private name?;
@@ -3,126 +3,42 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const ci_1 = require("../ci");
7
- const user_provided_git_1 = require("../user-provided-git");
8
6
  const fs_1 = __importDefault(require("fs"));
9
7
  const path_1 = __importDefault(require("path"));
8
+ const ci_1 = require("../ci");
9
+ const user_provided_git_1 = require("../user-provided-git");
10
+ const CI_PROVIDERS = fs_1.default.readdirSync(path_1.default.join(__dirname, 'ci-env'));
10
11
  describe('getCIMetadata', () => {
11
- const branch = 'fakeBranch';
12
- const commit = 'fakeCommitSha';
13
- const pipelineURL = 'fakePipelineUrl';
14
12
  test('non-recognized CI returns undefined', () => {
15
13
  process.env = {};
16
14
  expect(ci_1.getCIMetadata()).toBeUndefined();
17
15
  });
18
- test('circle CI is recognized', () => {
19
- process.env = {
20
- CIRCLECI: 'true',
21
- CIRCLE_BRANCH: branch,
22
- CIRCLE_BUILD_URL: pipelineURL,
23
- CIRCLE_SHA1: commit,
24
- };
25
- expect(ci_1.getCIMetadata()).toEqual({
26
- ci: {
27
- pipeline: { url: pipelineURL },
28
- provider: { name: ci_1.CI_ENGINES.CIRCLECI },
29
- },
30
- git: {
31
- branch,
32
- commitSha: commit,
33
- },
34
- });
35
- });
36
- test('travis CI is recognized', () => {
37
- process.env = {
38
- TRAVIS: 'true',
39
- TRAVIS_BRANCH: branch,
40
- TRAVIS_COMMIT: commit,
41
- TRAVIS_JOB_WEB_URL: pipelineURL,
42
- };
43
- expect(ci_1.getCIMetadata()).toEqual({
44
- ci: {
45
- pipeline: { url: pipelineURL },
46
- provider: { name: ci_1.CI_ENGINES.TRAVIS },
47
- },
48
- git: {
49
- branch,
50
- commitSha: commit,
51
- },
52
- });
53
- });
54
- test('gitlab CI is recognized', () => {
55
- process.env = {
56
- CI_COMMIT_REF_NAME: branch,
57
- CI_COMMIT_SHA: commit,
58
- CI_JOB_URL: pipelineURL,
59
- GITLAB_CI: 'true',
60
- };
61
- expect(ci_1.getCIMetadata()).toEqual({
62
- ci: {
63
- pipeline: { url: pipelineURL },
64
- provider: { name: ci_1.CI_ENGINES.GITLAB },
65
- },
66
- git: {
67
- branch,
68
- commitSha: commit,
69
- },
70
- });
71
- });
72
- test('github actions is recognized', () => {
73
- process.env = {
74
- GITHUB_ACTIONS: 'true',
75
- GITHUB_REF: branch,
76
- GITHUB_REPOSITORY: 'DataDog/datadog-ci',
77
- GITHUB_RUN_ID: '42',
78
- GITHUB_SHA: commit,
79
- };
80
- const expectedPipelineURL = 'https://github.com/DataDog/datadog-ci/actions/runs/42';
81
- expect(ci_1.getCIMetadata()).toEqual({
82
- ci: {
83
- pipeline: { url: expectedPipelineURL },
84
- provider: { name: ci_1.CI_ENGINES.GITHUB },
85
- },
86
- git: {
87
- branch,
88
- commitSha: commit,
89
- },
90
- });
91
- });
92
- test('jenkins is recognized', () => {
93
- process.env = {
94
- BUILD_URL: pipelineURL,
95
- GIT_BRANCH: branch,
96
- GIT_COMMIT: commit,
97
- JENKINS_URL: 'https://fakebuildserver.url/',
98
- };
99
- expect(ci_1.getCIMetadata()).toEqual({
100
- ci: {
101
- pipeline: { url: pipelineURL },
102
- provider: { name: ci_1.CI_ENGINES.JENKINS },
103
- },
104
- git: {
105
- branch,
106
- commitSha: commit,
107
- },
108
- });
16
+ test('pipeline number is parsed to int or ignored', () => {
17
+ var _a, _b, _c, _d, _e, _f, _g, _h;
18
+ process.env = { GITLAB_CI: 'gitlab' };
19
+ process.env.CI_PIPELINE_IID = '0';
20
+ expect((_a = ci_1.getCIMetadata()) === null || _a === void 0 ? void 0 : _a.ci.pipeline.number).toBe(0);
21
+ process.env.CI_PIPELINE_IID = ' \n\r 12345 \n\n ';
22
+ expect((_b = ci_1.getCIMetadata()) === null || _b === void 0 ? void 0 : _b.ci.pipeline.number).toBe(12345);
23
+ process.env.CI_PIPELINE_IID = '123.45';
24
+ expect((_c = ci_1.getCIMetadata()) === null || _c === void 0 ? void 0 : _c.ci.pipeline.number).toBe(123);
25
+ process.env.CI_PIPELINE_IID = '999b';
26
+ expect((_d = ci_1.getCIMetadata()) === null || _d === void 0 ? void 0 : _d.ci.pipeline.number).toBe(999);
27
+ process.env.CI_PIPELINE_IID = '-1';
28
+ expect((_e = ci_1.getCIMetadata()) === null || _e === void 0 ? void 0 : _e.ci.pipeline.number).toBe(-1);
29
+ process.env.CI_PIPELINE_IID = '';
30
+ expect((_f = ci_1.getCIMetadata()) === null || _f === void 0 ? void 0 : _f.ci.pipeline.number).toBeUndefined();
31
+ process.env.CI_PIPELINE_IID = 'not a number';
32
+ expect((_g = ci_1.getCIMetadata()) === null || _g === void 0 ? void 0 : _g.ci.pipeline.number).toBeUndefined();
33
+ process.env.CI_PIPELINE_IID = '$1';
34
+ expect((_h = ci_1.getCIMetadata()) === null || _h === void 0 ? void 0 : _h.ci.pipeline.number).toBeUndefined();
109
35
  });
110
- test('jenkins context is recognized', () => {
111
- process.env = {
112
- BUILD_URL: pipelineURL,
113
- GIT_BRANCH: branch,
114
- GIT_COMMIT: commit,
115
- JENKINS_URL: 'https://fakebuildserver.url/',
116
- };
117
- expect(ci_1.getCIMetadata()).toEqual({
118
- ci: {
119
- pipeline: { url: pipelineURL },
120
- provider: { name: ci_1.CI_ENGINES.JENKINS },
121
- },
122
- git: {
123
- branch,
124
- commitSha: commit,
125
- },
36
+ describe.each(CI_PROVIDERS)('%s', (ciProvider) => {
37
+ const assertions = require(path_1.default.join(__dirname, 'ci-env', ciProvider));
38
+ test.each(assertions)('spec %#', (env, tags) => {
39
+ process.env = env;
40
+ const expectedMetadata = ciAppTagsToMetadata(tags);
41
+ expect(ci_1.getCIMetadata()).toEqual(expectedMetadata);
126
42
  });
127
43
  });
128
44
  });
@@ -132,8 +48,7 @@ describe('ci spec', () => {
132
48
  const tags = Object.assign(Object.assign({}, ci_1.getCISpanTags()), user_provided_git_1.getUserGitMetadata());
133
49
  expect(tags).toEqual({});
134
50
  });
135
- const ciProviders = fs_1.default.readdirSync(path_1.default.join(__dirname, 'ci-env'));
136
- ciProviders.forEach((ciProvider) => {
51
+ CI_PROVIDERS.forEach((ciProvider) => {
137
52
  const assertions = require(path_1.default.join(__dirname, 'ci-env', ciProvider));
138
53
  assertions.forEach(([env, expectedSpanTags], index) => {
139
54
  test(`reads env info for spec ${index} from ${ciProvider}`, () => {
@@ -144,3 +59,25 @@ describe('ci spec', () => {
144
59
  });
145
60
  });
146
61
  });
62
+ const ciAppTagsToMetadata = (tags) => {
63
+ const metadata = {
64
+ ci: { job: {}, pipeline: {}, provider: {}, stage: {} },
65
+ git: { commit: { author: {}, committer: {} } },
66
+ };
67
+ Object.entries(tags).forEach(([tag, value]) => {
68
+ // Ignore JSON fixtures pipeline number that can't be parsed to numbers
69
+ if (!value || tag === 'ci.pipeline.number') {
70
+ return;
71
+ }
72
+ // Get Metadata nested property from tag name ('git.commit.author.name')
73
+ let currentAttr = metadata;
74
+ // Current attribute up to second to last
75
+ const properties = tag.split('.');
76
+ for (let i = 0; i < properties.length - 1; i++) {
77
+ currentAttr = currentAttr[properties[i]];
78
+ }
79
+ const attributeName = properties[properties.length - 1];
80
+ currentAttr[attributeName] = value;
81
+ });
82
+ return metadata;
83
+ };
@@ -7,7 +7,6 @@ describe('getUserGitMetadata', () => {
7
7
  process.env.DD_GIT_COMMIT_SHA = 'DD_GIT_COMMIT_SHA';
8
8
  process.env.DD_GIT_REPOSITORY_URL = 'DD_GIT_REPOSITORY_URL';
9
9
  process.env.DD_GIT_BRANCH = 'DD_GIT_BRANCH';
10
- process.env.DD_GIT_TAG = 'DD_GIT_TAG';
11
10
  process.env.DD_GIT_COMMIT_MESSAGE = 'DD_GIT_COMMIT_MESSAGE';
12
11
  process.env.DD_GIT_COMMIT_AUTHOR_NAME = 'DD_GIT_COMMIT_AUTHOR_NAME';
13
12
  process.env.DD_GIT_COMMIT_AUTHOR_EMAIL = 'DD_GIT_COMMIT_AUTHOR_EMAIL';
@@ -20,7 +19,6 @@ describe('getUserGitMetadata', () => {
20
19
  [tags_1.GIT_REPOSITORY_URL]: 'DD_GIT_REPOSITORY_URL',
21
20
  [tags_1.GIT_BRANCH]: 'DD_GIT_BRANCH',
22
21
  [tags_1.GIT_SHA]: 'DD_GIT_COMMIT_SHA',
23
- [tags_1.GIT_TAG]: 'DD_GIT_TAG',
24
22
  [tags_1.GIT_COMMIT_MESSAGE]: 'DD_GIT_COMMIT_MESSAGE',
25
23
  [tags_1.GIT_COMMIT_COMMITTER_DATE]: 'DD_GIT_COMMIT_COMMITTER_DATE',
26
24
  [tags_1.GIT_COMMIT_COMMITTER_EMAIL]: 'DD_GIT_COMMIT_COMMITTER_EMAIL',
@@ -36,7 +34,21 @@ describe('getUserGitMetadata', () => {
36
34
  expect(result).toEqual({
37
35
  [tags_1.GIT_REPOSITORY_URL]: 'DD_GIT_REPOSITORY_URL',
38
36
  [tags_1.GIT_BRANCH]: 'DD_GIT_BRANCH',
37
+ [tags_1.GIT_COMMIT_MESSAGE]: 'DD_GIT_COMMIT_MESSAGE',
38
+ [tags_1.GIT_COMMIT_COMMITTER_DATE]: 'DD_GIT_COMMIT_COMMITTER_DATE',
39
+ [tags_1.GIT_COMMIT_COMMITTER_EMAIL]: 'DD_GIT_COMMIT_COMMITTER_EMAIL',
40
+ [tags_1.GIT_COMMIT_COMMITTER_NAME]: 'DD_GIT_COMMIT_COMMITTER_NAME',
41
+ [tags_1.GIT_COMMIT_AUTHOR_DATE]: 'DD_GIT_COMMIT_AUTHOR_DATE',
42
+ [tags_1.GIT_COMMIT_AUTHOR_EMAIL]: 'DD_GIT_COMMIT_AUTHOR_EMAIL',
43
+ [tags_1.GIT_COMMIT_AUTHOR_NAME]: 'DD_GIT_COMMIT_AUTHOR_NAME',
44
+ });
45
+ });
46
+ it('overwrites branch when tag is available', () => {
47
+ process.env.DD_GIT_TAG = 'DD_GIT_TAG';
48
+ const result = user_provided_git_1.getUserGitMetadata();
49
+ expect(result).toEqual({
39
50
  [tags_1.GIT_TAG]: 'DD_GIT_TAG',
51
+ [tags_1.GIT_REPOSITORY_URL]: 'DD_GIT_REPOSITORY_URL',
40
52
  [tags_1.GIT_COMMIT_MESSAGE]: 'DD_GIT_COMMIT_MESSAGE',
41
53
  [tags_1.GIT_COMMIT_COMMITTER_DATE]: 'DD_GIT_COMMIT_COMMITTER_DATE',
42
54
  [tags_1.GIT_COMMIT_COMMITTER_EMAIL]: 'DD_GIT_COMMIT_COMMITTER_EMAIL',
@@ -363,3 +363,7 @@ describe('utils', () => {
363
363
  }));
364
364
  });
365
365
  });
366
+ test('removeUndefinedValues', () => {
367
+ // tslint:disable-next-line: no-null-keyword
368
+ expect(ciUtils.removeUndefinedValues({ a: 'b', c: 'd', e: undefined, g: null })).toEqual({ a: 'b', c: 'd', g: null });
369
+ });
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getCIMetadata = exports.getCISpanTags = exports.CI_ENGINES = void 0;
4
4
  const url_1 = require("url");
5
5
  const tags_1 = require("./tags");
6
+ const user_provided_git_1 = require("./user-provided-git");
6
7
  const utils_1 = require("./utils");
7
8
  exports.CI_ENGINES = {
8
9
  APPVEYOR: 'appveyor',
@@ -57,12 +58,6 @@ const filterSensitiveInfoFromRepository = (repositoryUrl) => {
57
58
  return repositoryUrl;
58
59
  }
59
60
  };
60
- const normalizeRef = (ref) => {
61
- if (!ref) {
62
- return ref;
63
- }
64
- return ref.replace(/origin\/|refs\/heads\/|tags\//gm, '');
65
- };
66
61
  const getCISpanTags = () => {
67
62
  const env = process.env;
68
63
  let tags = {};
@@ -125,13 +120,17 @@ const getCISpanTags = () => {
125
120
  };
126
121
  }
127
122
  if (env.GITHUB_ACTIONS || env.GITHUB_ACTION) {
128
- const { GITHUB_RUN_ID, GITHUB_WORKFLOW, GITHUB_RUN_NUMBER, GITHUB_WORKSPACE, GITHUB_HEAD_REF, GITHUB_REF, GITHUB_SHA, GITHUB_REPOSITORY, } = env;
129
- const repositoryUrl = `https://github.com/${GITHUB_REPOSITORY}.git`;
130
- const pipelineURL = `https://github.com/${GITHUB_REPOSITORY}/commit/${GITHUB_SHA}/checks`;
123
+ const { GITHUB_RUN_ID, GITHUB_WORKFLOW, GITHUB_RUN_NUMBER, GITHUB_WORKSPACE, GITHUB_HEAD_REF, GITHUB_REF, GITHUB_SHA, GITHUB_REPOSITORY, GITHUB_SERVER_URL, } = env;
124
+ const repositoryUrl = `${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git`;
125
+ let pipelineURL = `${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}`;
126
+ // Some older versions of enterprise might not have this yet.
127
+ if (env.GITHUB_RUN_ATTEMPT) {
128
+ pipelineURL += `/attempts/${env.GITHUB_RUN_ATTEMPT}`;
129
+ }
131
130
  const ref = GITHUB_HEAD_REF || GITHUB_REF || '';
132
131
  const refKey = ref.includes('tags') ? tags_1.GIT_TAG : tags_1.GIT_BRANCH;
133
132
  tags = {
134
- [tags_1.CI_JOB_URL]: pipelineURL,
133
+ [tags_1.CI_JOB_URL]: `${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/commit/${GITHUB_SHA}/checks`,
135
134
  [tags_1.CI_PIPELINE_ID]: GITHUB_RUN_ID,
136
135
  [tags_1.CI_PIPELINE_NAME]: GITHUB_WORKFLOW,
137
136
  [tags_1.CI_PIPELINE_NUMBER]: GITHUB_RUN_NUMBER,
@@ -156,7 +155,7 @@ const getCISpanTags = () => {
156
155
  };
157
156
  const isTag = JENKINS_GIT_BRANCH && JENKINS_GIT_BRANCH.includes('tags');
158
157
  const refKey = isTag ? tags_1.GIT_TAG : tags_1.GIT_BRANCH;
159
- const ref = normalizeRef(JENKINS_GIT_BRANCH);
158
+ const ref = utils_1.normalizeRef(JENKINS_GIT_BRANCH);
160
159
  tags[refKey] = ref;
161
160
  let finalPipelineName = '';
162
161
  if (JOB_NAME) {
@@ -280,98 +279,65 @@ const getCISpanTags = () => {
280
279
  tags[tags_1.GIT_REPOSITORY_URL] = filterSensitiveInfoFromRepository(tags[tags_1.GIT_REPOSITORY_URL]);
281
280
  }
282
281
  if (tags[tags_1.GIT_BRANCH]) {
283
- tags[tags_1.GIT_BRANCH] = normalizeRef(tags[tags_1.GIT_BRANCH]);
282
+ tags[tags_1.GIT_BRANCH] = utils_1.normalizeRef(tags[tags_1.GIT_BRANCH]);
284
283
  }
285
284
  if (tags[tags_1.GIT_TAG]) {
286
- tags[tags_1.GIT_TAG] = normalizeRef(tags[tags_1.GIT_TAG]);
285
+ tags[tags_1.GIT_TAG] = utils_1.normalizeRef(tags[tags_1.GIT_TAG]);
287
286
  }
288
287
  return utils_1.removeEmptyValues(tags);
289
288
  };
290
289
  exports.getCISpanTags = getCISpanTags;
291
290
  const getCIMetadata = () => {
292
- const env = process.env;
293
- if (env.CIRCLECI) {
294
- return {
295
- ci: {
296
- pipeline: {
297
- url: env.CIRCLE_BUILD_URL,
298
- },
299
- provider: {
300
- name: exports.CI_ENGINES.CIRCLECI,
301
- },
302
- },
303
- git: {
304
- branch: env.CIRCLE_BRANCH,
305
- commitSha: env.CIRCLE_SHA1,
306
- },
307
- };
308
- }
309
- if (env.TRAVIS) {
310
- return {
311
- ci: {
312
- pipeline: {
313
- url: env.TRAVIS_JOB_WEB_URL,
314
- },
315
- provider: {
316
- name: exports.CI_ENGINES.TRAVIS,
317
- },
318
- },
319
- git: {
320
- branch: env.TRAVIS_BRANCH,
321
- commitSha: env.TRAVIS_COMMIT,
322
- },
323
- };
324
- }
325
- if (env.GITLAB_CI) {
326
- return {
327
- ci: {
328
- pipeline: {
329
- url: env.CI_JOB_URL,
330
- },
331
- provider: {
332
- name: exports.CI_ENGINES.GITLAB,
333
- },
334
- },
335
- git: {
336
- branch: env.CI_COMMIT_REF_NAME,
337
- commitSha: env.CI_COMMIT_SHA,
338
- },
339
- };
340
- }
341
- if (env.GITHUB_ACTIONS) {
342
- const { GITHUB_REF, GITHUB_SHA, GITHUB_REPOSITORY, GITHUB_RUN_ID } = env;
343
- const pipelineURL = `https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}`;
344
- return {
345
- ci: {
346
- pipeline: {
347
- url: pipelineURL,
348
- },
349
- provider: {
350
- name: exports.CI_ENGINES.GITHUB,
351
- },
352
- },
353
- git: {
354
- branch: GITHUB_REF,
355
- commitSha: GITHUB_SHA,
356
- },
357
- };
358
- }
359
- if (env.JENKINS_URL) {
360
- const { BUILD_URL, GIT_COMMIT, GIT_BRANCH: JENKINS_GIT_BRANCH } = env;
361
- return {
362
- ci: {
363
- pipeline: {
364
- url: BUILD_URL,
365
- },
366
- provider: {
367
- name: exports.CI_ENGINES.JENKINS,
368
- },
369
- },
370
- git: {
371
- branch: JENKINS_GIT_BRANCH,
372
- commitSha: GIT_COMMIT,
373
- },
374
- };
291
+ const tags = Object.assign(Object.assign({}, exports.getCISpanTags()), user_provided_git_1.getUserGitMetadata());
292
+ if (!tags || !Object.keys(tags).length) {
293
+ return;
375
294
  }
295
+ const metadata = {
296
+ ci: utils_1.removeUndefinedValues({
297
+ job: utils_1.removeUndefinedValues({
298
+ name: tags[tags_1.CI_JOB_NAME],
299
+ url: tags[tags_1.CI_JOB_URL],
300
+ }),
301
+ pipeline: utils_1.removeUndefinedValues({
302
+ id: tags[tags_1.CI_PIPELINE_ID],
303
+ name: tags[tags_1.CI_PIPELINE_NAME],
304
+ number: parsePipelineNumber(tags[tags_1.CI_PIPELINE_NUMBER]),
305
+ url: tags[tags_1.CI_PIPELINE_URL],
306
+ }),
307
+ provider: utils_1.removeUndefinedValues({
308
+ name: tags[tags_1.CI_PROVIDER_NAME],
309
+ }),
310
+ stage: utils_1.removeUndefinedValues({
311
+ name: tags[tags_1.CI_STAGE_NAME],
312
+ }),
313
+ workspace_path: tags[tags_1.CI_WORKSPACE_PATH],
314
+ }),
315
+ git: utils_1.removeUndefinedValues({
316
+ branch: tags[tags_1.GIT_BRANCH],
317
+ commit: utils_1.removeUndefinedValues({
318
+ author: utils_1.removeUndefinedValues({
319
+ date: tags[tags_1.GIT_COMMIT_AUTHOR_DATE],
320
+ email: tags[tags_1.GIT_COMMIT_AUTHOR_EMAIL],
321
+ name: tags[tags_1.GIT_COMMIT_AUTHOR_NAME],
322
+ }),
323
+ committer: utils_1.removeUndefinedValues({
324
+ date: tags[tags_1.GIT_COMMIT_COMMITTER_DATE],
325
+ email: tags[tags_1.GIT_COMMIT_COMMITTER_EMAIL],
326
+ name: tags[tags_1.GIT_COMMIT_COMMITTER_NAME],
327
+ }),
328
+ message: tags[tags_1.GIT_COMMIT_MESSAGE],
329
+ sha: tags[tags_1.GIT_SHA],
330
+ }),
331
+ repository_url: tags[tags_1.GIT_REPOSITORY_URL],
332
+ tag: tags[tags_1.GIT_TAG],
333
+ }),
334
+ };
335
+ return metadata;
376
336
  };
377
337
  exports.getCIMetadata = getCIMetadata;
338
+ const parsePipelineNumber = (pipelineNumberStr) => {
339
+ if (pipelineNumberStr) {
340
+ const pipelineNumber = parseInt(pipelineNumberStr, 10);
341
+ return isFinite(pipelineNumber) ? pipelineNumber : undefined;
342
+ }
343
+ };
@@ -2,16 +2,42 @@ import { AxiosPromise, AxiosRequestConfig, AxiosResponse } from 'axios';
2
2
  import { CI_JOB_NAME, CI_JOB_URL, CI_PIPELINE_ID, CI_PIPELINE_NAME, CI_PIPELINE_NUMBER, CI_PIPELINE_URL, CI_PROVIDER_NAME, CI_STAGE_NAME, CI_WORKSPACE_PATH, GIT_BRANCH, GIT_COMMIT_AUTHOR_DATE, GIT_COMMIT_AUTHOR_EMAIL, GIT_COMMIT_AUTHOR_NAME, GIT_COMMIT_COMMITTER_DATE, GIT_COMMIT_COMMITTER_EMAIL, GIT_COMMIT_COMMITTER_NAME, GIT_COMMIT_MESSAGE, GIT_REPOSITORY_URL, GIT_SHA, GIT_TAG } from './tags';
3
3
  export interface Metadata {
4
4
  ci: {
5
+ job: {
6
+ name?: string;
7
+ url?: string;
8
+ };
5
9
  pipeline: {
10
+ id?: string;
11
+ name?: string;
12
+ number?: number;
6
13
  url?: string;
7
14
  };
8
15
  provider: {
9
- name: string;
16
+ name?: string;
10
17
  };
18
+ stage: {
19
+ name?: string;
20
+ };
21
+ workspace_path?: string;
11
22
  };
12
23
  git: {
13
24
  branch?: string;
14
- commitSha?: string;
25
+ commit: {
26
+ author: {
27
+ date?: string;
28
+ email?: string;
29
+ name?: string;
30
+ };
31
+ committer: {
32
+ date?: string;
33
+ email?: string;
34
+ name?: string;
35
+ };
36
+ message?: string;
37
+ sha?: string;
38
+ };
39
+ repository_url?: string;
40
+ tag?: string;
15
41
  };
16
42
  }
17
43
  export declare type SpanTag = typeof CI_JOB_NAME | typeof CI_JOB_URL | typeof CI_PIPELINE_ID | typeof CI_PIPELINE_NAME | typeof CI_PIPELINE_NUMBER | typeof CI_PIPELINE_URL | typeof CI_PROVIDER_NAME | typeof CI_STAGE_NAME | typeof CI_WORKSPACE_PATH | typeof GIT_BRANCH | typeof GIT_REPOSITORY_URL | typeof GIT_SHA | typeof GIT_TAG | typeof GIT_COMMIT_AUTHOR_EMAIL | typeof GIT_COMMIT_AUTHOR_NAME | typeof GIT_COMMIT_AUTHOR_DATE | typeof GIT_COMMIT_MESSAGE | typeof GIT_COMMIT_COMMITTER_DATE | typeof GIT_COMMIT_COMMITTER_EMAIL | typeof GIT_COMMIT_COMMITTER_NAME;
@@ -5,11 +5,20 @@ const tags_1 = require("./tags");
5
5
  const utils_1 = require("./utils");
6
6
  const getUserGitMetadata = () => {
7
7
  const { DD_GIT_REPOSITORY_URL, DD_GIT_COMMIT_SHA, DD_GIT_BRANCH, DD_GIT_TAG, DD_GIT_COMMIT_MESSAGE, DD_GIT_COMMIT_AUTHOR_NAME, DD_GIT_COMMIT_AUTHOR_EMAIL, DD_GIT_COMMIT_AUTHOR_DATE, DD_GIT_COMMIT_COMMITTER_NAME, DD_GIT_COMMIT_COMMITTER_EMAIL, DD_GIT_COMMIT_COMMITTER_DATE, } = process.env;
8
+ let branch = utils_1.normalizeRef(DD_GIT_BRANCH);
9
+ let tag = utils_1.normalizeRef(DD_GIT_TAG);
10
+ if (DD_GIT_TAG) {
11
+ branch = undefined;
12
+ }
13
+ if ((DD_GIT_BRANCH === null || DD_GIT_BRANCH === void 0 ? void 0 : DD_GIT_BRANCH.includes('origin/tags')) || (DD_GIT_BRANCH === null || DD_GIT_BRANCH === void 0 ? void 0 : DD_GIT_BRANCH.includes('refs/heads/tags'))) {
14
+ branch = undefined;
15
+ tag = utils_1.normalizeRef(DD_GIT_BRANCH);
16
+ }
8
17
  return utils_1.removeEmptyValues({
9
18
  [tags_1.GIT_REPOSITORY_URL]: DD_GIT_REPOSITORY_URL,
10
- [tags_1.GIT_BRANCH]: DD_GIT_BRANCH,
19
+ [tags_1.GIT_BRANCH]: branch,
11
20
  [tags_1.GIT_SHA]: DD_GIT_COMMIT_SHA,
12
- [tags_1.GIT_TAG]: DD_GIT_TAG,
21
+ [tags_1.GIT_TAG]: tag,
13
22
  [tags_1.GIT_COMMIT_MESSAGE]: DD_GIT_COMMIT_MESSAGE,
14
23
  [tags_1.GIT_COMMIT_COMMITTER_DATE]: DD_GIT_COMMIT_COMMITTER_DATE,
15
24
  [tags_1.GIT_COMMIT_COMMITTER_EMAIL]: DD_GIT_COMMIT_COMMITTER_EMAIL,
@@ -28,4 +28,8 @@ export declare const getProxyAgent: (proxyOpts?: ProxyConfiguration | undefined)
28
28
  export declare const getApiHostForSite: (site: string) => string;
29
29
  export declare const buildPath: (...args: string[]) => string;
30
30
  export declare const removeEmptyValues: (tags: SpanTags) => {};
31
+ export declare const removeUndefinedValues: <T extends {
32
+ [key: string]: any;
33
+ }>(object: T) => T;
34
+ export declare const normalizeRef: (ref: string | undefined) => string | undefined;
31
35
  export {};
@@ -12,7 +12,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.removeEmptyValues = exports.buildPath = exports.getApiHostForSite = exports.getProxyAgent = exports.getRequestBuilder = exports.getProxyUrl = exports.parseConfigFile = exports.getConfig = exports.pick = void 0;
15
+ exports.normalizeRef = exports.removeUndefinedValues = exports.removeEmptyValues = exports.buildPath = exports.getApiHostForSite = exports.getProxyAgent = exports.getRequestBuilder = exports.getProxyUrl = exports.parseConfigFile = exports.getConfig = exports.pick = void 0;
16
16
  const fs_1 = __importDefault(require("fs"));
17
17
  const util_1 = require("util");
18
18
  const axios_1 = __importDefault(require("axios"));
@@ -130,3 +130,20 @@ const removeEmptyValues = (tags) => Object.keys(tags).reduce((filteredTags, tag)
130
130
  return Object.assign(Object.assign({}, filteredTags), { [tag]: tags[tag] });
131
131
  }, {});
132
132
  exports.removeEmptyValues = removeEmptyValues;
133
+ const removeUndefinedValues = (object) => {
134
+ const newObject = Object.assign({}, object);
135
+ for (const [key, value] of Object.entries(newObject)) {
136
+ if (value === undefined) {
137
+ delete newObject[key];
138
+ }
139
+ }
140
+ return newObject;
141
+ };
142
+ exports.removeUndefinedValues = removeUndefinedValues;
143
+ const normalizeRef = (ref) => {
144
+ if (!ref) {
145
+ return ref;
146
+ }
147
+ return ref.replace(/origin\/|refs\/heads\/|tags\//gm, '');
148
+ };
149
+ exports.normalizeRef = normalizeRef;
package/dist/index.d.ts CHANGED
@@ -1 +1,3 @@
1
- export {};
1
+ import * as synthetics from './commands/synthetics';
2
+ import * as utils from './helpers/utils';
3
+ export { utils, synthetics };
package/dist/index.js CHANGED
@@ -1,34 +1,26 @@
1
- #!/usr/bin/env node
2
1
  "use strict";
3
- var __importDefault = (this && this.__importDefault) || function (mod) {
4
- return (mod && mod.__esModule) ? mod : { "default": mod };
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
5
20
  };
6
21
  Object.defineProperty(exports, "__esModule", { value: true });
7
- const fs_1 = __importDefault(require("fs"));
8
- const clipanion_1 = require("clipanion");
9
- const onError = (err) => {
10
- console.log(err);
11
- process.exitCode = 1;
12
- };
13
- process.on('uncaughtException', onError);
14
- process.on('unhandledRejection', onError);
15
- const cli = new clipanion_1.Cli({
16
- binaryLabel: 'Datadog CI',
17
- binaryName: 'datadog-ci',
18
- binaryVersion: require('../package.json').version,
19
- });
20
- const commandsPath = `${__dirname}/commands`;
21
- for (const commandFolder of fs_1.default.readdirSync(commandsPath)) {
22
- const commandPath = `${commandsPath}/${commandFolder}`;
23
- if (fs_1.default.statSync(commandPath).isDirectory()) {
24
- // tslint:disable-next-line: no-var-requires
25
- require(commandPath).forEach((command) => cli.register(command));
26
- }
27
- }
28
- if (require.main === module) {
29
- cli.runExit(process.argv.slice(2), {
30
- stderr: process.stderr,
31
- stdin: process.stdin,
32
- stdout: process.stdout,
33
- });
34
- }
22
+ exports.synthetics = exports.utils = void 0;
23
+ const synthetics = __importStar(require("./commands/synthetics"));
24
+ exports.synthetics = synthetics;
25
+ const utils = __importStar(require("./helpers/utils"));
26
+ exports.utils = utils;