[build] move to absolute paths and improve fpm/pleaserun support

This commit is contained in:
spalger 2015-08-14 13:27:41 -07:00
parent e1a04f9514
commit bc3529ec65
17 changed files with 124 additions and 105 deletions

View file

@ -4,31 +4,26 @@ module.exports = function createPackages(grunt) {
let { execFile } = require('child_process');
let { all, fromNode } = require('bluebird');
let rootDir = config.get('root');
let buildDir = resolve(rootDir, 'build');
let buildPath = resolve(config.get('root'), 'build');
let exec = async (cmd, args) => {
grunt.log.writeln(` > ${cmd} ${args.join(' ')}`);
await fromNode(cb => execFile(cmd, args, { cwd: buildDir }, cb));
await fromNode(cb => execFile(cmd, args, { cwd: buildPath }, cb));
};
let archives = async (platform) => {
let tarPath = resolve(rootDir, platform.tarPath);
let zipPath = resolve(rootDir, platform.zipPath);
// kibana.tar.gz
await exec('tar', ['-zchf', tarPath, platform.buildName]);
await exec('tar', ['-zchf', platform.tarPath, platform.buildName]);
// kibana.zip
if (/windows/.test(platform.name)) {
await exec('zip', ['-rq', '-ll', zipPath, platform.buildName]);
await exec('zip', ['-rq', '-ll', platform.zipPath, platform.buildName]);
} else {
await exec('zip', ['-rq', zipPath, platform.buildName]);
await exec('zip', ['-rq', platform.zipPath, platform.buildName]);
}
};
grunt.registerTask('build:archives', function () {
grunt.registerTask('_build:archives', function () {
all(
grunt.config.get('platforms')

View file

@ -3,7 +3,7 @@ module.exports = function (grunt) {
var file = 'build/kibana/src/cli/index.js';
var blurb = `require('babel/register')(require('../optimize/babelOptions'));\n`;
grunt.registerTask('build:cliIndex', function () {
grunt.registerTask('_build:cliIndex', function () {
var before = grunt.file.read(file);
var after = before.replace(blurb, '');

View file

@ -13,11 +13,6 @@ module.exports = function (grunt) {
let start = async (platform) => {
let finalDir = platform.nodeDir;
if (!grunt.file.isPathAbsolute(finalDir)) {
// since we are using fs module function we need absolute paths
finalDir = resolve(grunt.config.get('root'), finalDir);
}
let downloadDir = `${finalDir}.temp`;
if (grunt.file.isDir(platform.nodeDir)) {
@ -75,11 +70,11 @@ module.exports = function (grunt) {
grunt.log.ok(`downloading ${platform.name} - ${mb} mb`);
};
grunt.registerTask('build:downloadNodes:start', function () {
grunt.registerTask('_build:downloadNodes:start', function () {
map(platforms, start).nodeify(this.async());
});
grunt.registerTask('build:downloadNodes:finish', function () {
grunt.registerTask('_build:downloadNodes:finish', function () {
map(activeDownloads, async (platform) => {
await platform.downloadPromise;
grunt.log.ok(`${platform.name} download complete`);

View file

@ -1,6 +1,6 @@
module.exports = function (grunt) {
var exec = require('child_process').execSync;
grunt.registerTask('build:getProps', function () {
grunt.registerTask('_build:getProps', function () {
grunt.config.set('buildSha', String(exec('git rev-parse HEAD')).trim());
grunt.config.set('buildNum', parseFloat(String(exec('git log --format="%h" | wc -l')).trim()));
});

View file

@ -2,29 +2,28 @@ module.exports = function (grunt) {
let { flatten } = require('lodash');
grunt.registerTask('build', flatten([
'build:getProps',
'_build:getProps',
'clean:build',
'clean:target',
'build:downloadNodes:start',
'_build:downloadNodes:start',
'copy:devSource',
'babel:build',
'build:cliIndex',
'build:installedPlugins',
'build:packageJson',
'build:readme',
'build:installNpmDeps',
'_build:cliIndex',
'_build:installedPlugins',
'_build:packageJson',
'_build:readme',
'_build:installNpmDeps',
'clean:testsFromModules',
'clean:deepModules',
'run:optimizeBuild',
'stop:optimizeBuild',
'build:downloadNodes:finish',
'build:versionedLinks',
'build:archives',
'_build:downloadNodes:finish',
'_build:versionedLinks',
'_build:archives',
!grunt.option('os-packages') ? [] : [
'build:pleaseRun',
'build:pleaseManageUser',
'build:osPackages',
'_build:pleaseRun',
'_build:osPackages',
],
'build:shasums'
'_build:shasums'
]));
};

View file

@ -2,7 +2,7 @@ module.exports = function (grunt) {
var { exec } = require('child_process');
var { resolve } = require('path');
grunt.registerTask('build:installNpmDeps', function () {
grunt.registerTask('_build:installNpmDeps', function () {
grunt.file.mkdir('build/kibana/node_modules');
exec('npm install --production --no-optional', {

View file

@ -1,5 +1,5 @@
module.exports = function (grunt) {
grunt.registerTask('build:installedPlugins', function () {
grunt.registerTask('_build:installedPlugins', function () {
grunt.file.mkdir('build/kibana/installedPlugins');
});
};

View file

@ -1,49 +1,47 @@
module.exports = function (grunt) {
let { resolve } = require('path');
let { indexBy } = require('lodash');
let { execFileSync } = require('child_process');
let { config } = grunt;
let exec = require('../utils/exec');
let targetDir = config.get('target');
let version = config.get('pkg.version');
let userScriptsDir = config.get('userScriptsDir');
let servicesByName = indexBy(config.get('services'), 'id');
let servicesByName = indexBy(config.get('services'), 'name');
grunt.registerTask('build:osPackages', function () {
grunt.registerTask('_build:osPackages', function () {
grunt.config.get('platforms').forEach(({ name, buildDir }) => {
// TODO(sissel): Check if `fpm` is available
let arch = /x64$/.test(name) ? 'x86_64' : 'i686';
let files = buildDir + '/=/opt/kibana';
let fpm = args => execFileSync('fpm', args);
let fpm = args => exec('fpm', args);
let args = [
'-f',
'-p', targetDir,
'-s', 'dir',
'-n', 'kibana',
'-v', version,
'--force',
'--package', targetDir,
'-s', 'dir', // input type
'--name', 'kibana',
'--version', version,
'--after-install', resolve(userScriptsDir, 'installer.sh'),
'--after-remove', resolve(userScriptsDir, 'remover.sh'),
'--config-files', '/opt/kibana/config/kibana.yml'
];
let files = buildDir + '/=/opt/kibana';
grunt.file.mkdir(targetDir);
// TODO(sissel): Check if `fpm` is available
// kibana.rpm and kibana.deb
if (/linux-x(86|64)$/.test(name)) {
// kibana.rpm and kibana.deb
let sysv = servicesByName.sysv;
let sysvInit = sysv.outputDir + '/etc/=/etc/';
fpm(args.concat('-t', 'rpm', '-a', arch, '--rpm-os', 'linux', files, sysvInit));
fpm(args.concat('-t', 'deb', '-a', arch, files, sysvInit));
let sysv = servicesByName.sysv.outputDir + '/etc/=/etc/';
fpm(args.concat('-t', 'rpm', '-a', arch, '--rpm-os', 'linux', files, sysv));
fpm(args.concat('-t', 'deb', '-a', arch, files, sysv));
return;
}
// kibana.pkg
if (/darwin-x(86|64)$/.test(name)) {
// kibana.pkg
let launchd = servicesByName.launchd;
let launchdInit = launchd.outputDir + '/=/';
fpm(args.concat('-t', 'osxpkg', '-a', arch, files, launchdInit));
let launchd = servicesByName.launchd.outputDir + '/=/';
fpm(args.concat('-t', 'osxpkg', '-a', arch, files, launchd));
return;
}

View file

@ -4,7 +4,7 @@ module.exports = function (grunt) {
let pkg = grunt.config.get('pkg');
let deepModules = grunt.config.get('deepModules');
grunt.registerTask('build:packageJson', function () {
grunt.registerTask('_build:packageJson', function () {
grunt.file.write(
'build/kibana/package.json',

View file

@ -1,10 +0,0 @@
module.exports = function (grunt) {
let { execFileSync } = require('child_process');
let { resolve } = require('path');
let userScriptsDir = grunt.config.get('userScriptsDir');
grunt.registerTask('build:pleaseManageUser', function () {
grunt.file.mkdir(userScriptsDir);
execFileSync('please-manage-user', ['--output', userScriptsDir, 'kibana']);
});
};

View file

@ -1,17 +1,19 @@
var { resolve } = require('path');
var { execFileSync } = require('child_process');
module.exports = function createServices(grunt) {
grunt.registerTask('build:pleaserun', function () {
var { resolve } = require('path');
let exec = require('../utils/exec');
let userScriptsPath = grunt.config.get('userScriptsPath');
grunt.registerTask('_build:pleaseRun', function () {
// TODO(sissel): Detect if 'pleaserun' is found, and provide a useful error
// to the user if it is missing.
grunt.config.get('services').forEach(function (service) {
grunt.file.mkdir(service.outDir);
execFileSync('pleaserun', [
grunt.file.mkdir(service.outputDir);
exec('pleaserun', [
'--install',
'--no-install-actions',
'--install-prefix', service.outDir,
'--install-prefix', service.outputDir,
'--overwrite',
'--user', 'kibana',
'--sysv-log-path', '/var/log/kibana/',
@ -21,5 +23,8 @@ module.exports = function createServices(grunt) {
]);
});
grunt.file.mkdir(userScriptsPath);
exec('please-manage-user', ['--output', userScriptsPath, 'kibana']);
});
};

View file

@ -13,7 +13,7 @@ TextRenderer.prototype.heading = function (text, level, raw) {
module.exports = function (grunt) {
grunt.registerTask('build:readme', function () {
grunt.registerTask('_build:readme', function () {
let transform = function (input) {
let output = input.replace(/<\!\-\- [^\-]+ \-\->/g, '\n');
output = marked(output);

View file

@ -3,7 +3,7 @@ var readdir = promisify(require('fs').readdir);
var exec = promisify(require('child_process').exec);
module.exports = function (grunt) {
grunt.registerTask('build:shasums', function () {
grunt.registerTask('_build:shasums', function () {
var targetDir = grunt.config.get('target');
readdir(targetDir)

View file

@ -1,30 +1,30 @@
module.exports = function (grunt) {
let { execFileSync } = require('child_process');
let { basename, resolve } = require('path');
let { forOwn } = require('lodash');
grunt.registerTask('build:versionedLinks', function () {
let buildFiles = grunt.file.expand('build/kibana/{*,.*}');
let rootDir = grunt.config.get('root');
let exec = require('../utils/exec').silent;
let buildMap = buildFiles.reduce(function (map, file) {
map[file] = basename(file);
return map;
}, {});
grunt.registerTask('_build:versionedLinks', function () {
let rootPath = grunt.config.get('root');
let ln = (source, link) => {
execFileSync('ln', [
'-s',
resolve(rootDir, source),
resolve(rootDir, link)
]);
};
let buildFiles = grunt.file.expand('build/kibana/{*,.*}')
.map(function (file) {
return resolve(rootPath, file);
});
console.log(buildFiles);
let ln = (source, link) => exec('ln', ['-s', source, link]);
grunt.config.get('platforms').forEach(function (platform) {
grunt.file.mkdir(platform.buildDir);
forOwn(buildMap, function (link, source) {
ln(source, resolve(platform.buildDir, link));
// link all files at the root of the build
buildFiles.forEach(function (source) {
ln(source, resolve(platform.buildDir, basename(source)));
});
// link the node modules
ln(platform.nodeDir, resolve(platform.buildDir, 'node'));
});
});

View file

@ -1,6 +1,9 @@
module.exports = function (grunt) {
let { resolve } = require('path');
let version = grunt.config.get('pkg.version');
let nodeVersion = grunt.config.get('nodeVersion');
let rootPath = grunt.config.get('root');
let baseUri = `https://iojs.org/dist/v${nodeVersion}`;
return [
@ -12,15 +15,23 @@ module.exports = function (grunt) {
let win = name === 'windows';
let nodeUrl = win ? `${baseUri}/win-x64/iojs.exe` : `${baseUri}/iojs-v${nodeVersion}-${name}.tar.gz`;
let nodeDir = `.node_binaries/${nodeVersion}/${name}`;
let nodeDir = resolve(rootPath, `.node_binaries/${nodeVersion}/${name}`);
let buildName = `kibana-${version}-${name}`;
let buildDir = `build/${buildName}`;
let tarName = `${buildName}.tar.gz`;
let tarPath = `target/${tarName}`;
let zipName = `${buildName}.zip`;
let zipPath = `target/${zipName}`;
let buildDir = resolve(rootPath, `build/${buildName}`);
return { name, buildName, nodeUrl, tarName, tarPath, zipName, zipPath, buildDir, nodeDir };
let tarName = `${buildName}.tar.gz`;
let tarPath = resolve(rootPath, `target/${tarName}`);
let zipName = `${buildName}.zip`;
let zipPath = resolve(rootPath, `target/${zipName}`);
return {
name, win,
nodeUrl, nodeDir,
buildName, buildDir,
tarName, tarPath,
zipName, zipPath,
};
});
};

View file

@ -1,14 +1,14 @@
module.exports = function (grunt) {
[
let { resolve } = require('path');
let rootDir = grunt.config.get('root');
return [
['launchd', '10.9'],
['upstart', '1.5'],
['systemd', 'default'],
['sysv', 'lsb-3.1']
]
.map(function ([ name, version ]) {
return {
name,
version,
outputDir: `build/services/${name}` };
return { name, version, outputDir: resolve(rootDir, `build/services/${name}`) };
});
};

26
tasks/utils/exec.js Normal file
View file

@ -0,0 +1,26 @@
let { execFileSync } = require('child_process');
function exec(cmd, args, opts) {
console.log(' >', cmd, args.join(' '));
exec.silent(cmd, args, opts);
};
exec.silent = function (cmd, args, opts) {
opts = opts || {};
if (!opts.stdio) opts.stdio = ['ignore', 1, 2];
try {
execFileSync(cmd, args, opts);
} catch (e) {
if (opts.stdio[1] !== 1) {
console.log(e.stdout + '');
}
if (opts.stdio[2] !== 2) {
console.log(e.stderr + '');
}
throw e;
}
};
module.exports = exec;