2018-01-29 14:09:38 +03:00
|
|
|
const beautifyBenchmark = require('beautify-benchmark');
|
|
|
|
const sh = require('shelljs');
|
|
|
|
const fs = require('fs');
|
|
|
|
const pathJoin = require('path').join;
|
|
|
|
const spawn = require('child_process').spawn;
|
|
|
|
const puppeteer = require('puppeteer');
|
|
|
|
|
|
|
|
const args = process.argv.slice(2);
|
|
|
|
args[0] = args[0] || 'HEAD';
|
|
|
|
args[1] = args[1] || 'local';
|
|
|
|
|
2018-01-29 16:11:44 +03:00
|
|
|
let started = false;
|
|
|
|
|
2018-01-29 14:09:38 +03:00
|
|
|
console.log('Benchmarking revisions: ' + args.join(', '));
|
|
|
|
|
|
|
|
const localDistDir = './benchmark/revisions/local/bundles';
|
|
|
|
sh.rm('-rf', localDistDir);
|
|
|
|
console.log(`Building local dist: ${localDistDir}`);
|
|
|
|
sh.mkdir('-p', localDistDir);
|
2020-03-17 12:06:03 +03:00
|
|
|
exec(`npm run bundle:lib --output-path ${localDistDir}`);
|
2018-01-29 14:09:38 +03:00
|
|
|
|
|
|
|
const revisions = [];
|
|
|
|
for (const arg of args) {
|
|
|
|
revisions.push({ name: arg, path: buildRevisionDist(arg) });
|
|
|
|
}
|
|
|
|
|
|
|
|
const configFile = `
|
|
|
|
export const revisions = [ ${revisions.map(rev => JSON.stringify(rev)).join(', ')} ];
|
|
|
|
`;
|
|
|
|
|
|
|
|
const configDir = './benchmark/revisions/config.js';
|
|
|
|
console.log(`Writing config "${configDir}"`);
|
|
|
|
fs.writeFileSync(configDir, configFile);
|
|
|
|
|
2019-12-10 09:13:37 +03:00
|
|
|
console.log('Starting benchmark server');
|
2018-01-29 14:09:38 +03:00
|
|
|
const proc = spawn('npm', ['run', 'start:benchmark']);
|
|
|
|
|
|
|
|
proc.stdout.on('data', data => {
|
2018-03-17 18:58:28 +03:00
|
|
|
if (data.toString().indexOf('Compiled successfully') > -1) {
|
2018-01-29 14:09:38 +03:00
|
|
|
console.log('Server started');
|
|
|
|
startBenchmark();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
proc.stderr.on('data', data => {
|
|
|
|
console.error(data.toString());
|
|
|
|
});
|
|
|
|
|
|
|
|
proc.on('close', code => {
|
|
|
|
console.log(`Benchmark server stopped with code ${code}`);
|
|
|
|
});
|
|
|
|
|
|
|
|
async function runPuppeteer() {
|
|
|
|
return await puppeteer
|
|
|
|
.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox'] })
|
|
|
|
.then(async browser => {
|
|
|
|
const page = await browser.newPage();
|
|
|
|
let resolve;
|
|
|
|
const prom = new Promise(_resolve => {
|
|
|
|
resolve = _resolve;
|
|
|
|
});
|
2018-01-29 16:11:44 +03:00
|
|
|
page.on('console', async msg => {
|
|
|
|
const args = msg.args();
|
|
|
|
const obj = args.length > 0 && (await args[0].jsonValue());
|
2018-01-29 14:09:38 +03:00
|
|
|
if (!obj) return;
|
|
|
|
|
|
|
|
if (obj.done) {
|
|
|
|
beautifyBenchmark.log();
|
|
|
|
// resolve(obj);
|
|
|
|
} else if (obj.cycle) {
|
|
|
|
beautifyBenchmark.add(obj.cycle);
|
|
|
|
} else if (obj.allDone) {
|
|
|
|
resolve();
|
|
|
|
} else {
|
|
|
|
console.log(obj);
|
|
|
|
}
|
|
|
|
});
|
2018-01-29 16:11:44 +03:00
|
|
|
await page.goto('http://127.0.0.1:9090', { timeout: 0 });
|
2018-01-29 14:09:38 +03:00
|
|
|
const res = await prom;
|
|
|
|
await browser.close();
|
|
|
|
return res;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async function startBenchmark() {
|
2018-01-29 16:11:44 +03:00
|
|
|
if (started) return;
|
|
|
|
started = true;
|
2018-01-29 14:09:38 +03:00
|
|
|
console.log('Starting benchmarks');
|
|
|
|
await runPuppeteer();
|
|
|
|
|
|
|
|
console.log('Killing benchmark server');
|
|
|
|
proc.kill('SIGINT');
|
|
|
|
}
|
|
|
|
|
|
|
|
function exec(command) {
|
|
|
|
const { code, stdout, stderr } = sh.exec(command, { silent: true });
|
|
|
|
if (code !== 0) {
|
|
|
|
console.error(stdout);
|
|
|
|
console.error(stderr);
|
|
|
|
sh.exit(code);
|
|
|
|
}
|
|
|
|
return stdout.trim();
|
|
|
|
}
|
|
|
|
|
|
|
|
function buildRevisionDist(revision) {
|
|
|
|
if (revision === 'local') {
|
|
|
|
return localDistDir;
|
|
|
|
}
|
|
|
|
const hash = exec(`git log -1 --format=%h "${revision}"`);
|
|
|
|
const buildDir = './benchmark/revisions/' + hash;
|
|
|
|
const distDir = buildDir + '/bundles';
|
|
|
|
if (sh.test('-d', distDir)) {
|
|
|
|
console.log(`Using prebuilt "${revision}"(${hash}) revision: ${buildDir}`);
|
|
|
|
return distDir;
|
|
|
|
}
|
|
|
|
console.log(`Building "${revision}"(${hash}) revision: ${buildDir}`);
|
|
|
|
sh.mkdir('-p', buildDir);
|
|
|
|
exec(`git archive "${hash}" | tar -xC "${buildDir}"`);
|
|
|
|
|
|
|
|
const pwd = sh.pwd();
|
|
|
|
sh.cd(buildDir);
|
2020-03-17 12:06:03 +03:00
|
|
|
exec('npm uninstall cypress puppeteer && npm install && npm run bundle:lib');
|
2018-01-29 14:09:38 +03:00
|
|
|
sh.cd(pwd);
|
|
|
|
return distDir;
|
|
|
|
}
|