diff --git a/tasks/build/osPackages.js b/tasks/build/osPackages.js index 839782a9e3e55..87c5b83a58136 100644 --- a/tasks/build/osPackages.js +++ b/tasks/build/osPackages.js @@ -1,59 +1,74 @@ -module.exports = function (grunt) { - const { resolve } = require('path'); - const { indexBy } = require('lodash'); +import { resolve } from 'path'; +import { indexBy } from 'lodash'; +import exec from '../utils/exec'; - const { config } = grunt; - const exec = require('../utils/exec'); - const targetDir = config.get('target'); - const version = config.get('pkg.version'); - const packageScriptsDir = config.get('packageScriptsDir'); - const servicesByName = indexBy(config.get('services'), 'name'); +export default (grunt) => { + const targetDir = grunt.config.get('target'); + const packageScriptsDir = grunt.config.get('packageScriptsDir'); + const servicesByName = indexBy(grunt.config.get('services'), 'name'); + const config = grunt.config.get('packages'); + const fpm = args => exec('fpm', args); grunt.registerTask('_build:osPackages', function () { - grunt.config.get('platforms').forEach(({ name, buildDir }) => { - // TODO(sissel): Check if `fpm` is available - if (!(/linux-x(86|64)$/.test(name))) return; - - const arch = /x64$/.test(name) ? 'x86_64' : 'i386'; - const fpm = args => exec('fpm', args); - - const args = [ + grunt.config.get('platforms') + .filter(({ name }) => /linux-x(86|64)$/.test(name)) + .map(({ name, buildDir }) => { + const architecture = /x64$/.test(name) ? 'x86_64' : 'i386'; + return { + buildDir, + architecture + }; + }) + .forEach(({ buildDir, architecture }) => { + const baseOptions = [ '--force', '--package', targetDir, '-s', 'dir', // input type - '--name', 'kibana', - '--description', 'Explore\ and\ visualize\ your\ Elasticsearch\ data', - '--version', version, - '--url', 'https://www.elastic.co', - '--vendor', 'Elasticsearch,\ Inc.', - '--maintainer', 'Kibana Team\ \', - '--license', 'Apache\ 2.0', + '--architecture', architecture, + '--name', config.name, + '--description', config.description, + '--version', config.version, + '--url', config.site, + '--vendor', config.vendor, + '--maintainer', config.maintainer, + '--license', config.license, '--after-install', resolve(packageScriptsDir, 'post_install.sh'), '--before-install', resolve(packageScriptsDir, 'pre_install.sh'), '--before-remove', resolve(packageScriptsDir, 'pre_remove.sh'), '--after-remove', resolve(packageScriptsDir, 'post_remove.sh'), - '--config-files', '/opt/kibana/config/kibana.yml', - '--template-value', 'user=kibana', - '--template-value', 'group=kibana' - ]; + '--config-files', config.path.kibanaConfig, + '--template-value', `user=${config.user}`, + '--template-value', `group=${config.group}`, + '--template-value', `optimizeDir=${config.path.home}/optimize`, - const files = buildDir + '/=/opt/kibana'; - const sysv = servicesByName.sysv.outputDir + '/etc/=/etc/'; - const systemd = servicesByName.systemd.outputDir + '/lib/=/lib/'; + //config folder is moved to path.conf, exclude {path.home}/config + //uses relative path to --prefix, strip the leading / + '--exclude', `${config.path.home.slice(1)}/config` + ]; + const debOptions = [ + '-t', 'deb', + '--deb-priority', 'optional' + ]; + const rpmOptions = [ + '-t', 'rpm', + '--rpm-os', 'linux' + ]; + const args = [ + `${buildDir}/=${config.path.home}/`, + `${buildDir}/config/=${config.path.conf}/`, + `${servicesByName.sysv.outputDir}/etc/=/etc/`, + `${servicesByName.systemd.outputDir}/lib/=/lib/` + ]; //Manually find flags, multiple args without assignment are not entirely parsed - var flags = grunt.option.flags().join(','); - - const buildDeb = !!flags.match('deb'); - const buildRpm = !!flags.match('rpm'); - const noneSpecified = !buildRpm && !buildDeb; - - grunt.file.mkdir(targetDir); - if (buildDeb || noneSpecified) { - fpm(args.concat('-t', 'deb', '--deb-priority', 'optional', '-a', arch, files, sysv, systemd)); + const flags = grunt.option.flags().filter(flag => /deb|rpm/.test(flag)).join(','); + const buildDeb = flags.includes('deb') || !flags.length; + const buildRpm = flags.includes('rpm') || !flags.length; + if (buildDeb) { + fpm([...baseOptions, ...debOptions, ...args]); } - if (buildRpm || noneSpecified) { - fpm(args.concat('-t', 'rpm', '-a', arch, '--rpm-os', 'linux', files, sysv, systemd)); + if (buildRpm) { + fpm([...baseOptions, ...rpmOptions, ...args]); } }); diff --git a/tasks/build/package_scripts/post_install.sh b/tasks/build/package_scripts/post_install.sh index a7be3433ba54c..beef49af21753 100644 --- a/tasks/build/package_scripts/post_install.sh +++ b/tasks/build/package_scripts/post_install.sh @@ -14,4 +14,4 @@ user_create() { if ! user_check "<%= user %>" ; then user_create "<%= user %>" fi -chown -R <%= user %>:<%= group %> /opt/kibana/optimize +chown -R <%= user %>:<%= group %> <%= optimizeDir %> diff --git a/tasks/build/pleaserun.js b/tasks/build/pleaserun.js index 8b8444235a9d0..b7a7e8f4eb653 100644 --- a/tasks/build/pleaserun.js +++ b/tasks/build/pleaserun.js @@ -1,25 +1,28 @@ -module.exports = function createServices(grunt) { - const { resolve } = require('path'); - const { appendFileSync } = require('fs'); - const exec = require('../utils/exec'); +import { resolve } from 'path'; +import { appendFileSync } from 'fs'; +import exec from '../utils/exec'; - grunt.registerTask('_build:pleaseRun', function () { - // TODO(sissel): Detect if 'pleaserun' is found, and provide a useful error - // to the user if it is missing. +export default (grunt) => { + const userScriptsDir = grunt.config.get('userScriptsDir'); + const { path, user, group, name, description } = grunt.config.get('packages'); - grunt.config.get('services').forEach(function (service) { + grunt.registerTask('_build:pleaseRun', function () { + grunt.config.get('services').forEach((service) => { grunt.file.mkdir(service.outputDir); exec('pleaserun', [ '--install', '--no-install-actions', '--install-prefix', service.outputDir, '--overwrite', - '--user', 'kibana', - '--group', 'kibana', - '--sysv-log-path', '/var/log/kibana/', + '--name', name, + '--description', description, + '--user', user, + '--group', group, + '--sysv-log-path', path.logs, '-p', service.name, '-v', service.version, - '/opt/kibana/bin/kibana' + path.kibanaBin, + `-c ${path.kibanaConfig}` ]); }); }); diff --git a/tasks/config/packages.js b/tasks/config/packages.js index c1b327747a60d..1c847168b33cd 100644 --- a/tasks/config/packages.js +++ b/tasks/config/packages.js @@ -1,20 +1,52 @@ export default (grunt) => { - const version = grunt.config.get('pkg.version'); - const productionPath = `kibana/${version.match(/\d\.\d/)[0]}`; - const stagingPath = `kibana/staging/${version.match(/\d\.\d\.\d/)[0]}-XXXXXXX/repos/${version.match(/\d\./)[0]}x`; - const rpmFolder = 'centos'; - const debFolder = 'debian'; + const VERSION = grunt.config.get('pkg.version'); + + const FOLDER_STAGING = `kibana/staging/${VERSION.match(/\d\.\d\.\d/)[0]}-XXXXXXX/repos/${VERSION.match(/\d\./)[0]}x`; + const FOLDER_PRODUCTION = `kibana/${VERSION.match(/\d\.\d/)[0]}`; + + const FOLDERNAME_DEB = 'debian'; + const FOLDERNAME_RPM = 'centos'; + + const PREFIX_STAGING_DEB = `${FOLDER_STAGING}/${FOLDERNAME_DEB}`; + const PREFIX_STAGING_RPM = `${FOLDER_STAGING}/${FOLDERNAME_RPM}`; + const PREFIX_PRODUCTION_DEB = `${FOLDER_PRODUCTION}/${FOLDERNAME_DEB}`; + const PREFIX_PRODUCTION_RPM = `${FOLDER_PRODUCTION}/${FOLDERNAME_RPM}`; + + const FOLDER_CONFIG = '/etc/kibana'; + const FOLDER_LOGS = '/var/log/kibana'; + const FOLDER_HOME = '/usr/share/kibana'; + + const FILE_KIBANA_CONF = `${FOLDER_CONFIG}/kibana.yml`; + const FILE_KIBANA_BINARY = `${FOLDER_HOME}/bin/kibana`; return { - staging: { - bucket: 'download.elasticsearch.org', - debPrefix: `${stagingPath}/${debFolder}`, - rpmPrefix: `${stagingPath}/${rpmFolder}` + publish: { + staging: { + bucket: 'download.elasticsearch.org', + debPrefix: PREFIX_STAGING_DEB, + rpmPrefix: PREFIX_STAGING_RPM + }, + production: { + bucket: 'packages.elasticsearch.org', + debPrefix: PREFIX_STAGING_DEB, + rpmPrefix: PREFIX_STAGING_RPM + } }, - production: { - bucket: 'packages.elasticsearch.org', - debPrefix: `${productionPath}/${debFolder}`, - rpmPrefix: `${productionPath}/${rpmFolder}` + user: 'kibana', + group: 'kibana', + name: 'kibana', + description: 'Explore\ and\ visualize\ your\ Elasticsearch\ data', + site: 'https://www.elastic.co', + vendor: 'Elasticsearch,\ Inc.', + maintainer: 'Kibana Team\ \', + license: 'Apache\ 2.0', + version: VERSION, + path: { + conf: FOLDER_CONFIG, + logs: FOLDER_LOGS, + home: FOLDER_HOME, + kibanaBin: FILE_KIBANA_BINARY, + kibanaConfig: FILE_KIBANA_CONF } }; }; diff --git a/tasks/release_packages.js b/tasks/release_packages.js index 372fbc9f785ee..f542481d7007a 100644 --- a/tasks/release_packages.js +++ b/tasks/release_packages.js @@ -4,7 +4,7 @@ import { promisify } from 'bluebird'; import readline from 'readline'; export default (grunt) => { - const packages = grunt.config.get('packages'); + const publishConfig = grunt.config.get('packages').publish; const platforms = grunt.config.get('platforms'); function debS3(deb) { @@ -87,8 +87,8 @@ export default (grunt) => { if (platform.debPath) { debS3({ filePath: platform.debPath, - bucket: packages[environment].bucket, - prefix: packages[environment].debPrefix.replace('XXXXXXX', trimmedHash), + bucket: publishConfig[environment].bucket, + prefix: publishConfig[environment].debPrefix.replace('XXXXXXX', trimmedHash), signatureKeyId: signature.id, arch: platform.name.match('x64') ? 'amd64' : 'i386', awsKey: aws.key, @@ -99,8 +99,8 @@ export default (grunt) => { if (platform.rpmPath) { rpmS3({ filePath: platform.rpmPath, - bucket: packages[environment].bucket, - prefix: packages[environment].rpmPrefix.replace('XXXXXXX', trimmedHash), + bucket: publishConfig[environment].bucket, + prefix: publishConfig[environment].rpmPrefix.replace('XXXXXXX', trimmedHash), signingKeyName: signature.name, awsKey: aws.key, awsSecret: aws.secret