[build] initial fix

This commit is contained in:
spalger 2015-08-13 21:16:54 -07:00
parent 33df0deee1
commit ce366a06f4
36 changed files with 501 additions and 576 deletions

1
.gitignore vendored
View file

@ -5,6 +5,7 @@ node_modules
trash
bundles
target
/build
.jruby
.idea
*.iml

View file

@ -27,20 +27,6 @@ module.exports = function (grunt) {
}()),
nodeVersion: '2.5.0',
platforms: [
'darwin-x64',
'linux-x64',
'linux-x86',
'windows'
],
services: [
['launchd', '10.9'],
['upstart', '1.5'],
['systemd', 'default'],
['sysv', 'lsb-3.1']
],
devPlugins: 'devMode',
meta: {
banner: '/*! <%= package.name %> - v<%= package.version %> - ' +
@ -49,6 +35,7 @@ module.exports = function (grunt) {
' * Copyright (c) <%= grunt.template.today("yyyy") %> <%= package.author.company %>;' +
' Licensed <%= package.license %> */\n'
},
lintThese: [
'Gruntfile.js',
'<%= root %>/tasks/**/*.js',
@ -59,6 +46,12 @@ module.exports = function (grunt) {
grunt.config.merge(config);
config.userScriptsDir = __dirname + '/build/userScripts';
config.services = require('./tasks/config/services')(grunt);
config.platforms = require('./tasks/config/packages')(grunt);
grunt.config.merge(config);
// load plugins
require('load-grunt-config')(grunt, {
configPath: __dirname + '/tasks/config',
@ -69,6 +62,9 @@ module.exports = function (grunt) {
}
});
// load task definitions
grunt.task.loadTasks('tasks');
grunt.task.loadTasks('tasks/build');
};

View file

@ -62,6 +62,7 @@
"babel": "^5.8.21",
"babel-core": "^5.8.21",
"babel-loader": "^5.3.2",
"babel-runtime": "^5.8.20",
"bluebird": "^2.9.27",
"boom": "^2.8.0",
"bootstrap": "^3.3.5",
@ -117,6 +118,7 @@
"webpack": "^1.10.0",
"webpack-directory-name-as-main": "^1.0.0",
"whatwg-fetch": "^0.9.0",
"wreck": "^6.1.0",
"zeroclipboard": "^2.2.0"
},
"devDependencies": {
@ -126,9 +128,9 @@
"expect.js": "^0.3.1",
"faker": "^1.1.0",
"grunt": "^0.4.5",
"grunt-babel": "^5.0.1",
"grunt-cli": "0.1.13",
"grunt-contrib-clean": "^0.6.0",
"grunt-contrib-compress": "^0.13.0",
"grunt-contrib-copy": "^0.8.0",
"grunt-esvm": "^1.1.3",
"grunt-karma": "^0.12.0",

View file

@ -56,4 +56,4 @@
}
@import "../editor/styles/.editor.less";
@import "../editor/styles/_editor.less";

View file

@ -1,26 +0,0 @@
module.exports = function (grunt) {
grunt.registerTask('build', [
'get_build_props',
'clean:target',
'clean:build',
'less:build',
'copy:kibana_src',
'clean:noDistPlugins',
'webpack:build',
'clean:unneeded_source_in_build',
'copy:dist',
'dist_readme',
'dist_package_json',
'chmod_kibana',
'make_plugin_dir',
'copy:plugin_readme',
'clean:test_from_node_modules',
'download_node_binaries',
'copy:versioned_dist',
'create_services',
'create_packages',
'create_shasums'
]);
};

29
tasks/build/build.js Normal file
View file

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

18
tasks/build/cliIndex.js Normal file
View file

@ -0,0 +1,18 @@
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 () {
var before = grunt.file.read(file);
var after = before.replace(blurb, '');
if (before === after) {
grunt.log.error(`unable to remove "${blurb}" from ${file}`);
return;
}
grunt.file.write(file, after);
});
};

View file

@ -0,0 +1,87 @@
module.exports = function (grunt) {
let { map, fromNode, promisify } = require('bluebird');
let { resolve } = require('path');
let { createWriteStream } = require('fs');
let { createGunzip } = require('zlib');
let { Extract } = require('tar');
let mkdirp = promisify(require('mkdirp'));
let rename = promisify(require('fs').rename);
let get = (uri) => fromNode(cb => require('wreck').request('GET', uri, null, cb));
let exists = (path) => fromNode(cb => {
require('fs').stat(path, err => cb(null, !err));
});
let platforms = grunt.config.get('platforms');
let nodeVersion = grunt.config.get('nodeVersion');
let baseUri = `https://iojs.org/dist/v${nodeVersion}`;
let writeTar = async (to, from) => {
await fromNode(cb => {
from
.pipe(createGunzip())
.on('error', cb)
.pipe(new Extract({ path: to, strip: 1 }))
.on('error', cb)
.on('end', cb);
});
};
let writeExe = async (to, from) => {
let winBinDir = resolve(to, 'bin');
await mkdirp(winBinDir);
await fromNode(cb => {
from
.pipe(createWriteStream(resolve(winBinDir, 'node.exe')))
.on('error', cb)
.on('finish', cb);
});
};
let run = () => {
grunt.log.ok(`downloading node binaries`);
return map(platforms, async function (platform) {
grunt.file.mkdir(platform.nodeDir);
let finalDir = resolve(grunt.config.get('root'), platform.nodeDir);
let downloadDir = `${finalDir}.temp`;
if (await exists(finalDir)) {
grunt.log.debug(`${platform} download exists`);
return;
}
let uri;
if (platform === 'windows') {
uri = `${baseUri}/win-x64/iojs.exe`;
} else {
uri = `${baseUri}/iojs-v${nodeVersion}-${platform}.tar.gz`;
}
let resp = await get('GET', uri);
if (resp.statusCode !== 200) {
throw new Error(uri + ' failed with a ' + resp.statusCode);
}
let write = platform === 'windows' ? writeExe : writeTar;
await write(downloadDir, resp);
await rename(downloadDir, finalDir);
grunt.log.debug(`${platform} download complete`);
});
};
let current = null;
let start = () => current || (current = run());
grunt.registerTask('downloadNodes:start', start);
grunt.registerTask('downloadNodes:finish', function () {
start().then(() => {
grunt.log.ok(`node binaries for ${platforms.join(', ')} downloaded`);
})
.nodeify(this.async());
});
};

View file

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

View file

@ -0,0 +1,16 @@
module.exports = function (grunt) {
var { execSync } = require('child_process');
var { resolve } = require('path');
grunt.registerTask('build-installNpmDeps', function () {
grunt.file.mkdir('build/kibana/node_modules');
execSync('npm install --production --no-optional', {
cwd: grunt.config.process('<%= root %>/build/kibana')
});
grunt.log.ok('done');
});
};

View file

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

31
tasks/build/linkNodes.js Normal file
View file

@ -0,0 +1,31 @@
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 buildMap = buildFiles.reduce(function (map, file) {
map[file] = basename(file);
return map;
}, {});
let ln = (source, link) => {
execFileSync('ln', [
'-s',
resolve(rootDir, source),
resolve(rootDir, link)
]);
};
grunt.config.get('platforms').forEach(function (platform) {
grunt.file.mkdir(platform.buildDir);
forOwn(buildMap, function (link, source) {
ln(source, resolve(platform.buildDir, link));
});
ln(platform.nodeDir, resolve(platform.buildDir, 'node'));
});
});
};

52
tasks/build/osPackages.js Normal file
View file

