Skip to content

Commit d22d5e1

Browse files
committed
feat: enable citgm run comparisons
1 parent 824016f commit d22d5e1

File tree

4 files changed

+157
-4
lines changed

4 files changed

+157
-4
lines changed

bin/ncu-ci

+14-3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const {
1515
BenchmarkRun,
1616
CommitBuild,
1717
CITGMBuild,
18+
CITGMComparisonBuild,
1819
HealthBuild,
1920
listBuilds,
2021
FailureAggregator,
@@ -126,13 +127,17 @@ const argv = yargs
126127
handler
127128
})
128129
.command({
129-
command: 'citgm <jobid>',
130+
command: 'citgm <jobid> [jobid2]',
130131
desc: 'Show results of a citgm-smoker CI job',
131132
builder: (yargs) => {
132133
yargs
133134
.positional('jobid', {
134135
describe: 'id of the job',
135136
type: 'number'
137+
})
138+
.positional('jobid2', {
139+
describe: 'id of the second job, if doing a comparison',
140+
type: 'number'
136141
});
137142
},
138143
handler
@@ -209,7 +214,12 @@ class CICommand {
209214
build = new CommitBuild(cli, request, job.jobid);
210215
break;
211216
case CITGM:
212-
build = new CITGMBuild(cli, request, job.jobid);
217+
if (job.jobid2) {
218+
const ids = [job.jobid, job.jobid2];
219+
build = new CITGMComparisonBuild(cli, request, ids);
220+
} else {
221+
build = new CITGMBuild(cli, request, job.jobid);
222+
}
213223
break;
214224
case BENCHMARK:
215225
build = new BenchmarkRun(cli, request, job.jobid);
@@ -320,7 +330,8 @@ class JobCommand extends CICommand {
320330

321331
queue.push({
322332
type: commandToType[this.command],
323-
jobid: argv.jobid
333+
jobid: argv.jobid,
334+
jobid2: argv.jobid2
324335
});
325336
}
326337
}

lib/ci/build-types/citgm_build.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const {
1313
FAILURE_CONSTRUCTORS: {
1414
[NCU_FAILURE]: NCUFailure
1515
}
16-
} = require('./ci_failure_parser');
16+
} = require('../ci_failure_parser');
1717

1818
class CITGMBuild extends TestBuild {
1919
constructor(cli, request, id) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
'use strict';
2+
3+
const { statusType } = require('../ci_utils');
4+
const { CITGMBuild } = require('./citgm_build');
5+
6+
class CITGMComparisonBuild {
7+
constructor(cli, request, ids) {
8+
const baseBuild = new CITGMBuild(cli, request, ids[0]);
9+
const comparisonBuild = new CITGMBuild(cli, request, ids[1]);
10+
11+
this.cli = cli;
12+
this.builds = { baseBuild, comparisonBuild };
13+
this.results = {};
14+
this.ids = ids;
15+
}
16+
17+
async getResults() {
18+
const { builds } = this;
19+
const { baseBuild, comparisonBuild } = builds;
20+
21+
// Result in a comparison context reflects
22+
// whether or not there were failures in
23+
// comparisonBuild not present in baseBuild,
24+
// e.g if there were new failures.
25+
let result = statusType.SUCCESS;
26+
27+
await baseBuild.getResults();
28+
await comparisonBuild.getResults();
29+
30+
const { failures: baseFailures } = baseBuild.results;
31+
const { failures: comparisonFailures } = comparisonBuild.results;
32+
33+
const failures = {};
34+
for (const platform in baseFailures) {
35+
const { modules: baseModules } = comparisonFailures[platform];
36+
const { modules: comparisonModules } = comparisonFailures[platform];
37+
38+
const newFailures = comparisonModules.filter(f => {
39+
return !baseModules.includes(f.name);
40+
});
41+
42+
if (newFailures.length !== 0) {
43+
result = statusType.FAILURE;
44+
}
45+
46+
failures[platform] = newFailures;
47+
}
48+
49+
this.results.failures = failures;
50+
this.result = result;
51+
52+
return result;
53+
}
54+
55+
display() {
56+
const { builds } = this;
57+
58+
// Display header for both CITGM runs.
59+
builds.baseBuild.displayHeader();
60+
builds.comparisonBuild.displayHeader();
61+
62+
this.displayBuilds();
63+
}
64+
65+
displayBuilds() {
66+
const { builds, cli, results, result } = this;
67+
68+
const baseID = builds.baseBuild.id;
69+
const comparisonID = builds.comparisonBuild.id;
70+
71+
cli.separator('Results');
72+
73+
if (result === statusType.SUCCESS) {
74+
cli.log('\n\n');
75+
const str = `No new failures in ${baseID} compared to ${comparisonID}`;
76+
cli.log(`${statusType.SUCCESS}: ${str}\n\n`);
77+
return;
78+
}
79+
80+
const output = {};
81+
for (const platform in results.failures) {
82+
const modules = results.failures[platform];
83+
const failures = modules.map(f => f.name);
84+
85+
output[platform] = failures;
86+
}
87+
88+
console.table(output);
89+
}
90+
91+
formatAsJson() {
92+
const { builds, results } = this;
93+
const { baseBuild, comparisonBuild } = builds;
94+
95+
const result = {
96+
baseBuild: {
97+
source: baseBuild.sourceURL,
98+
upstream: comparisonBuild.jobUrl
99+
},
100+
comparisonBuild: {
101+
source: comparisonBuild.sourceURL,
102+
upstream: baseBuild.jobUrl
103+
},
104+
...results.failures
105+
};
106+
107+
return JSON.parse(JSON.stringify(result));
108+
}
109+
110+
formatAsMarkdown() {
111+
const { builds, result, results } = this;
112+
const { baseBuild, comparisonBuild } = builds;
113+
114+
const bLink = `[#${baseBuild.id}](${baseBuild.jobUrl})`;
115+
const cLink = `[#${comparisonBuild.id}](${comparisonBuild.jobUrl})`;
116+
117+
let output = `# CITGM Data for ${bLink} - ${cLink}\n\n`;
118+
119+
if (result === 'success') {
120+
const bID = baseBuild.id;
121+
const cID = comparisonBuild.id;
122+
output += `No new failures in ${cID} compared to ${bID}`;
123+
return output;
124+
}
125+
126+
output += `## New Failures in job ${cLink}\n\n`;
127+
for (const failure in results.failures) {
128+
const data = results.failures[failure];
129+
output += `### ${failure}\n\n`;
130+
131+
const failures = data.map(f => `* ${f.name}`);
132+
output += failures.length ? `${failures.join('\n')}\n\n` : 'None.\n\n';
133+
}
134+
return output;
135+
}
136+
}
137+
138+
module.exports = { CITGMComparisonBuild };

lib/ci/ci_result_parser.js

+4
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ const { fold, statusType, pad } = require('./ci_utils');
3434
const { Job, jobCache } = require('./build-types/job');
3535
const { TestBuild } = require('./build-types/test_build');
3636
const { CITGMBuild } = require('./build-types/citgm_build');
37+
const {
38+
CITGMComparisonBuild
39+
} = require('./build-types/citgm_comparison_build');
3740
const { flatten } = require('../utils');
3841
const qs = require('querystring');
3942
const _ = require('lodash');
@@ -744,6 +747,7 @@ module.exports = {
744747
BenchmarkRun,
745748
CommitBuild,
746749
CITGMBuild,
750+
CITGMComparisonBuild,
747751
HealthBuild,
748752
jobCache,
749753
parseJobFromURL,

0 commit comments

Comments
 (0)