renovate/lib/workers/branch/yarn.js
Rhys Arkins 8dcc83a4a3 feat: support yarn mutex file
Adds yarn mutex file flag to cmd line if set in env
2018-01-27 07:25:08 +01:00

88 lines
2.5 KiB
JavaScript

const fs = require('fs-extra');
const upath = require('upath');
const { getInstalledPath } = require('get-installed-path');
const { exec } = require('child-process-promise');
module.exports = {
generateLockFile,
};
async function generateLockFile(tmpDir, env) {
logger.debug(`Spawning yarn install to create ${tmpDir}/yarn.lock`);
let lockFile = null;
let stdout;
let stderr;
try {
const startTime = process.hrtime();
let cmd;
try {
// See if renovate is installed locally
const installedPath = upath.join(
await getInstalledPath('yarn', {
local: true,
}),
'bin/yarn.js'
);
cmd = `node ${installedPath}`;
} catch (localerr) {
logger.debug('No locally installed yarn found');
// Look inside globally installed renovate
try {
const renovateLocation = await getInstalledPath('renovate');
const installedPath = upath.join(
await getInstalledPath('yarn', {
local: true,
cwd: renovateLocation,
}),
'bin/yarn.js'
);
cmd = `node ${installedPath}`;
} catch (nestederr) {
logger.debug('Could not find globally nested yarn');
// look for global yarn
try {
const installedPath = upath.join(
await getInstalledPath('yarn'),
'bin/yarn.js'
);
cmd = `node ${installedPath}`;
} catch (globalerr) {
logger.warn('Could not find globally installed yarn');
cmd = 'yarn';
}
}
}
logger.debug(`Using yarn: ${cmd}`);
cmd += ' install';
cmd += ' --ignore-scripts';
cmd += ' --ignore-engines';
cmd += process.env.YARN_MUTEX_FILE
? ` --mutex file:${process.env.YARN_MUTEX_FILE}`
: '';
// TODO: Switch to native util.promisify once using only node 8
({ stdout, stderr } = await exec(cmd, {
cwd: tmpDir,
shell: true,
env,
}));
logger.debug(`yarn stdout:\n${stdout}`);
logger.debug(`yarn stderr:\n${stderr}`);
const duration = process.hrtime(startTime);
const seconds = Math.round(duration[0] + duration[1] / 1e9);
lockFile = await fs.readFile(upath.join(tmpDir, 'yarn.lock'), 'utf8');
logger.info(
{ seconds, type: 'yarn.lock', stdout, stderr },
'Generated lockfile'
);
} catch (err) /* istanbul ignore next */ {
logger.info(
{
err,
},
'yarn install error'
);
return { error: true, stderr: err.stderr };
}
return { lockFile };
}