@ -0,0 +1,52 @@
module.exports = function (grunt) {
let { resolve } = require('path');
let { indexBy } = require('lodash');
let { execFileSync } = require('child_process');
let { config } = grunt;
let targetDir = config.get('target');
let version = config.get('pkg.version');
let userScriptsDir = config.get('userScriptsDir');
let servicesByName = indexBy(config.get('services'), 'id');
grunt.registerTask('build-osPackages', function () {
grunt.config.get('platforms').forEach(({ name, buildDir }) => {
let arch = /x64$/.test(name) ? 'x86_64' : 'i686';
let files = buildDir + '/=/opt/kibana';
let fpm = args => execFileSync('fpm', args);
let args = [
'-f',
'-p', targetDir,
'-s', 'dir',
'-n', 'kibana',
'-v', version,
'--after-install', resolve(userScriptsDir, 'installer.sh'),
'--after-remove', resolve(userScriptsDir, 'remover.sh'),
'--config-files', '/opt/kibana/config/kibana.yml'
];
grunt.file.mkdir(targetDir);
// TODO(sissel): Check if `fpm` is available
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));
return;
}
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));
return;
}
});
});
};

View file

@ -0,0 +1,21 @@
module.exports = function (grunt) {
grunt.registerTask('build-packageJson', function () {
var pkg = grunt.config.get('pkg');
grunt.file.write(
'build/kibana/package.json',
JSON.stringify({
name: pkg.name,
description: pkg.description,
keywords: pkg.keywords,
version: pkg.version,
build: {
number: grunt.config.get('buildNum'),
sha: grunt.config.get('buildSha')
},
repository: pkg.repository,
dependencies: pkg.dependencies
}, null, ' ')
);
});
};

42
tasks/build/packages.js Normal file
View file

@ -0,0 +1,42 @@
module.exports = function createPackages(grunt) {
let { config } = grunt;
let { resolve } = require('path');
let { execFile } = require('child_process');
let { all, fromNode } = require('bluebird');
let version = config.get('pkg.version');
let rootDir = config.get('root');
let targetDir = resolve(rootDir, 'target');
let buildDir = resolve(rootDir, 'build/kibana');
let exec = async (cmd, args) => {
grunt.log.writeln(` > ${cmd} ${args.join(' ')}`);
await fromNode(cb => execFile(cmd, args, { cwd: rootDir }, cb));
};
let archives = async (platform) => {
// kibana.tar.gz
await exec('tar', ['-zchf', platform.tarPath, platform.buildDir]);
// kibana.zip
if (/windows/.test(platform.name)) {
await exec('zip', ['-rq', '-ll', platform.zipPath, platform.buildDir]);
} else {
await exec('zip', ['-rq', platform.zipPath, platform.buildDir]);
}
};
grunt.registerTask('build-archives', function () {
all(
grunt.config.get('platforms')
.map(async platform => {
grunt.file.mkdir('target');
await archives(platform);
})
)
.nodeify(this.async());
});
};

View file

@ -0,0 +1,10 @@
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']);
});
};

25
tasks/build/pleaserun.js Normal file
View file

@ -0,0 +1,25 @@
var { resolve } = require('path');
var { execFileSync } = require('child_process');
module.exports = function createServices(grunt) {
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', [
'--install',
'--no-install-actions',
'--install-prefix', service.outDir,
'--overwrite',
'--user', 'kibana',
'--sysv-log-path', '/var/log/kibana/',
'-p', service.name,
'-v', service.version,
'/opt/kibana/bin/kibana'
]);
});
});
};

37
tasks/build/readme.js Normal file
View file

@ -0,0 +1,37 @@
let marked = require('marked');
let Promise = require('bluebird');
let { join } = require('path');
let TextRenderer = require('marked-text-renderer');
let _ = require('lodash');
let fs = require('fs');
let { AllHtmlEntities } = require('html-entities');
let entities = new AllHtmlEntities();
TextRenderer.prototype.heading = function (text, level, raw) {
return '\n\n' + text + '\n' + _.map(text, function () { return '='; }).join('') + '\n';
};
module.exports = function (grunt) {
grunt.registerTask('build-readme', function () {
let transform = function (input) {
let output = input.replace(/<\!\-\- [^\-]+ \-\->/g, '\n');
output = marked(output);
return entities.decode(output);
};
marked.setOptions({
renderer: new TextRenderer(),
tables: true,
breaks: false,
pedantic: false,
sanitize: false,
smartLists: true,
smartypants: false
});
grunt.file.write('build/kibana/README.txt', transform(grunt.file.read('README.md')));
grunt.file.write('build/kibana/LICENSE.txt', transform(grunt.file.read('LICENSE.md')));
});
};

