@code-pushup/ci 0.64.2 → 0.65.1
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.md +3 -3
- package/package.json +4 -4
- package/src/lib/models.d.ts +6 -3
- package/src/lib/output-files.d.ts +10 -0
- package/src/lib/output-files.js +29 -0
- package/src/lib/output-files.js.map +1 -0
- package/src/lib/run-monorepo.js +53 -41
- package/src/lib/run-monorepo.js.map +1 -1
- package/src/lib/run-standalone.js +1 -1
- package/src/lib/run-standalone.js.map +1 -1
- package/src/lib/run-utils.d.ts +18 -17
- package/src/lib/run-utils.js +71 -52
- package/src/lib/run-utils.js.map +1 -1
package/README.md
CHANGED
|
@@ -137,7 +137,7 @@ const result = await runInCI(refs, api);
|
|
|
137
137
|
if (result.mode === 'standalone') {
|
|
138
138
|
const {
|
|
139
139
|
// output files, can be uploaded as job artifact
|
|
140
|
-
files: {
|
|
140
|
+
files: { current, comparison },
|
|
141
141
|
// ID of created/updated PR comment
|
|
142
142
|
commentId,
|
|
143
143
|
// array of source code issues, can be used to annotate changed files in PR
|
|
@@ -231,7 +231,7 @@ if (result.mode === 'monorepo') {
|
|
|
231
231
|
// ID of created/updated PR comment
|
|
232
232
|
commentId,
|
|
233
233
|
// merged report-diff.md used in PR comment, can also be uploaded as job artifact
|
|
234
|
-
|
|
234
|
+
files: { comparison },
|
|
235
235
|
} = result;
|
|
236
236
|
|
|
237
237
|
for (const project of projects) {
|
|
@@ -239,7 +239,7 @@ if (result.mode === 'monorepo') {
|
|
|
239
239
|
// detected project name (from package.json, project.json or folder name)
|
|
240
240
|
name,
|
|
241
241
|
// output files, can be uploaded as job artifacts
|
|
242
|
-
files: {
|
|
242
|
+
files: { current, comparison },
|
|
243
243
|
// array of source code issues, can be used to annotate changed files in PR
|
|
244
244
|
newIssues,
|
|
245
245
|
} = project;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@code-pushup/ci",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.65.1",
|
|
4
4
|
"description": "CI automation logic for Code PushUp (provider-agnostic)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/code-pushup/cli/tree/main/packages/ci#readme",
|
|
@@ -26,9 +26,9 @@
|
|
|
26
26
|
},
|
|
27
27
|
"type": "module",
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@code-pushup/models": "0.
|
|
30
|
-
"@code-pushup/utils": "0.
|
|
31
|
-
"glob": "^
|
|
29
|
+
"@code-pushup/models": "0.65.1",
|
|
30
|
+
"@code-pushup/utils": "0.65.1",
|
|
31
|
+
"glob": "^11.0.1",
|
|
32
32
|
"simple-git": "^3.20.0",
|
|
33
33
|
"yaml": "^2.5.1",
|
|
34
34
|
"zod": "^3.22.1"
|
package/src/lib/models.d.ts
CHANGED
|
@@ -84,7 +84,9 @@ export type MonorepoRunResult = {
|
|
|
84
84
|
mode: 'monorepo';
|
|
85
85
|
projects: ProjectRunResult[];
|
|
86
86
|
commentId?: number;
|
|
87
|
-
|
|
87
|
+
files?: {
|
|
88
|
+
comparison: Pick<OutputFiles, 'md'>;
|
|
89
|
+
};
|
|
88
90
|
};
|
|
89
91
|
/**
|
|
90
92
|
* Result of {@link runInCI} for a single project
|
|
@@ -92,8 +94,9 @@ export type MonorepoRunResult = {
|
|
|
92
94
|
export type ProjectRunResult = {
|
|
93
95
|
name: string;
|
|
94
96
|
files: {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
+
current: OutputFiles;
|
|
98
|
+
previous?: OutputFiles | Pick<OutputFiles, 'json'>;
|
|
99
|
+
comparison?: OutputFiles;
|
|
97
100
|
};
|
|
98
101
|
newIssues?: SourceFileIssue[];
|
|
99
102
|
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { OutputFiles, Settings } from './models.js';
|
|
2
|
+
import type { ProjectConfig } from './monorepo/tools.js';
|
|
3
|
+
type OutputType = 'current' | 'previous' | 'comparison';
|
|
4
|
+
export declare function saveOutputFiles<T extends Partial<OutputFiles>>({ project, type, files, settings: { logger, directory }, }: {
|
|
5
|
+
project: Pick<ProjectConfig, 'name'> | null;
|
|
6
|
+
type: OutputType;
|
|
7
|
+
files: T;
|
|
8
|
+
settings: Pick<Settings, 'logger' | 'directory'>;
|
|
9
|
+
}): Promise<T>;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { copyFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { DEFAULT_PERSIST_FILENAME } from '@code-pushup/models';
|
|
4
|
+
import { objectFromEntries, objectToKeys } from '@code-pushup/utils';
|
|
5
|
+
const BASE_DIR = path.join('.code-pushup', '.ci');
|
|
6
|
+
export async function saveOutputFiles({ project, type, files, settings: { logger, directory }, }) {
|
|
7
|
+
const baseDir = project ? path.join(BASE_DIR, project.name) : BASE_DIR;
|
|
8
|
+
const outputDir = path.join(directory, baseDir, `.${type}`);
|
|
9
|
+
const name = type === 'comparison'
|
|
10
|
+
? `${DEFAULT_PERSIST_FILENAME}-diff`
|
|
11
|
+
: DEFAULT_PERSIST_FILENAME;
|
|
12
|
+
const formats = objectToKeys(files);
|
|
13
|
+
const outputs = objectFromEntries(formats.map(format => [
|
|
14
|
+
format,
|
|
15
|
+
path.join(outputDir, `${name}.${format.toString()}`),
|
|
16
|
+
]));
|
|
17
|
+
if (formats.length > 0) {
|
|
18
|
+
await mkdir(outputDir, { recursive: true });
|
|
19
|
+
}
|
|
20
|
+
await Promise.all(formats.map(async (format) => {
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
22
|
+
const src = files[format];
|
|
23
|
+
const dest = outputs[format];
|
|
24
|
+
await copyFile(src, dest);
|
|
25
|
+
logger.debug(`Copied ${type} report from ${src} to ${dest}`);
|
|
26
|
+
}));
|
|
27
|
+
return outputs;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=output-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-files.js","sourceRoot":"","sources":["../../../../../packages/ci/src/lib/output-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,wBAAwB,EAAe,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIrE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;AAIlD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAiC,EACpE,OAAO,EACP,IAAI,EACJ,KAAK,EACL,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAMhC;IACC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACvE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,IAAI,GACR,IAAI,KAAK,YAAY;QACnB,CAAC,CAAC,GAAG,wBAAwB,OAAO;QACpC,CAAC,CAAC,wBAAwB,CAAC;IAE/B,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAa,CAAC;IAChD,MAAM,OAAO,GAAG,iBAAiB,CAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACpB,MAAM;QACN,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;KACrD,CAAC,CACH,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAC,MAAM,EAAC,EAAE;QACzB,oEAAoE;QACpE,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,gBAAgB,GAAG,OAAO,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,OAAY,CAAC;AACtB,CAAC"}
|
package/src/lib/run-monorepo.js
CHANGED
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { DEFAULT_PERSIST_OUTPUT_DIR, } from '@code-pushup/models';
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
4
2
|
import { hasNoNullableProps, } from '@code-pushup/utils';
|
|
5
3
|
import { createCommandContext, persistedFilesFromConfig, runCollect, runMergeDiffs, } from './cli/index.js';
|
|
6
4
|
import { commentOnPR } from './comment.js';
|
|
7
5
|
import { listMonorepoProjects, } from './monorepo/index.js';
|
|
8
|
-
import {
|
|
6
|
+
import { saveOutputFiles } from './output-files.js';
|
|
7
|
+
import { checkPrintConfig, compareReports, loadCachedBaseReport, printPersistConfig, runInBaseBranch, runOnProject, saveReportFiles, } from './run-utils.js';
|
|
9
8
|
export async function runInMonorepoMode(env) {
|
|
10
9
|
const { api, settings } = env;
|
|
11
|
-
const { logger
|
|
10
|
+
const { logger } = settings;
|
|
12
11
|
logger.info('Running Code PushUp in monorepo mode');
|
|
13
12
|
const { projects, runManyCommand } = await listMonorepoProjects(settings);
|
|
14
13
|
const projectResults = runManyCommand
|
|
15
14
|
? await runProjectsInBulk(projects, runManyCommand, env)
|
|
16
15
|
: await runProjectsIndividually(projects, env);
|
|
17
16
|
const diffJsonPaths = projectResults
|
|
18
|
-
.map(({ files }) => files.
|
|
17
|
+
.map(({ files }) => files.comparison?.json)
|
|
19
18
|
.filter((file) => file != null);
|
|
20
|
-
if (diffJsonPaths.length
|
|
21
|
-
|
|
22
|
-
logger.debug(`Merged ${diffJsonPaths.length} diffs into ${tmpDiffPath}`);
|
|
23
|
-
const diffPath = path.join(directory, DEFAULT_PERSIST_OUTPUT_DIR, path.basename(tmpDiffPath));
|
|
24
|
-
if (tmpDiffPath !== diffPath) {
|
|
25
|
-
await copyFile(tmpDiffPath, diffPath);
|
|
26
|
-
logger.debug(`Copied ${tmpDiffPath} to ${diffPath}`);
|
|
27
|
-
}
|
|
28
|
-
const commentId = settings.skipComment
|
|
29
|
-
? null
|
|
30
|
-
: await commentOnPR(tmpDiffPath, api, logger);
|
|
31
|
-
return {
|
|
32
|
-
mode: 'monorepo',
|
|
33
|
-
projects: projectResults,
|
|
34
|
-
diffPath,
|
|
35
|
-
...(commentId != null && { commentId }),
|
|
36
|
-
};
|
|
19
|
+
if (diffJsonPaths.length === 0) {
|
|
20
|
+
return { mode: 'monorepo', projects: projectResults };
|
|
37
21
|
}
|
|
38
|
-
|
|
22
|
+
const tmpDiffPath = await runMergeDiffs(diffJsonPaths, createCommandContext(settings, projects[0]));
|
|
23
|
+
logger.debug(`Merged ${diffJsonPaths.length} diffs into ${tmpDiffPath}`);
|
|
24
|
+
const { md: diffPath } = await saveOutputFiles({
|
|
25
|
+
project: null,
|
|
26
|
+
type: 'comparison',
|
|
27
|
+
files: { md: tmpDiffPath },
|
|
28
|
+
settings,
|
|
29
|
+
});
|
|
30
|
+
const commentId = settings.skipComment
|
|
31
|
+
? null
|
|
32
|
+
: await commentOnPR(diffPath, api, logger);
|
|
33
|
+
return {
|
|
34
|
+
mode: 'monorepo',
|
|
35
|
+
projects: projectResults,
|
|
36
|
+
files: { comparison: { md: diffPath } },
|
|
37
|
+
...(commentId != null && { commentId }),
|
|
38
|
+
};
|
|
39
39
|
}
|
|
40
40
|
function runProjectsIndividually(projects, env) {
|
|
41
41
|
env.settings.logger.info(`Running on ${projects.length} projects individually`);
|
|
@@ -43,13 +43,18 @@ function runProjectsIndividually(projects, env) {
|
|
|
43
43
|
}
|
|
44
44
|
async function runProjectsInBulk(projects, runManyCommand, env) {
|
|
45
45
|
const { refs: { base }, settings, } = env;
|
|
46
|
-
const logger = settings
|
|
46
|
+
const { logger } = settings;
|
|
47
47
|
logger.info(`Running on ${projects.length} projects in bulk (parallel: ${settings.parallel})`);
|
|
48
48
|
await collectMany(runManyCommand, env);
|
|
49
49
|
const currProjectReports = await Promise.all(projects.map(async (project) => {
|
|
50
50
|
const ctx = createCommandContext(settings, project);
|
|
51
51
|
const config = await printPersistConfig(ctx);
|
|
52
|
-
const reports =
|
|
52
|
+
const reports = await saveOutputFiles({
|
|
53
|
+
project,
|
|
54
|
+
type: 'current',
|
|
55
|
+
files: persistedFilesFromConfig(config, ctx),
|
|
56
|
+
settings,
|
|
57
|
+
});
|
|
53
58
|
return { project, reports, config, ctx };
|
|
54
59
|
}));
|
|
55
60
|
logger.debug(`Loaded ${currProjectReports.length} persist configs by running print-config command for each project`);
|
|
@@ -61,12 +66,14 @@ async function runProjectsInBulk(projects, runManyCommand, env) {
|
|
|
61
66
|
async function compareProjectsInBulk(currProjectReports, base, runManyCommand, env) {
|
|
62
67
|
const projectReportsWithCache = await Promise.all(currProjectReports.map(async ({ project, ctx, reports, config }) => {
|
|
63
68
|
const args = { project, base, ctx, env };
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
69
|
+
const [currReport, prevReport] = await Promise.all([
|
|
70
|
+
readFile(reports.json, 'utf8').then((content) => ({
|
|
71
|
+
content,
|
|
72
|
+
files: reports,
|
|
73
|
+
})),
|
|
74
|
+
loadCachedBaseReport(args),
|
|
75
|
+
]);
|
|
76
|
+
return { ...args, config, currReport, prevReport };
|
|
70
77
|
}));
|
|
71
78
|
const uncachedProjectReports = projectReportsWithCache.filter(({ prevReport }) => !prevReport);
|
|
72
79
|
env.settings.logger.info(`${currProjectReports.length - uncachedProjectReports.length} out of ${currProjectReports.length} projects loaded previous report from artifact cache`);
|
|
@@ -88,16 +95,14 @@ function finalizeProjectReports(projectReports, projectComparisons) {
|
|
|
88
95
|
const comparison = projectComparisons?.[project.name];
|
|
89
96
|
return {
|
|
90
97
|
name: project.name,
|
|
91
|
-
files: {
|
|
92
|
-
report: reports,
|
|
93
|
-
...(comparison && { diff: comparison.files }),
|
|
94
|
-
},
|
|
98
|
+
files: comparison?.files ?? { current: reports },
|
|
95
99
|
...(comparison?.newIssues && { newIssues: comparison.newIssues }),
|
|
96
100
|
};
|
|
97
101
|
});
|
|
98
102
|
}
|
|
99
103
|
async function collectPreviousReports(base, uncachedProjectReports, runManyCommand, env) {
|
|
100
|
-
const { settings
|
|
104
|
+
const { settings } = env;
|
|
105
|
+
const { logger } = settings;
|
|
101
106
|
if (uncachedProjectReports.length === 0) {
|
|
102
107
|
return {};
|
|
103
108
|
}
|
|
@@ -120,13 +125,20 @@ async function collectPreviousReports(base, uncachedProjectReports, runManyComma
|
|
|
120
125
|
logger.info(`Collecting previous reports for ${onlyProjects.length} projects`);
|
|
121
126
|
await collectMany(runManyCommand, env, onlyProjects);
|
|
122
127
|
}
|
|
123
|
-
const projectFiles = validProjectConfigs.map(
|
|
124
|
-
name,
|
|
125
|
-
await readFile(persistedFilesFromConfig(config, ctx).json, 'utf8'),
|
|
126
|
-
]);
|
|
128
|
+
const projectFiles = validProjectConfigs.map(args => savePreviousProjectReport({ ...args, settings }));
|
|
127
129
|
return Object.fromEntries(await Promise.all(projectFiles));
|
|
128
130
|
});
|
|
129
131
|
}
|
|
132
|
+
async function savePreviousProjectReport(args) {
|
|
133
|
+
const { name, ctx, config, settings } = args;
|
|
134
|
+
const files = await saveReportFiles({
|
|
135
|
+
project: { name },
|
|
136
|
+
type: 'previous',
|
|
137
|
+
files: persistedFilesFromConfig(config, ctx),
|
|
138
|
+
settings,
|
|
139
|
+
});
|
|
140
|
+
return [name, files];
|
|
141
|
+
}
|
|
130
142
|
async function collectMany(runManyCommand, env, onlyProjects) {
|
|
131
143
|
const { settings } = env;
|
|
132
144
|
const command = await runManyCommand(onlyProjects);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-monorepo.js","sourceRoot":"","sources":["../../../../../packages/ci/src/lib/run-monorepo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"run-monorepo.js","sourceRoot":"","sources":["../../../../../packages/ci/src/lib/run-monorepo.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ export async function runInStandaloneMode(env) {
|
|
|
5
5
|
const { logger } = settings;
|
|
6
6
|
logger.info('Running Code PushUp in standalone project mode');
|
|
7
7
|
const { files, newIssues } = await runOnProject(null, env);
|
|
8
|
-
const commentMdPath = files.
|
|
8
|
+
const commentMdPath = files.comparison?.md;
|
|
9
9
|
if (!settings.skipComment && commentMdPath) {
|
|
10
10
|
const commentId = await commentOnPR(commentMdPath, api, logger);
|
|
11
11
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-standalone.js","sourceRoot":"","sources":["../../../../../packages/ci/src/lib/run-standalone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAe,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAW;IAEX,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;IAE5B,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAE9D,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAE3D,MAAM,aAAa,GAAG,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"run-standalone.js","sourceRoot":"","sources":["../../../../../packages/ci/src/lib/run-standalone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAe,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAW;IAEX,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;IAE5B,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAE9D,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAE3D,MAAM,aAAa,GAAG,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;IAC3C,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,aAAa,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,aAAa,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAChE,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,KAAK;YACL,SAAS;YACT,SAAS;SACV,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAClD,CAAC"}
|
package/src/lib/run-utils.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { SimpleGit } from 'simple-git';
|
|
|
2
2
|
import type { CoreConfig } from '@code-pushup/models';
|
|
3
3
|
import { type CommandContext } from './cli/index.js';
|
|
4
4
|
import { type SourceFileIssue } from './issues.js';
|
|
5
|
-
import type { GitBranch, GitRefs,
|
|
5
|
+
import type { GitBranch, GitRefs, Options, OutputFiles, ProjectRunResult, ProviderAPIClient, Settings } from './models.js';
|
|
6
6
|
import type { ProjectConfig } from './monorepo/index.js';
|
|
7
7
|
export type RunEnv = {
|
|
8
8
|
refs: NormalizedGitRefs;
|
|
@@ -18,34 +18,35 @@ export type CompareReportsArgs = {
|
|
|
18
18
|
project: ProjectConfig | null;
|
|
19
19
|
env: RunEnv;
|
|
20
20
|
base: GitBranch;
|
|
21
|
-
currReport:
|
|
22
|
-
prevReport:
|
|
21
|
+
currReport: ReportData<'current'>;
|
|
22
|
+
prevReport: ReportData<'previous'>;
|
|
23
23
|
config: Pick<CoreConfig, 'persist'>;
|
|
24
24
|
};
|
|
25
|
-
export type CompareReportsResult = {
|
|
26
|
-
files: OutputFiles;
|
|
27
|
-
newIssues?: SourceFileIssue[];
|
|
28
|
-
};
|
|
29
25
|
export type BaseReportArgs = {
|
|
30
26
|
project: ProjectConfig | null;
|
|
31
27
|
env: RunEnv;
|
|
32
28
|
base: GitBranch;
|
|
33
29
|
ctx: CommandContext;
|
|
34
30
|
};
|
|
31
|
+
export type ReportData<T extends 'current' | 'previous'> = {
|
|
32
|
+
content: string;
|
|
33
|
+
files: Required<ProjectRunResult['files']>[T];
|
|
34
|
+
};
|
|
35
35
|
export declare function createRunEnv(refs: GitRefs, api: ProviderAPIClient, options: Options | undefined, git: SimpleGit): Promise<RunEnv>;
|
|
36
36
|
export declare function runOnProject(project: ProjectConfig | null, env: RunEnv): Promise<ProjectRunResult>;
|
|
37
|
-
export declare function compareReports(args: CompareReportsArgs): Promise<
|
|
38
|
-
export declare function
|
|
39
|
-
|
|
37
|
+
export declare function compareReports(args: CompareReportsArgs): Promise<ProjectRunResult>;
|
|
38
|
+
export declare function saveReportFiles<T extends 'current' | 'previous'>(args: {
|
|
39
|
+
project: Pick<ProjectConfig, 'name'> | null;
|
|
40
|
+
type: T;
|
|
41
|
+
files: ReportData<T>['files'];
|
|
42
|
+
settings: Settings;
|
|
43
|
+
}): Promise<ReportData<T>>;
|
|
44
|
+
export declare function collectPreviousReport(args: BaseReportArgs): Promise<ReportData<'previous'> | null>;
|
|
45
|
+
export declare function loadCachedBaseReport(args: BaseReportArgs): Promise<ReportData<'previous'> | null>;
|
|
40
46
|
export declare function runInBaseBranch<T>(base: GitBranch, env: RunEnv, fn: () => Promise<T>): Promise<T>;
|
|
41
47
|
export declare function checkPrintConfig(args: BaseReportArgs): Promise<Pick<CoreConfig, 'persist'> | null>;
|
|
42
48
|
export declare function printPersistConfig(ctx: CommandContext): Promise<Pick<CoreConfig, 'persist'>>;
|
|
43
|
-
export declare function findNewIssues(args: {
|
|
44
|
-
|
|
45
|
-
currReport: string;
|
|
46
|
-
prevReport: string;
|
|
47
|
-
comparisonFiles: OutputFiles;
|
|
48
|
-
logger: Logger;
|
|
49
|
-
git: SimpleGit;
|
|
49
|
+
export declare function findNewIssues(args: CompareReportsArgs & {
|
|
50
|
+
diffFiles: OutputFiles;
|
|
50
51
|
}): Promise<SourceFileIssue[]>;
|
|
51
52
|
export {};
|
package/src/lib/run-utils.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/* eslint-disable max-lines */
|
|
2
|
-
import {
|
|
3
|
-
import path from 'node:path';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
4
3
|
import { removeUndefinedAndEmptyProps, stringifyError, } from '@code-pushup/utils';
|
|
5
4
|
import { createCommandContext, persistedFilesFromConfig, runCollect, runCompare, runPrintConfig, } from './cli/index.js';
|
|
6
5
|
import { parsePersistConfig } from './cli/persist.js';
|
|
7
6
|
import { DEFAULT_SETTINGS } from './constants.js';
|
|
8
7
|
import { listChangedFiles, normalizeGitRef } from './git.js';
|
|
9
8
|
import { filterRelevantIssues } from './issues.js';
|
|
9
|
+
import { saveOutputFiles } from './output-files.js';
|
|
10
10
|
export async function createRunEnv(refs, api, options, git) {
|
|
11
11
|
// eslint-disable-next-line functional/immutable-data
|
|
12
12
|
process.env['CP_VERBOSE'] = options?.silent ? 'false' : 'true';
|
|
@@ -34,12 +34,16 @@ export async function runOnProject(project, env) {
|
|
|
34
34
|
const config = await printPersistConfig(ctx);
|
|
35
35
|
logger.debug(`Loaded persist config from print-config command - ${JSON.stringify(config.persist)}`);
|
|
36
36
|
await runCollect(ctx);
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
const currReport = await saveReportFiles({
|
|
38
|
+
project,
|
|
39
|
+
type: 'current',
|
|
40
|
+
files: persistedFilesFromConfig(config, ctx),
|
|
41
|
+
settings,
|
|
42
|
+
});
|
|
43
|
+
logger.debug(`Collected current report at ${currReport.files.json}`);
|
|
40
44
|
const noDiffOutput = {
|
|
41
|
-
name: project
|
|
42
|
-
files: {
|
|
45
|
+
name: projectToName(project),
|
|
46
|
+
files: { current: currReport.files },
|
|
43
47
|
};
|
|
44
48
|
if (base == null) {
|
|
45
49
|
return noDiffOutput;
|
|
@@ -50,49 +54,51 @@ export async function runOnProject(project, env) {
|
|
|
50
54
|
return noDiffOutput;
|
|
51
55
|
}
|
|
52
56
|
const compareArgs = { project, env, base, config, currReport, prevReport };
|
|
53
|
-
|
|
54
|
-
return {
|
|
55
|
-
...noDiffOutput,
|
|
56
|
-
files: {
|
|
57
|
-
...noDiffOutput.files,
|
|
58
|
-
diff: diffFiles,
|
|
59
|
-
},
|
|
60
|
-
...(newIssues && { newIssues }),
|
|
61
|
-
};
|
|
57
|
+
return compareReports(compareArgs);
|
|
62
58
|
}
|
|
63
59
|
export async function compareReports(args) {
|
|
64
|
-
const { project, env: { settings
|
|
60
|
+
const { project, env: { settings }, currReport, prevReport, config, } = args;
|
|
65
61
|
const logger = settings.logger;
|
|
66
62
|
const ctx = createCommandContext(settings, project);
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
logger.debug(`Saved reports to ${currPath} and ${prevPath}`);
|
|
74
|
-
await runCompare({ before: prevPath, after: currPath, label: project?.name }, ctx);
|
|
75
|
-
const comparisonFiles = persistedFilesFromConfig(config, {
|
|
63
|
+
await runCompare({
|
|
64
|
+
before: prevReport.files.json,
|
|
65
|
+
after: currReport.files.json,
|
|
66
|
+
label: project?.name,
|
|
67
|
+
}, ctx);
|
|
68
|
+
const diffFiles = persistedFilesFromConfig(config, {
|
|
76
69
|
directory: ctx.directory,
|
|
77
70
|
isDiff: true,
|
|
78
71
|
});
|
|
79
72
|
logger.info('Compared reports and generated diff files');
|
|
80
|
-
logger.debug(`Generated diff files at ${
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
73
|
+
logger.debug(`Generated diff files at ${diffFiles.json} and ${diffFiles.md}`);
|
|
74
|
+
return {
|
|
75
|
+
name: projectToName(project),
|
|
76
|
+
files: {
|
|
77
|
+
current: currReport.files,
|
|
78
|
+
previous: prevReport.files,
|
|
79
|
+
comparison: await saveOutputFiles({
|
|
80
|
+
project,
|
|
81
|
+
type: 'comparison',
|
|
82
|
+
files: diffFiles,
|
|
83
|
+
settings,
|
|
84
|
+
}),
|
|
85
|
+
},
|
|
86
|
+
...(settings.detectNewIssues && {
|
|
87
|
+
newIssues: await findNewIssues({ ...args, diffFiles }),
|
|
88
|
+
}),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export async function saveReportFiles(args) {
|
|
92
|
+
const [content, files] = await Promise.all([
|
|
93
|
+
readFile(args.files.json, 'utf8'),
|
|
94
|
+
saveOutputFiles(args),
|
|
95
|
+
]);
|
|
96
|
+
return { content, files };
|
|
93
97
|
}
|
|
94
98
|
export async function collectPreviousReport(args) {
|
|
95
|
-
const { ctx, env, base } = args;
|
|
99
|
+
const { ctx, env, base, project } = args;
|
|
100
|
+
const { settings } = env;
|
|
101
|
+
const { logger } = settings;
|
|
96
102
|
const cachedBaseReport = await loadCachedBaseReport(args);
|
|
97
103
|
if (cachedBaseReport) {
|
|
98
104
|
return cachedBaseReport;
|
|
@@ -103,14 +109,19 @@ export async function collectPreviousReport(args) {
|
|
|
103
109
|
return null;
|
|
104
110
|
}
|
|
105
111
|
await runCollect(ctx);
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
112
|
+
const report = await saveReportFiles({
|
|
113
|
+
project,
|
|
114
|
+
type: 'previous',
|
|
115
|
+
files: persistedFilesFromConfig(config, ctx),
|
|
116
|
+
settings,
|
|
117
|
+
});
|
|
118
|
+
logger.debug(`Collected previous report at ${report.files.json}`);
|
|
119
|
+
return report;
|
|
110
120
|
});
|
|
111
121
|
}
|
|
112
122
|
export async function loadCachedBaseReport(args) {
|
|
113
|
-
const { project, env: { api, settings
|
|
123
|
+
const { project, env: { api, settings }, } = args;
|
|
124
|
+
const { logger } = settings;
|
|
114
125
|
const cachedBaseReport = await api
|
|
115
126
|
.downloadReportArtifact?.(project?.name)
|
|
116
127
|
.catch((error) => {
|
|
@@ -122,10 +133,15 @@ export async function loadCachedBaseReport(args) {
|
|
|
122
133
|
logger.debug(`Previous report artifact downloaded to ${cachedBaseReport}`);
|
|
123
134
|
}
|
|
124
135
|
}
|
|
125
|
-
if (cachedBaseReport) {
|
|
126
|
-
return
|
|
136
|
+
if (!cachedBaseReport) {
|
|
137
|
+
return null;
|
|
127
138
|
}
|
|
128
|
-
return
|
|
139
|
+
return saveReportFiles({
|
|
140
|
+
project,
|
|
141
|
+
type: 'previous',
|
|
142
|
+
files: { json: cachedBaseReport },
|
|
143
|
+
settings,
|
|
144
|
+
});
|
|
129
145
|
}
|
|
130
146
|
export async function runInBaseBranch(base, env, fn) {
|
|
131
147
|
const { git, settings: { logger }, } = env;
|
|
@@ -159,17 +175,20 @@ export async function printPersistConfig(ctx) {
|
|
|
159
175
|
return parsePersistConfig(json);
|
|
160
176
|
}
|
|
161
177
|
export async function findNewIssues(args) {
|
|
162
|
-
const { base, currReport, prevReport,
|
|
178
|
+
const { base, currReport, prevReport, diffFiles, env: { git, settings: { logger }, }, } = args;
|
|
163
179
|
await git.fetch('origin', base.ref, ['--depth=1']);
|
|
164
|
-
const reportsDiff = await readFile(
|
|
180
|
+
const reportsDiff = await readFile(diffFiles.json, 'utf8');
|
|
165
181
|
const changedFiles = await listChangedFiles({ base: 'FETCH_HEAD', head: 'HEAD' }, git);
|
|
166
182
|
const issues = filterRelevantIssues({
|
|
167
|
-
currReport: JSON.parse(currReport),
|
|
168
|
-
prevReport: JSON.parse(prevReport),
|
|
183
|
+
currReport: JSON.parse(currReport.content),
|
|
184
|
+
prevReport: JSON.parse(prevReport.content),
|
|
169
185
|
reportsDiff: JSON.parse(reportsDiff),
|
|
170
186
|
changedFiles,
|
|
171
187
|
});
|
|
172
188
|
logger.debug(`Found ${issues.length} relevant issues for ${Object.keys(changedFiles).length} changed files`);
|
|
173
189
|
return issues;
|
|
174
190
|
}
|
|
191
|
+
function projectToName(project) {
|
|
192
|
+
return project?.name ?? '-';
|
|
193
|
+
}
|
|
175
194
|
//# sourceMappingURL=run-utils.js.map
|
package/src/lib/run-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-utils.js","sourceRoot":"","sources":["../../../../../packages/ci/src/lib/run-utils.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"run-utils.js","sourceRoot":"","sources":["../../../../../packages/ci/src/lib/run-utils.ts"],"names":[],"mappings":"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"}
|