From 888e720a6aa9ece3e88a3eebe72a1dbfbb3e868e Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Wed, 15 Jun 2016 14:35:56 -0500 Subject: [PATCH] Backport PR #7308 --------- **Commit 1:** [build] Commit install/remove scripts instead of generating, stop service before removing * Original sha: 08c9897986532a4ae7b1d1c0b8c6ff9dd04fa4b8 * Authored by Jonathan Budzenski on 2016-03-28T02:06:16Z **Commit 2:** [build] template user in install/remove scripts * Original sha: 53871671e2aed82a7e93084c4cd34252dc8efcc0 * Authored by Jonathan Budzenski on 2016-05-02T15:57:16Z **Commit 3:** [build] Run as group kibana * Original sha: d9a84b2f03ad8a24ff9025009802fb31374591fc * Authored by Jonathan Budzenski on 2016-05-02T16:27:58Z **Commit 4:** [build] Recursive chown optimize folder * Original sha: 07618c396493e95232aeb8685568b1c71aaa4d07 * Authored by Jonathan Budzenski on 2016-05-03T15:12:04Z **Commit 5:** [build] Try service kibana stop before init script * Original sha: 83c580298f966ae24ff86eead990ff4d073c87ad * Authored by Jonathan Budzenski on 2016-05-03T15:20:16Z **Commit 6:** [build] Attempt to stop service pre-install * Original sha: 6c6e4d31ffebf2b7889b850506052ace715216ee * Authored by Jonathan Budzenski on 2016-05-09T19:40:05Z **Commit 7:** [build] Fail on errors * Original sha: f9033a1c6e598f55e28e578e9acb9f7baabfc18c * Authored by Jonathan Budzenski on 2016-05-10T15:47:07Z **Commit 8:** [build] Cleanup postrm * Original sha: bab73b897170229b983d5ae50a0acd132a22f0fc * Authored by Jonathan Budzenski on 2016-05-10T18:16:51Z **Commit 9:** [build] Add comment in postrm explaining empty cases * Original sha: 4336f2bc8d313f5c5fd77781632d0e5ca468355f * Authored by Jonathan Budzenski on 2016-05-13T15:03:22Z **Commit 10:** [build] move install to /usr/share, config to /etc/kibana * Original sha: 6d293afbfb23ef81e716781b0dee54c24c0f2fdf * Authored by Jonathan Budzenski on 2016-05-25T14:12:08Z **Commit 11:** [build] consolidate package config * Original sha: 8f0be48768fb6bdff49cf509ff5fe84d540ee1ee * Authored by Jonathan Budzenski on 2016-05-25T19:21:36Z **Commit 12:** [build] Cleanup packages task * Original sha: db5ac1e72f8fa8d1b5848428b48bd53664ed48a8 * Authored by Jonathan Budzenski on 2016-05-25T20:15:09Z **Commit 13:** [build] Style cleanup * Original sha: 6189c19de8502b93b68daf1d638d6d0a0937823e * Authored by Jonathan Budzenski on 2016-05-25T20:19:16Z **Commit 14:** [build] template chown optimize dir * Original sha: 9213e616087f0d9502f45ecb9e2846014672fb4e * Authored by Jonathan Budzenski on 2016-05-25T21:27:20Z **Commit 15:** [build] Add name and description to init scripts * Original sha: e1cb593ee6212a5159224d5cc8cca1d3c75c31f3 * Authored by Jonathan Budzenski on 2016-06-07T19:48:57Z --- tasks/build/osPackages.js | 99 ++++++++++++--------- tasks/build/package_scripts/post_install.sh | 2 +- tasks/build/pleaserun.js | 27 +++--- tasks/config/packages.js | 58 +++++++++--- tasks/release_packages.js | 10 +-- 5 files changed, 123 insertions(+), 73 deletions(-) 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