View file

@ -1,12 +1,9 @@
var childProcess = require('child_process');
var Promise = require('bluebird');
var fs = require('fs');
var readdir = Promise.promisify(fs.readdir);
var exec = Promise.promisify(childProcess.exec);
var _ = require('lodash');
module.exports = function (grunt) {
var { promisify } = require('bluebird');
var readdir = promisify(require('fs').readdir);
var exec = promisify(require('child_process').exec);
grunt.registerTask('create_shasums', function () {
module.exports = function (grunt) {
grunt.registerTask('build-shasums', function () {
var targetDir = grunt.config.get('target');
readdir(targetDir)

19
tasks/config/babel.js Normal file
View file

@ -0,0 +1,19 @@
let { defaults } = require('lodash');
let babelOptions = require('requirefrom')('src')('optimize/babelOptions');
module.exports = {
build: {
options: defaults({
optional: ['runtime']
}, babelOptions),
src: [
'build/kibana/**/*.js',
'!**/public/**',
'!**/node_modules/**',
'!**/bower_components/**',
'!**/__tests__/**'
],
dest: '.',
expand: true
}
};

View file

@ -1,6 +1,7 @@
module.exports = function (grunt) {
return {
build: '<%= build %>',
target: '<%= target %>'
build: 'build',
target: 'target',
testsFromModules: 'build/kibana/node_modules/**/*test*'
};
};

View file

@ -1,49 +0,0 @@
module.exports = function (grunt) {
var _ = require('lodash');
var archiveName = function (plugin) {
return '<%= target %>/<%= pkg.name %>-' + (plugin ? 'plugin-' : '') + '<%= pkg.version %>';
};
return _.mapValues({
build_zip: archiveName() + '.zip',
build_tarball: archiveName() + '.tar.gz',
plugin: archiveName(true) + '.tar.gz'
}, function (filename, task) {
return {
options: {
archive: filename
},
files: [
{
flatten: true,
src: '<%= build %>/dist/bin/kibana',
dest: '<%= pkg.name %>/bin/kibana',
mode: 755
},
{
flatten: true,
src: '<%= build %>/dist/bin/kibana.bat',
dest: '<%= pkg.name %>/bin/kibana.bat'
},
{
expand: true,
cwd: '<%= build %>/dist/config',
src: ['**/*'],
dest: '<%= pkg.name %>/config'
},
{
expand: true,
cwd: '<%= build %>/dist/lib',
src: ['**/*'],
dest: '<%= pkg.name %>/lib'
},
{
expand: true,
cwd: '<%= build %>/dist',
src: ['*.txt'],
dest: '<%= pkg.name %>'
}
]
};
});
};

View file

@ -1,122 +1,21 @@
module.exports = function (grunt) {
var version = grunt.config.get('pkg.version');
var platforms = grunt.config.get('platforms');
var config = {
kibana_src: {
expand: true,
cwd: '<%= app %>',
src: '**',
dest: '<%= build %>/src/'
},
server_src: {
files: [
{
src: '<%= root %>/package.json',
dest: '<%= build %>/kibana/package.json'
},
{
src: '<%= server %>/app.js',
dest: '<%= build %>/kibana/app.js'
},
{
src: '<%= server %>/index.js',
dest: '<%= build %>/kibana/index.js'
},
{
expand: true,
cwd: '<%= server %>/bin/',
src: '**',
dest: '<%= build %>/kibana/bin'
},
{
expand: true,
cwd: '<%= server %>/config/',
src: '*.yml',
dest: '<%= build %>/kibana/config'
},
{
expand: true,
cwd: '<%= server %>/lib/',
src: '**',
dest: '<%= build %>/kibana/lib'
},
{
expand: true,
cwd: '<%= server %>/plugins/',
src: '**',
dest: '<%= build %>/kibana/plugins'
},
{
expand: true,
cwd: '<%= server %>/routes/',
src: '**',
dest: '<%= build %>/kibana/routes'
},
{
expand: true,
cwd: '<%= server %>/views/',
src: '**',
dest: '<%= build %>/kibana/views'
}
]
},
dist: {
return {
devSource: {
options: { mode: true },
files: [
{
expand: true,
cwd: '<%= build %>/kibana',
src: '**',
dest: '<%= build %>/dist/kibana/src'
},
{
expand: true,
cwd: '<%= server %>/config/',
src: 'kibana.yml',
dest: '<%= build %>/dist/kibana/config/'
},
{
expand: true,
cwd: '<%= bowerComponentsDir %>/ace-builds/src-noconflict/',
src: 'worker-json.js',
dest: '<%= build %>/dist/kibana/src/public/'
}
]
src: [
'src/**',
'bin/**',
'config/kibana.yml',
'.node-version',
'!src/**/__tests__/**',
'!src/testUtils/**',
'!src/fixtures/**',
'!src/plugins/devMode/**',
'!src/plugins/testsBundle/**',
'!src/cli/cluster/**',
],
dest: 'build/kibana',
expand: true
},
versioned_dist: {
options: { mode: true },
files: []
},
plugin_readme: {
files: [
{
src: '<%= build %>/kibana/public/plugins/README.txt',
dest: '<%= build %>/dist/kibana/plugins/README.txt'
}
]
}
};
platforms.forEach(function (platform) {
config.versioned_dist.files.push({
expand: true,
cwd: '<%= build %>/dist/kibana',
src: '**',
dest: '<%= build %>/dist/kibana-' + version + '-' + platform
});
config.versioned_dist.files.push({
expand: true,
cwd: '<%= root %>/.node_binaries/' + platform,
src: '**',
dest: '<%= build %>/dist/kibana-' + version + '-' + platform + '/node'
});
});
return config;
};

22
tasks/config/packages.js Normal file
View file

@ -0,0 +1,22 @@
module.exports = function (grunt) {
let version = grunt.config.get('pkg.version');
let nodeVersion = grunt.config.get('nodeVersion');
return [
'darwin-x64',
'linux-x64',
'linux-x86',
'windows'
].map(function (name) {
var filename = `kibana-${version}-${name}`;
return {
name,
filename,
tarPath: `target/${filename}.tar.gz`,
zipPath: `target/${filename}.zip`,
buildDir: `build/${filename}`,
nodeDir: `.node_binaries/${nodeVersion}/${name}`,
};
});
};

View file

@ -17,6 +17,21 @@ module.exports = function (grunt) {
'--optimize.tests=true',
'--optimize.lazy=false'
]
},
optimizeBuild: {
options: {
wait: false,
ready: /Server running/,
quiet: false
},
cmd: './build/kibana/bin/kibana',
args: [
'--env.name=production',
'--logging.json=false',
'--plugins.initialize=false',
'--server.autoListen=false'
]
}
};

View file

@ -1,31 +1,27 @@
var createPackages = require('../create_packages');
var _ = require('lodash');
var getBaseNames = createPackages.getBaseNames;
module.exports = function (grunt) {
var upload = _(getBaseNames(grunt))
.map(function (basename) {
return [
basename + '.tar.gz',
basename + '.tar.gz.sha1.txt',
basename + '.zip',
basename + '.zip.sha1.txt'
];
})
.flattenDeep()
.map(function (filename) {
return {
src: 'target/' + filename,
dest: 'kibana/kibana/' + filename
};
})
.value();
var { config } = grunt;
return {
release: {
bucket: 'download.elasticsearch.org',
access: 'private',
// debug: true, // uncommment to prevent actual upload
upload: upload
upload: config.get('platforms')
.reduce(function (files, platform) {
return files.concat(
platform.tarPath,
platform.tarPath + '.sha1.txt',
platform.zipPath,
platform.zipPath + '.sha1.txt'
);
}, [])
.map(function (filename) {
return {
src: 'target/' + filename,
dest: 'kibana/kibana/' + filename
};
})
}
};
};

14
tasks/config/services.js Normal file
View file

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

View file

@ -1,76 +0,0 @@
/* eslint camelcase:0 */
var child_process = require('child_process');
var Promise = require('bluebird');
var { join } = require('path');
var mkdirp = Promise.promisifyAll(require('mkdirp'));
var execFile = Promise.promisify(child_process.execFile);
var getBaseNames = function (grunt) {
var packageName = grunt.config.get('pkg.name');
var version = grunt.config.get('pkg.version');
var platforms = grunt.config.get('platforms');
return platforms.map(function (platform) {
return packageName + '-' + version + '-' + platform;
});
};
function createPackages(grunt) {
grunt.registerTask('create_packages', function () {
var done = this.async();
var target = grunt.config.get('target');
var distPath = join(grunt.config.get('build'), 'dist');
var version = grunt.config.get('pkg.version');
var createPackage = function (name) {
var options = { cwd: distPath };
var archiveName = join(target, name);
var commands = [];
var arch = /x64$/.test(name) ? 'x86_64' : 'i686';
var fpm_options = [ 'fpm', '-f', '-p', target, '-s', 'dir', '-n', 'kibana', '-v', version,
'--after-install', join(distPath, 'user', 'installer.sh'),
'--after-remove', join(distPath, 'user', 'remover.sh'),
'--config-files', '/opt/kibana/config/kibana.yml' ];
var fpm_files = join(distPath, name) + '/=/opt/kibana';
// kibana.tar.gz
commands.push([ 'tar', '-zcf', archiveName + '.tar.gz', name ]);
// kibana.zip
if (/windows/.test(name)) {
commands.push([ 'zip', '-rq', '-ll', archiveName + '.zip', name ]);
} else {
commands.push([ 'zip', '-rq', archiveName + '.zip', name ]);
}
if (grunt.option('os-packages')) {
// TODO(sissel): Add before-install scripts to create kibana user
// TODO(sissel): Check if `fpm` is available
if (/linux-x(86|64)$/.test(name)) {
// kibana.rpm and kibana.deb
var sysv_init = join(distPath, 'services', 'sysv') + '/etc/=/etc/';
commands.push(fpm_options.concat(['-t', 'rpm', '-a', arch, '--rpm-os', 'linux', fpm_files, sysv_init]));
commands.push(fpm_options.concat(['-t', 'deb', '-a', arch, fpm_files, sysv_init]));
} else if (/darwin-x(86|64)$/.test(name)) {
// kibana.pkg
var launchd = join(distPath, 'services', 'launchd') + '/=/';
commands.push(fpm_options.concat(['-t', 'osxpkg', '-a', arch, fpm_files, launchd]));
}
}
return mkdirp.mkdirpAsync(target)
.then(function (arg) {
return Promise.map(commands, function (cmd) {
return execFile(cmd.shift(), cmd, options);
});
}, function (err) { console.log('Failure on ' + name + ': ' + err); });
};
Promise.map(getBaseNames(grunt), createPackage).finally(done);
});
}
module.exports = createPackages;
createPackages.getBaseNames = getBaseNames;

View file

@ -1,51 +0,0 @@
/* eslint camelcase:0 */
var childProcess = require('child_process');
var Promise = require('bluebird');
var { join } = require('path');
var mkdirp = Promise.promisifyAll(require('mkdirp'));
var execFile = Promise.promisify(childProcess.execFile);
function createServices(grunt) {
grunt.registerTask('create_services', function () {
var done = this.async();
var target = grunt.config.get('target');
var distPath = join(grunt.config.get('build'), 'dist');
var services = grunt.config.get('services');
var createService = function (arg) {
var service = arg[0];
var service_version = arg[1];
var options = { cwd: distPath };
var output = join(distPath, 'services', service);
var pleaserun_args = ['--install', '--no-install-actions',
'--install-prefix', output, '--overwrite',
'--user', 'kibana',
'--sysv-log-path', '/var/log/kibana/',
'-p', service, '-v', service_version,
'/opt/kibana/bin/kibana'];
return mkdirp.mkdirpAsync(target)
.then(function (arg) {
return execFile('pleaserun', pleaserun_args, options);
}, function (err) { console.log('pleaserun failed: ' + err + '. Args: ' + pleaserun_args.join(' ')); });
};
// TODO(sissel): Detect if 'pleaserun' is found, and provide a useful error
// to the user if it is missing.
mkdirp.mkdirpAsync(distPath)
.then(function () {
return Promise.map(services, createService);
})
.then(function (arg) {
// Create the user-management scripts
var output = join(distPath, 'user');
return mkdirp.mkdirpAsync(output).then(function () {
return execFile('please-manage-user', ['--output', output, 'kibana'], { cwd: distPath });
});
}, function (err) { console.log('please-manage-user failed: ' + err + '.'); })
.finally(done);
});
}
module.exports = createServices;

View file

@ -1,19 +0,0 @@
module.exports = function (grunt) {
grunt.registerTask('dist_package_json', function () {
var path = grunt.config.process('<%= build %>/kibana/package.json');
var pkg = grunt.config.get('pkg');
grunt.file.write(path, JSON.stringify({
name: pkg.name,
description: pkg.description,
keywords: pkg.keywords,
version: pkg.version,
build: {
number: grunt.config.get('buildNum'),
sha: grunt.config.get('buildSha')
},
repository: pkg.repository,
dependencies: pkg.dependencies
}, null, ' '));
});
};

View file

@ -1,61 +0,0 @@
var marked = require('marked');
var Promise = require('bluebird');
var { join } = require('path');
var TextRenderer = require('marked-text-renderer');
var _ = require('lodash');
var fs = require('fs');
var { AllHtmlEntities } = require('html-entities');
var entities = new AllHtmlEntities();
var readFile = Promise.promisify(fs.readFile);
var writeFile = Promise.promisify(fs.writeFile);
TextRenderer.prototype.heading = function (text, level, raw) {
return '\n\n' + text + '\n' + _.map(text, function () { return '='; }).join('') + '\n';
};
var process = function (input) {
var output = input.replace(/<\!\-\- [^\-]+ \-\->/g, '\n');
output = marked(output);
return entities.decode(output);
};
module.exports = function (grunt) {
grunt.registerTask('dist_readme', function () {
var done = this.async();
var root = grunt.config.get('root');
var build = grunt.config.get('build');
var srcReadme = join(root, 'README.md');
var distReadme = join(build, 'dist', 'kibana', 'README.txt');
var srcLicense = join(root, 'LICENSE.md');
var distLicense = join(build, 'dist', 'kibana', 'LICENSE.txt');
marked.setOptions({
renderer: new TextRenderer(),
tables: true,
breaks: false,
pedantic: false,
sanitize: false,
smartLists: true,
smartypants: false
});
readFile(srcReadme, 'utf-8')
.then(function (data) {
return writeFile(distReadme, process(data.toString()));
})
.then(function () {
return readFile(srcLicense, 'utf-8');
})
.then(function (data) {
return writeFile(distLicense, process(data.toString()));
})
.then(done)
.catch(done);
});
};

View file

@ -1,80 +0,0 @@
module.exports = function (grunt) {
grunt.registerTask('downloadNodeBins', function () {
let { map, fromNode, promisify } = require('bluebird');
let { resolve } = require('path');
let { createWriteStream } = require('fs');
let { createGunzip } = require('zlib');
let { Extract } = require('tar');
let mkdirp = promisify(require('mkdirp'));
let rename = promisify(require('fs').rename);
let get = (uri) => fromNode(cb => require('wreck').request('GET', uri, null, cb));
let exists = (path) => fromNode(cb => {
require('fs').stat(path, err => cb(null, !err));
});
let platforms = grunt.config.get('platforms');
let nodeVersion = grunt.config.get('nodeVersion');
let nodeDir = require('requirefrom')('src/utils')('fromRoot')(`.node_binaries/${nodeVersion}`);
let baseUri = `https://iojs.org/dist/v${nodeVersion}`;
let writeTar = async (to, from) => {
await fromNode(cb => {
from
.pipe(createGunzip())
.on('error', cb)
.pipe(new Extract({ path: to, strip: 1 }))
.on('error', cb)
.on('end', cb);
});
};
let writeExe = async (to, from) => {
let winBinDir = resolve(to, 'bin');
await mkdirp(winBinDir);
await fromNode(cb => {
from
.pipe(createWriteStream(resolve(winBinDir, 'node.exe')))
.on('error', cb)
.on('finish', cb);
});
};
mkdirp(nodeDir)
.then(function () {
grunt.log.ok(`downloading node binaries for ${platforms.join(', ')}`);
return platforms;
})
.map(async function (platform) {
let finalDir = resolve(nodeDir, `${platform}`);
let downloadDir = `${finalDir}.temp`;
if (await exists(finalDir)) {
grunt.log.ok(`${platform} download exists`);
return;
}
let uri;
if (platform === 'windows') {
uri = `${baseUri}/win-x64/iojs.exe`;
} else {
uri = `${baseUri}/iojs-v${nodeVersion}-${platform}.tar.gz`;
}
let resp = await get('GET', uri);
if (resp.statusCode !== 200) {
throw new Error(uri + ' failed with a ' + resp.statusCode);
}
let write = platform === 'windows' ? writeExe : writeTar;
await write(downloadDir, resp);
await rename(downloadDir, finalDir);
grunt.log.ok(`${platform} download complete`);
})
.nodeify(this.async());
});
};

View file

@ -10,7 +10,7 @@ module.exports = function (grunt) {
var done = this.async();
var result = {};
var options = {start: process.cwd(), json: true };
var options = { start: process.cwd(), json: true };
var checkQueueLength = 2;
function processPackage(info, dependency) {

View file

@ -1,21 +0,0 @@
module.exports = function (grunt) {
var childProcess = require('child_process');
var { join } = require('path');
grunt.registerTask('npm_install_kibana', 'NPM install kibana server into dist', function () {
var done = this.async();
var cwd = join(grunt.config.get('build'), 'dist', 'kibana', 'src');
var command = 'npm install --production --no-optional';
var options = { cwd: cwd };
childProcess.exec(command, options, function (err, stdout, stderr) {
if (err) {
grunt.log.error(stderr);
return done(err);
}
grunt.log.writeln(stdout);
return done();
});
});
};

View file

@ -1,27 +0,0 @@
module.exports = function (grunt) {
grunt.registerTask('make_plugin_dir', function () {
var dir = grunt.config.process('<%= build %>/dist/kibana/plugins');
grunt.file.mkdir(dir);
});
grunt.registerTask('describe_bundled_plugins', function () {
var configKey = 'bundled_plugin_ids';
var file = grunt.config.process('<%= build %>/dist/kibana/config/kibana.yml');
var idList = grunt.config.get('bundled_plugin_module_ids').map(function (id) {
return ' - ' + id;
}).join('\n');
var contents = grunt.file.read(file);
if (contents.indexOf(configKey) !== -1) {
grunt.log.error('bundled plugin ids already written to config/kibana.yml');
return;
}
contents +=
'\n# Plugins that are included in the build, and no longer found in the plugins/ folder' +
'\n' + configKey + ':' +
'\n' + idList;
grunt.file.write(file, contents);
});
};