mirror of
https://github.com/elastic/kibana.git
synced 2025-04-23 17:28:26 -04:00
[build] initial fix
This commit is contained in:
parent
33df0deee1
commit
ce366a06f4
36 changed files with 501 additions and 576 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -5,6 +5,7 @@ node_modules
|
|||
trash
|
||||
bundles
|
||||
target
|
||||
/build
|
||||
.jruby
|
||||
.idea
|
||||
*.iml
|
||||
|
|
24
Gruntfile.js
24
Gruntfile.js
|
@ -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');
|
||||
};
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -56,4 +56,4 @@
|
|||
|
||||
}
|
||||
|
||||
@import "../editor/styles/.editor.less";
|
||||
@import "../editor/styles/_editor.less";
|
||||
|
|
|
@ -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
29
tasks/build/build.js
Normal 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
18
tasks/build/cliIndex.js
Normal 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);
|
||||
});
|
||||
|
||||
};
|
87
tasks/build/downloadNodes.js
Normal file
87
tasks/build/downloadNodes.js
Normal 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());
|
||||
});
|
||||
};
|
||||
|
|
@ -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()));
|
||||
});
|
||||
};
|
16
tasks/build/installNpmDeps.js
Normal file
16
tasks/build/installNpmDeps.js
Normal 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');
|
||||
});
|
||||
};
|
||||
|
||||
|
5
tasks/build/installedPlugins.js
Normal file
5
tasks/build/installedPlugins.js
Normal 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
31
tasks/build/linkNodes.js
Normal 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
52
tasks/build/osPackages.js
Normal 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;
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
};
|
21
tasks/build/packageJson.js
Normal file
21
tasks/build/packageJson.js
Normal 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
42
tasks/build/packages.js
Normal 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());
|
||||
|
||||
});
|
||||
};
|
10
tasks/build/pleaseManageUser.js
Normal file
10
tasks/build/pleaseManageUser.js
Normal 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
25
tasks/build/pleaserun.js
Normal 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
37
tasks/build/readme.js
Normal 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')));
|
||||
});
|
||||
|
||||
};
|
|
@ -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
19
tasks/config/babel.js
Normal 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
|
||||
}
|
||||
};
|
|
@ -1,6 +1,7 @@
|
|||
module.exports = function (grunt) {
|
||||
return {
|
||||
build: '<%= build %>',
|
||||
target: '<%= target %>'
|
||||
build: 'build',
|
||||
target: 'target',
|
||||
testsFromModules: 'build/kibana/node_modules/**/*test*'
|
||||
};
|
||||
};
|
||||
|
|
|
@ -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 %>'
|
||||
}
|
||||
]
|
||||
};
|
||||
});
|
||||
};
|
|
@ -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
22
tasks/config/packages.js
Normal 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}`,
|
||||
};
|
||||
});
|
||||
};
|
|
@ -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'
|
||||
]
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -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
14
tasks/config/services.js
Normal 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}` };
|
||||
});
|
||||
};
|
|
@ -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;
|
|
@ -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;
|
|
@ -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, ' '));
|
||||
});
|
||||
};
|
|
@ -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);
|
||||
|
||||
});
|
||||
|
||||
};
|
|
@ -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());
|
||||
});
|
||||
};
|
||||
|
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
|
|
@ -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);
|
||||
});
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue