From 014e90d903ff41f838d29fe0a3ccce707094cb15 Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Wed, 21 Feb 2018 17:46:40 -0800 Subject: [PATCH] Build: Consolidate archives and packages configuration (#28760) This commit moves the distribution specific tasks into the respective archives and packages builds. The collocation of common and distribution specific tasks make it much easier to reason about what is expected in a particular distribution. --- .../gradle/vagrant/VagrantTestPlugin.groovy | 2 +- distribution/archives/build.gradle | 187 ++++++++-- .../archives/integ-test-zip/build.gradle | 74 +--- distribution/archives/tar/build.gradle | 35 +- distribution/archives/zip/build.gradle | 66 +--- distribution/build.gradle | 216 +++++------ distribution/packages/build.gradle | 343 +++++++++++------- distribution/packages/deb/build.gradle | 63 +--- distribution/packages/rpm/build.gradle | 87 +---- .../src/common}/env/elasticsearch | 0 .../src/common}/scripts/postinst | 0 .../src/common}/scripts/postrm | 0 .../src/common}/scripts/preinst | 0 .../src/common}/scripts/prerm | 0 .../src/common}/systemd/elasticsearch.conf | 0 .../src/common}/systemd/elasticsearch.service | 0 .../common}/systemd/sysctl/elasticsearch.conf | 0 .../src/main/packaging => src/deb}/copyright | 0 .../deb}/init.d/elasticsearch | 0 .../deb}/lintian/elasticsearch | 0 .../rpm}/init.d/elasticsearch | 0 .../{main/resources => }/bin/elasticsearch | 0 .../resources => }/bin/elasticsearch-env | 0 .../resources => }/bin/elasticsearch-env.bat | 0 .../resources => }/bin/elasticsearch-keystore | 0 .../bin/elasticsearch-keystore.bat | 0 .../resources => }/bin/elasticsearch-plugin | 0 .../bin/elasticsearch-plugin.bat | 0 .../bin/elasticsearch-service-mgr.exe | Bin .../bin/elasticsearch-service-x64.exe | Bin .../bin/elasticsearch-service.bat | 0 .../resources => }/bin/elasticsearch-translog | 0 .../bin/elasticsearch-translog.bat | 0 .../resources => }/bin/elasticsearch.bat | 0 .../resources => }/config/elasticsearch.yml | 0 .../{main/resources => }/config/jvm.options | 0 .../resources => }/config/log4j2.properties | 0 37 files changed, 464 insertions(+), 609 deletions(-) rename distribution/{src/main/packaging => packages/src/common}/env/elasticsearch (100%) rename distribution/{src/main/packaging => packages/src/common}/scripts/postinst (100%) rename distribution/{src/main/packaging => packages/src/common}/scripts/postrm (100%) rename distribution/{src/main/packaging => packages/src/common}/scripts/preinst (100%) rename distribution/{src/main/packaging => packages/src/common}/scripts/prerm (100%) rename distribution/{src/main/packaging => packages/src/common}/systemd/elasticsearch.conf (100%) rename distribution/{src/main/packaging => packages/src/common}/systemd/elasticsearch.service (100%) rename distribution/{src/main/packaging => packages/src/common}/systemd/sysctl/elasticsearch.conf (100%) rename distribution/packages/{deb/src/main/packaging => src/deb}/copyright (100%) rename distribution/packages/{deb/src/main/packaging => src/deb}/init.d/elasticsearch (100%) rename distribution/packages/{deb/src/main/packaging => src/deb}/lintian/elasticsearch (100%) rename distribution/packages/{rpm/src/main/packaging => src/rpm}/init.d/elasticsearch (100%) rename distribution/src/{main/resources => }/bin/elasticsearch (100%) rename distribution/src/{main/resources => }/bin/elasticsearch-env (100%) rename distribution/src/{main/resources => }/bin/elasticsearch-env.bat (100%) rename distribution/src/{main/resources => }/bin/elasticsearch-keystore (100%) rename distribution/src/{main/resources => }/bin/elasticsearch-keystore.bat (100%) rename distribution/src/{main/resources => }/bin/elasticsearch-plugin (100%) rename distribution/src/{main/resources => }/bin/elasticsearch-plugin.bat (100%) rename distribution/src/{main/resources => }/bin/elasticsearch-service-mgr.exe (100%) rename distribution/src/{main/resources => }/bin/elasticsearch-service-x64.exe (100%) rename distribution/src/{main/resources => }/bin/elasticsearch-service.bat (100%) rename distribution/src/{main/resources => }/bin/elasticsearch-translog (100%) rename distribution/src/{main/resources => }/bin/elasticsearch-translog.bat (100%) rename distribution/src/{main/resources => }/bin/elasticsearch.bat (100%) rename distribution/src/{main/resources => }/config/elasticsearch.yml (100%) rename distribution/src/{main/resources => }/config/jvm.options (100%) rename distribution/src/{main/resources => }/config/log4j2.properties (100%) diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy index 2d5f985a2c1..1683a19fab1 100644 --- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy +++ b/buildSrc/src/main/groovy/org/elasticsearch/gradle/vagrant/VagrantTestPlugin.groovy @@ -119,7 +119,7 @@ class VagrantTestPlugin implements Plugin { } else { it = "packages:${it}" } - project.dependencies.add(BATS, project.dependencies.project(path: ":distribution:${it}", configuration: 'archives')) + project.dependencies.add(BATS, project.dependencies.project(path: ":distribution:${it}", configuration: 'default')) } UPGRADE_FROM_ARCHIVES.each { diff --git a/distribution/archives/build.gradle b/distribution/archives/build.gradle index 8bf31afce1b..93960a3ac21 100644 --- a/distribution/archives/build.gradle +++ b/distribution/archives/build.gradle @@ -17,70 +17,195 @@ * under the License. */ -import org.apache.tools.ant.filters.FixCrLfFilter import org.apache.tools.ant.taskdefs.condition.Os +import org.apache.tools.ant.filters.FixCrLfFilter import org.elasticsearch.gradle.BuildPlugin import org.elasticsearch.gradle.EmptyDirTask -import org.elasticsearch.gradle.ConcatFilesTask import org.elasticsearch.gradle.MavenFilteringHack -import org.elasticsearch.gradle.NoticeTask -import org.elasticsearch.gradle.precommit.DependencyLicensesTask -import org.elasticsearch.gradle.precommit.UpdateShasTask -import org.elasticsearch.gradle.test.RunTask +import org.elasticsearch.gradle.plugin.PluginBuildPlugin -subprojects { - // CopySpec does not make it easy to create an empty director so we create the directory that we want, and then point CopySpec to its - // parent to copy to the root of the distribution - File logs = new File(buildDir, 'logs-hack/logs') - task createLogDir(type: EmptyDirTask) { - dir "${logs}" - dirMode 0755 - } - File plugins = new File(buildDir, 'plugins-hack/plugins') - task createPluginsDir(type: EmptyDirTask) { - dir "${plugins}" - dirMode 0755 - } - project.ext.archivesFiles = copySpec { +// need this so Zip/Tar tasks get basic defaults... +apply plugin: 'base' + +// CopySpec does not make it easy to create an empty directory so we +// create the directory that we want, and then point CopySpec to its +// parent to copy to the root of the distribution +ext.logsDir = new File(buildDir, 'logs-hack/logs') +task createLogsDir(type: EmptyDirTask) { + dir "${logsDir}" + dirMode 0755 +} +ext.pluginsDir= new File(buildDir, 'plugins-hack/plugins') +task createPluginsDir(type: EmptyDirTask) { + dir "${pluginsDir}" + dirMode 0755 +} + +CopySpec archiveFiles(CopySpec... innerFiles) { + return copySpec { into("elasticsearch-${version}") { with libFiles into('config') { dirMode 0750 fileMode 0660 - with configFiles + with configFiles('def') } into('bin') { with copySpec { - with binFiles - from('../../src/main/resources/bin') { + with binFiles('def') + from('../src/bin') { include '*.bat' filter(FixCrLfFilter, eol: FixCrLfFilter.CrLf.newInstance('crlf')) } - MavenFilteringHack.filter(it, expansions) + MavenFilteringHack.filter(it, expansionsForDistribution('def')) } } into('') { from { dirMode 0755 - logs.getParent() + logsDir.getParent() } } into('') { from { dirMode 0755 - plugins.getParent() + pluginsDir.getParent() } } with commonFiles with noticeFile - from('../../src/main/resources') { + from('../src') { include 'bin/*.exe' } - if (project.name != 'integ-test-zip') { - with modulesFiles - } else { - with transportModulesFiles + for (CopySpec files : innerFiles) { + with files } } } } + +task buildIntegTestZip(type: Zip) { + dependsOn createLogsDir, createPluginsDir + destinationDir = file('integ-test-zip/build/distributions') + baseName = 'elasticsearch' + with archiveFiles(transportModulesFiles) +} + +task buildZip(type: Zip) { + dependsOn createLogsDir, createPluginsDir + destinationDir = file('zip/build/distributions') + baseName = 'elasticsearch' + with archiveFiles(modulesFiles) +} + +task buildTar(type: Tar) { + dependsOn createLogsDir, createPluginsDir + destinationDir = file('tar/build/distributions') + baseName = 'elasticsearch' + extension = 'tar.gz' + compression = Compression.GZIP + dirMode 0755 + fileMode 0644 + with archiveFiles(modulesFiles) +} + +// This configures the default artifact for the distribution specific +// subprojects. We have subprojects for two reasons: +// 1. Gradle project substitutions can only bind to the default +// configuration of a project +// 2. The integ-test-zip and zip distributions have the exact same +// filename, so they must be placed in different directories. +subprojects { + apply plugin: 'distribution' + + archivesBaseName = 'elasticsearch' + + String buildTask = "build${it.name.replaceAll(/-[a-z]/) { it.substring(1).toUpperCase() }.capitalize()}" + ext.buildDist = parent.tasks.getByName(buildTask) + artifacts { + 'default' buildDist + } +} + +/***************************************************************************** + * Rest test config * + *****************************************************************************/ +subprojects { + apply plugin: 'elasticsearch.standalone-rest-test' + apply plugin: 'elasticsearch.rest-test' + + if (project.name == 'integ-test-zip') { + integTest { + includePackaged true + } + } + + integTestCluster { + dependsOn assemble + distribution = project.name + } + integTestRunner { + if (Os.isFamily(Os.FAMILY_WINDOWS) && System.getProperty('tests.timeoutSuite') == null) { + // override the suite timeout to 30 mins for windows, because it has the most inefficient filesystem known to man + systemProperty 'tests.timeoutSuite', '1800000!' + } + } + + processTestResources { + inputs.properties(project(':distribution').restTestExpansions) + MavenFilteringHack.filter(it, project(':distribution').restTestExpansions) + } +} + +/***************************************************************************** + * Maven config * + *****************************************************************************/ +configure(subprojects.findAll { it.name.contains('zip') }) { + // only zip distributions go to maven + BuildPlugin.configurePomGeneration(project) + apply plugin: 'nebula.info-scm' + apply plugin: 'nebula.maven-base-publish' + apply plugin: 'nebula.maven-scm' + + // note: the group must be correct before applying the nexus plugin, or + // it will capture the wrong value... + project.group = "org.elasticsearch.distribution.${project.name}" + + publishing { + publications { + nebula { + artifactId 'elasticsearch' + artifact buildDist + } + /* + * HUGE HACK: the underlying maven publication library refuses to + * deploy any attached artifacts when the packaging type is set to + * 'pom'. But Sonatype's OSS repositories require source files for + * artifacts that are of type 'zip'. We already publish the source + * and javadoc for Elasticsearch under the various other subprojects. + * So here we create another publication using the same name that + * has the "real" pom, and rely on the fact that gradle will execute + * the publish tasks in alphabetical order. This lets us publish the + * zip file and even though the pom says the type is 'pom' instead of + * 'zip'. We cannot setup a dependency between the tasks because the + * publishing tasks are created *extremely* late in the configuration + * phase, so that we cannot get ahold of the actual task. Furthermore, + * this entire hack only exists so we can make publishing to maven + * local work, since we publish to maven central externally. + */ + nebulaRealPom(MavenPublication) { + artifactId 'elasticsearch' + pom.packaging = 'pom' + pom.withXml { XmlProvider xml -> + Node root = xml.asNode() + root.appendNode('name', 'Elasticsearch') + root.appendNode('description', 'A Distributed RESTful Search Engine') + root.appendNode('url', PluginBuildPlugin.urlFromOrigin(project.scminfo.origin)) + Node scmNode = root.appendNode('scm') + scmNode.appendNode('url', project.scminfo.origin) + } + } + } + } +} + diff --git a/distribution/archives/integ-test-zip/build.gradle b/distribution/archives/integ-test-zip/build.gradle index 89ad1ebee73..4a6dde5fc0c 100644 --- a/distribution/archives/integ-test-zip/build.gradle +++ b/distribution/archives/integ-test-zip/build.gradle @@ -1,72 +1,2 @@ -/* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import org.elasticsearch.gradle.plugin.PluginBuildPlugin -import org.apache.tools.ant.taskdefs.condition.Os - -task buildZip(type: Zip) { - dependsOn createLogDir, createPluginsDir - baseName = 'elasticsearch' - with archivesFiles -} - -artifacts { - 'default' buildZip - archives buildZip -} - -publishing { - publications { - nebula { - artifactId 'elasticsearch' - artifact buildZip - } - /* HUGE HACK: the underlying maven publication library refuses to deploy any attached artifacts - * when the packaging type is set to 'pom'. But Sonatype's OSS repositories require source files - * for artifacts that are of type 'zip'. We already publish the source and javadoc for Elasticsearch - * under the various other subprojects. So here we create another publication using the same - * name that has the "real" pom, and rely on the fact that gradle will execute the publish tasks - * in alphabetical order. This lets us publish the zip file and even though the pom says the - * type is 'pom' instead of 'zip'. We cannot setup a dependency between the tasks because the - * publishing tasks are created *extremely* late in the configuration phase, so that we cannot get - * ahold of the actual task. Furthermore, this entire hack only exists so we can make publishing to - * maven local work, since we publish to maven central externally. */ - nebulaRealPom(MavenPublication) { - artifactId 'elasticsearch' - pom.packaging = 'pom' - pom.withXml { XmlProvider xml -> - Node root = xml.asNode() - root.appendNode('name', 'Elasticsearch') - root.appendNode('description', 'A Distributed RESTful Search Engine') - root.appendNode('url', PluginBuildPlugin.urlFromOrigin(project.scminfo.origin)) - Node scmNode = root.appendNode('scm') - scmNode.appendNode('url', project.scminfo.origin) - } - } - } -} - -integTestRunner { - if (Os.isFamily(Os.FAMILY_WINDOWS) && System.getProperty('tests.timeoutSuite') == null) { - // override the suite timeout to 30 mins for windows, because it has the most inefficient filesystem known to man - systemProperty 'tests.timeoutSuite', '1800000!' - } -} - -integTest.dependsOn buildZip +// This file is intentionally blank. All configuration of the +// distribution is done in the parent project. diff --git a/distribution/archives/tar/build.gradle b/distribution/archives/tar/build.gradle index cbefc223847..4a6dde5fc0c 100644 --- a/distribution/archives/tar/build.gradle +++ b/distribution/archives/tar/build.gradle @@ -1,33 +1,2 @@ -/* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -task buildTar(type: Tar) { - dependsOn createLogDir, createPluginsDir - baseName = 'elasticsearch' - extension = 'tar.gz' - with archivesFiles - compression = Compression.GZIP - dirMode 0755 - fileMode 0644 -} - -artifacts { - 'default' buildTar -} - +// This file is intentionally blank. All configuration of the +// distribution is done in the parent project. diff --git a/distribution/archives/zip/build.gradle b/distribution/archives/zip/build.gradle index 53dc98271ec..4a6dde5fc0c 100644 --- a/distribution/archives/zip/build.gradle +++ b/distribution/archives/zip/build.gradle @@ -1,64 +1,2 @@ -/* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import org.elasticsearch.gradle.plugin.PluginBuildPlugin - -task buildZip(type: Zip) { - dependsOn createLogDir, createPluginsDir - baseName = 'elasticsearch' - with archivesFiles -} - -artifacts { - 'default' buildZip - archives buildZip -} - -publishing { - publications { - nebula { - artifactId 'elasticsearch' - artifact buildZip - } - /* HUGE HACK: the underlying maven publication library refuses to deploy any attached artifacts - * when the packaging type is set to 'pom'. But Sonatype's OSS repositories require source files - * for artifacts that are of type 'zip'. We already publish the source and javadoc for Elasticsearch - * under the various other subprojects. So here we create another publication using the same - * name that has the "real" pom, and rely on the fact that gradle will execute the publish tasks - * in alphabetical order. This lets us publish the zip file and even though the pom says the - * type is 'pom' instead of 'zip'. We cannot setup a dependency between the tasks because the - * publishing tasks are created *extremely* late in the configuration phase, so that we cannot get - * ahold of the actual task. Furthermore, this entire hack only exists so we can make publishing to - * maven local work, since we publish to maven central externally. */ - nebulaRealPom(MavenPublication) { - artifactId 'elasticsearch' - pom.packaging = 'pom' - pom.withXml { XmlProvider xml -> - Node root = xml.asNode() - root.appendNode('name', 'Elasticsearch') - root.appendNode('description', 'A Distributed RESTful Search Engine') - root.appendNode('url', PluginBuildPlugin.urlFromOrigin(project.scminfo.origin)) - Node scmNode = root.appendNode('scm') - scmNode.appendNode('url', project.scminfo.origin) - } - } - } -} - -integTest.dependsOn buildZip +// This file is intentionally blank. All configuration of the +// distribution is done in the parent project. diff --git a/distribution/build.gradle b/distribution/build.gradle index c47da920ecf..5bb9944b4a3 100644 --- a/distribution/build.gradle +++ b/distribution/build.gradle @@ -21,7 +21,6 @@ import org.apache.tools.ant.filters.FixCrLfFilter import org.apache.tools.ant.taskdefs.condition.Os import org.elasticsearch.gradle.BuildPlugin -import org.elasticsearch.gradle.EmptyDirTask import org.elasticsearch.gradle.ConcatFilesTask import org.elasticsearch.gradle.MavenFilteringHack import org.elasticsearch.gradle.NoticeTask @@ -83,15 +82,7 @@ project.rootProject.subprojects.findAll { it.parent.path == ':modules' }.each { from { zipTree(project(module.path).bundlePlugin.outputs.files.singleFile) } } } - // We would like to make sure integ tests for the distribution run after - // integ tests for the modules included in the distribution. - project.configure(distributions.findAll { it.name != 'integ-test-zip'}) { Project distribution -> - distribution.afterEvaluate({ - // some integTest tasks will have multiple finalizers - distribution.integTest.mustRunAfter module.tasks.find { t -> t.name.matches(".*integTest\$") } - }) - } - // also want to make sure the module's integration tests run after the integ-test-zip (ie rest tests) + // make sure the module's integration tests run after the integ-test-zip (ie rest tests) module.afterEvaluate({ module.integTest.mustRunAfter(':distribution:archives:integ-test-zip:integTest') }) @@ -119,41 +110,12 @@ task clean(type: Delete) { delete 'build' } -configure(distributions) { - /***************************************************************************** - * Rest test config * - *****************************************************************************/ - apply plugin: 'elasticsearch.standalone-rest-test' - apply plugin: 'elasticsearch.rest-test' - project.integTest { - includePackaged project.name == 'integ-test-zip' - if (project.name != 'integ-test-zip') { - mustRunAfter ':distribution:archives:integ-test-zip:integTest' - } - } - project.integTestCluster { - dependsOn project.assemble - distribution = project.name - } - - processTestResources { - inputs.properties(project(':distribution').restTestExpansions) - MavenFilteringHack.filter(it, project(':distribution').restTestExpansions) - } - - /***************************************************************************** - * Maven config * - *****************************************************************************/ - // note: the group must be correct before applying the nexus plugin, or it will capture the wrong value... - project.group = "org.elasticsearch.distribution.${project.name}" - project.archivesBaseName = 'elasticsearch' - +configure(subprojects.findAll { ['archives', 'packages'].contains(it.name) }) { // TODO: the map needs to be an input of the tasks, so that when it changes, the task will re-run... /***************************************************************************** * Properties to expand when copying packaging files * *****************************************************************************/ project.ext { - expansions = expansionsForDistribution(project.name) /***************************************************************************** * Common files in all distributions * @@ -178,18 +140,22 @@ configure(distributions) { from project(':distribution').buildTransportModules } - configFiles = copySpec { - from '../../src/main/resources/config' - MavenFilteringHack.filter(it, expansions) + configFiles = { distributionType -> + copySpec { + from '../src/config' + MavenFilteringHack.filter(it, expansionsForDistribution(distributionType)) + } } - binFiles = copySpec { - // everything except windows files - from '../../src/main/resources/bin' - exclude '*.bat' - exclude '*.exe' - eachFile { it.setMode(0755) } - MavenFilteringHack.filter(it, expansions) + binFiles = { distributionType -> + copySpec { + // everything except windows files + from '../src/bin' + exclude '*.bat' + exclude '*.exe' + eachFile { it.setMode(0755) } + MavenFilteringHack.filter(it, expansionsForDistribution(distributionType)) + } } commonFiles = copySpec { @@ -207,15 +173,6 @@ configure(distributions) { } } - /***************************************************************************** - * Publishing setup * - *****************************************************************************/ - if (['zip', 'integ-test-zip'].contains(it.name)) { - BuildPlugin.configurePomGeneration(project) - apply plugin: 'nebula.info-scm' - apply plugin: 'nebula.maven-base-publish' - apply plugin: 'nebula.maven-scm' - } } task run(type: RunTask) { @@ -252,83 +209,84 @@ task run(type: RunTask) { * day. DEB retries forever. * */ -Map expansionsForDistribution(distributionType) { - final String defaultHeapSize = "1g" - final String packagingPathData = "path.data: /var/lib/elasticsearch" - final String pathLogs = "/var/log/elasticsearch" - final String packagingPathLogs = "path.logs: ${pathLogs}" - final String packagingLoggc = "${pathLogs}/gc.log" +subprojects { + ext.expansionsForDistribution = { distributionType -> + final String defaultHeapSize = "1g" + final String packagingPathData = "path.data: /var/lib/elasticsearch" + final String pathLogs = "/var/log/elasticsearch" + final String packagingPathLogs = "path.logs: ${pathLogs}" + final String packagingLoggc = "${pathLogs}/gc.log" - String footer = "# Built for ${project.name}-${project.version} " + - "(${distributionType})" - Map expansions = [ - 'project.name': project.name, - 'project.version': version, + String footer = "# Built for ${project.name}-${project.version} " + + "(${distributionType})" + Map expansions = [ + 'project.name': project.name, + 'project.version': version, - 'path.conf': [ - 'tar': '"$ES_HOME"/config', - 'zip': '"$ES_HOME"/config', - 'integ-test-zip': '"$ES_HOME"/config', - 'def': '/etc/elasticsearch', - ], - 'path.data': [ - 'deb': packagingPathData, - 'rpm': packagingPathData, - 'def': '#path.data: /path/to/data' - ], - 'path.env': [ - 'deb': '/etc/default/elasticsearch', - 'rpm': '/etc/sysconfig/elasticsearch', - /* There isn't one of these files for tar or zip but its important to - make an empty string here so the script can properly skip it. */ - 'def': 'if [ -z "$ES_PATH_CONF" ]; then ES_PATH_CONF="$ES_HOME"/config; done', - ], - 'source.path.env': [ - 'deb': 'source /etc/default/elasticsearch', - 'rpm': 'source /etc/sysconfig/elasticsearch', - 'def': 'if [ -z "$ES_PATH_CONF" ]; then ES_PATH_CONF="$ES_HOME"/config; fi', - ], - 'path.logs': [ - 'deb': packagingPathLogs, - 'rpm': packagingPathLogs, - 'def': '#path.logs: /path/to/logs' - ], - 'loggc': [ - 'deb': packagingLoggc, - 'rpm': packagingLoggc, - 'def': 'logs/gc.log' - ], + 'path.conf': [ + 'deb': '/etc/elasticsearch', + 'rpm': '/etc/elasticsearch', + 'def': '"$ES_HOME"/config' + ], + 'path.data': [ + 'deb': packagingPathData, + 'rpm': packagingPathData, + 'def': '#path.data: /path/to/data' + ], + 'path.env': [ + 'deb': '/etc/default/elasticsearch', + 'rpm': '/etc/sysconfig/elasticsearch', + /* There isn't one of these files for tar or zip but its important to + make an empty string here so the script can properly skip it. */ + 'def': 'if [ -z "$ES_PATH_CONF" ]; then ES_PATH_CONF="$ES_HOME"/config; done', + ], + 'source.path.env': [ + 'deb': 'source /etc/default/elasticsearch', + 'rpm': 'source /etc/sysconfig/elasticsearch', + 'def': 'if [ -z "$ES_PATH_CONF" ]; then ES_PATH_CONF="$ES_HOME"/config; fi', + ], + 'path.logs': [ + 'deb': packagingPathLogs, + 'rpm': packagingPathLogs, + 'def': '#path.logs: /path/to/logs' + ], + 'loggc': [ + 'deb': packagingLoggc, + 'rpm': packagingLoggc, + 'def': 'logs/gc.log' + ], - 'heap.min': defaultHeapSize, - 'heap.max': defaultHeapSize, + 'heap.min': defaultHeapSize, + 'heap.max': defaultHeapSize, - 'heap.dump.path': [ - 'deb': "-XX:HeapDumpPath=/var/lib/elasticsearch", - 'rpm': "-XX:HeapDumpPath=/var/lib/elasticsearch", - 'def': "#-XX:HeapDumpPath=/heap/dump/path" - ], + 'heap.dump.path': [ + 'deb': "-XX:HeapDumpPath=/var/lib/elasticsearch", + 'rpm': "-XX:HeapDumpPath=/var/lib/elasticsearch", + 'def': "#-XX:HeapDumpPath=/heap/dump/path" + ], - 'stopping.timeout': [ - 'rpm': 86400, - ], + 'stopping.timeout': [ + 'rpm': 86400, + ], - 'scripts.footer': [ - /* Debian needs exit 0 on these scripts so we add it here and preserve - the pretty footer. */ - 'deb': "exit 0\n${footer}", - 'def': footer - ], - ] - Map result = [:] - expansions = expansions.each { key, value -> - if (value instanceof Map) { - // 'def' is for default but its three characters like 'rpm' and 'deb' - value = value[distributionType] ?: value['def'] - if (value == null) { - return + 'scripts.footer': [ + /* Debian needs exit 0 on these scripts so we add it here and preserve + the pretty footer. */ + 'deb': "exit 0\n${footer}", + 'def': footer + ], + ] + Map result = [:] + expansions = expansions.each { key, value -> + if (value instanceof Map) { + // 'def' is for default but its three characters like 'rpm' and 'deb' + value = value[distributionType] ?: value['def'] + if (value == null) { + return + } } + result[key] = value } - result[key] = value + return result } - return result } diff --git a/distribution/packages/build.gradle b/distribution/packages/build.gradle index 6eb9716dcd2..72bd3a739e8 100644 --- a/distribution/packages/build.gradle +++ b/distribution/packages/build.gradle @@ -13,27 +13,17 @@ * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. */ -import org.apache.tools.ant.filters.FixCrLfFilter -import org.apache.tools.ant.taskdefs.condition.Os -import org.elasticsearch.gradle.BuildPlugin -import org.elasticsearch.gradle.EmptyDirTask -import org.elasticsearch.gradle.ConcatFilesTask +import org.elasticsearch.gradle.LoggedExec import org.elasticsearch.gradle.MavenFilteringHack -import org.elasticsearch.gradle.NoticeTask -import org.elasticsearch.gradle.precommit.DependencyLicensesTask -import org.elasticsearch.gradle.precommit.UpdateShasTask -import org.elasticsearch.gradle.test.RunTask /***************************************************************************** * Deb and rpm configuration * ***************************************************************************** * - * The general strategy here is to build a directory on disk, packagingFiles - * that contains stuff that needs to be copied into the distributions. This is + * The general strategy here is to build a directory on disk that contains + * stuff that needs to be copied into the distributions. This is * important for two reasons: * 1. ospackage wants to copy the directory permissions that it sees off of the * filesystem. If you ask it to create a directory that doesn't already @@ -53,7 +43,6 @@ import org.elasticsearch.gradle.test.RunTask * dpkg -c path/to/elasticsearch.deb */ -// for deb/rpm buildscript { repositories { maven { @@ -61,140 +50,94 @@ buildscript { } } dependencies { - classpath 'com.netflix.nebula:gradle-ospackage-plugin:3.4.0' + classpath 'com.netflix.nebula:gradle-ospackage-plugin:4.7.1' } } -subprojects { - // TODO: remove integ test for packages - integTest.enabled = Os.isFamily(Os.FAMILY_WINDOWS) == false - File packagingFiles = new File(buildDir, 'packaging') - project.ext.packagingFiles = packagingFiles - task processPackagingFiles(type: Copy) { - from '../../src/main/packaging' - from 'src/main/packaging' +void addProcessFilesTask(String type) { + String packagingFiles = "build/packaging/${type}" - MavenFilteringHack.filter(it, expansions) + task("process${type.capitalize()}Files", type: Copy) { + from 'src/common' + from "src/${type}" into packagingFiles - /* Explicitly declare the outputs so that gradle won't skip this task if - one of the other tasks like createEtc run first and create the packaging - directory as a side effect. */ - outputs.dir("${packagingFiles}/env") - outputs.dir("${packagingFiles}/systemd") - } - task createEtc(type: EmptyDirTask) { - dir "${packagingFiles}/etc/elasticsearch" - dirMode 0750 - outputs.dir dir - } - - task fillEtc(type: Copy) { - dependsOn createEtc - with configFiles - into "${packagingFiles}/etc/elasticsearch" - /* Explicitly declare the output files so this task doesn't consider itself - up to date when the directory is created, which it would by default. And - that'll happen when createEtc runs. */ - outputs.file "${packagingFiles}/etc/elasticsearch/elasticsearch.yml" - outputs.file "${packagingFiles}/etc/elasticsearch/jvm.options" - outputs.file "${packagingFiles}/etc/elasticsearch/log4j2.properties" - } - - task createPidDir(type: EmptyDirTask) { - dir "${packagingFiles}/var/run/elasticsearch" - } - task createLogDir(type: EmptyDirTask) { - dir "${packagingFiles}/var/log/elasticsearch" - } - task createDataDir(type: EmptyDirTask) { - dir "${packagingFiles}/var/lib/elasticsearch" - } - task createPluginsDir(type: EmptyDirTask) { - dir "${packagingFiles}/usr/share/elasticsearch/plugins" - } - - /** - * Setup the build/packaging directory to be like the target filesystem - * because ospackage will use arbitrary permissions if you try to create a - * directory that doesn't exist on the filesystem. - */ - task preparePackagingFiles { - dependsOn processPackagingFiles, fillEtc, createPidDir, createLogDir, - createDataDir, createPluginsDir - } - - apply plugin: 'nebula.ospackage-base' - ospackage { - packageName 'elasticsearch' - maintainer 'Elasticsearch Team ' - summary ''' - Elasticsearch is a distributed RESTful search engine built for the cloud. - Reference documentation can be found at - https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html - and the 'Elasticsearch: The Definitive Guide' book can be found at - https://www.elastic.co/guide/en/elasticsearch/guide/current/index.html - '''.stripIndent().replace('\n', ' ').trim() - url 'https://www.elastic.co/' - - // signing setup - if (project.hasProperty('signing.password') && System.getProperty('build.snapshot', 'true') == 'false') { - signingKeyId = project.hasProperty('signing.keyId') ? project.property('signing.keyId') : 'D88E42B4' - signingKeyPassphrase = project.property('signing.password') - signingKeyRingFile = project.hasProperty('signing.secretKeyRingFile') ? - project.file(project.property('signing.secretKeyRingFile')) : - new File(new File(System.getProperty('user.home'), '.gnupg'), 'secring.gpg') + into('config') { + from '../src/config' } + MavenFilteringHack.filter(it, expansionsForDistribution(type)) + + doLast { + // create empty dirs, we set the permissions when configuring the packages + mkdir "${packagingFiles}/var/run/elasticsearch" + mkdir "${packagingFiles}/var/log/elasticsearch" + mkdir "${packagingFiles}/var/lib/elasticsearch" + mkdir "${packagingFiles}/usr/share/elasticsearch/plugins" + } + } +} +addProcessFilesTask('deb') +addProcessFilesTask('rpm') + +// Common configuration that is package dependent. This can't go in ospackage +// since we have different templated files that need to be consumed, but the structure +// is the same +Closure commonPackageConfig(String type) { + return { + // Follow elasticsearch's file naming convention + archiveName "elasticsearch-${project.version}.${type}" + + destinationDir = file("${type}/build/distributions") + String packagingFiles = "build/packaging/${type}" + String scripts = "${packagingFiles}/scripts" preInstall file("${scripts}/preinst") postInstall file("${scripts}/postinst") preUninstall file("${scripts}/prerm") postUninstall file("${scripts}/postrm") - if (project.name == 'rpm') { - requires('/bin/bash') - } else if (project.name == 'deb') { - requires('bash') - } - requires('coreutils') - - into '/usr/share/elasticsearch' - fileMode 0644 - dirMode 0755 - user 'root' - permissionGroup 'root' - with libFiles - with modulesFiles - into('bin') { - with binFiles - } - with copySpec { - with commonFiles - if (project.name == 'deb') { - // Deb gets a copyright file instead. - exclude 'LICENSE.txt' + // top level "into" directive is not inherited from ospackage for some reason, so we must + // specify it again explicitly for copying common files + into('/usr/share/elasticsearch') { + into('bin') { + with binFiles(type) + } + with copySpec { + with commonFiles + if (type == 'deb') { + // Deb gets a copyright file instead. + exclude 'LICENSE.txt' + } } } - with noticeFile + // ========= config files ========= configurationFile '/etc/elasticsearch/elasticsearch.yml' configurationFile '/etc/elasticsearch/jvm.options' configurationFile '/etc/elasticsearch/log4j2.properties' into('/etc/elasticsearch') { - dirMode 0750 + //dirMode 0750 fileMode 0660 permissionGroup 'elasticsearch' includeEmptyDirs true createDirectoryEntry true fileType CONFIG | NOREPLACE - from "${packagingFiles}/etc/elasticsearch" + from "${packagingFiles}/config" + } + String envFile = expansionsForDistribution(type)['path.env'] + configurationFile envFile + into(new File(envFile).getParent()) { + fileType CONFIG | NOREPLACE + fileMode 0660 + from "${packagingFiles}/env/elasticsearch" } + // ========= systemd ========= + configurationFile '/usr/lib/systemd/system/elasticsearch.service' into('/usr/lib/tmpfiles.d') { from "${packagingFiles}/systemd/elasticsearch.conf" } - configurationFile '/usr/lib/systemd/system/elasticsearch.service' into('/usr/lib/systemd/system') { fileType CONFIG | NOREPLACE from "${packagingFiles}/systemd/elasticsearch.service" @@ -203,37 +146,171 @@ subprojects { fileType CONFIG | NOREPLACE from "${packagingFiles}/systemd/sysctl/elasticsearch.conf" } + + // ========= sysV init ========= configurationFile '/etc/init.d/elasticsearch' into('/etc/init.d') { fileMode 0750 fileType CONFIG | NOREPLACE from "${packagingFiles}/init.d/elasticsearch" } - configurationFile project.expansions['path.env'] - into(new File(project.expansions['path.env']).getParent()) { - fileType CONFIG | NOREPLACE - fileMode 0660 - from "${project.packagingFiles}/env/elasticsearch" - } - /** - * Suck up all the empty directories that we need to install into the path. - */ - Closure suckUpEmptyDirectories = { path, u, g, mode -> - into(path) { + // ========= empty dirs ========= + // NOTE: these are created under packagingFiles as empty, but the permissions are set here + Closure copyEmptyDir = { path, u, g, mode -> + File file = new File(path) + into(file.parent) { from "${packagingFiles}/${path}" + include file.name includeEmptyDirs true createDirectoryEntry true user u permissionGroup g dirMode mode - fileMode mode } } - suckUpEmptyDirectories('/var/run', 'elasticsearch', 'elasticsearch', 0755) - suckUpEmptyDirectories('/var/log', 'elasticsearch', 'elasticsearch', 0750) - suckUpEmptyDirectories('/var/lib', 'elasticsearch', 'elasticsearch', 0750) - suckUpEmptyDirectories('/usr/share/elasticsearch', 'root', 'root', 0755) + copyEmptyDir('/var/run/elasticsearch', 'elasticsearch', 'elasticsearch', 0755) + copyEmptyDir('/var/log/elasticsearch', 'elasticsearch', 'elasticsearch', 0750) + copyEmptyDir('/var/lib/elasticsearch', 'elasticsearch', 'elasticsearch', 0750) + copyEmptyDir('/usr/share/elasticsearch/plugins', 'root', 'root', 0755) } } +apply plugin: 'nebula.ospackage-base' + +// this is package indepdendent configuration +ospackage { + packageName 'elasticsearch' + maintainer 'Elasticsearch Team ' + summary ''' + Elasticsearch is a distributed RESTful search engine built for the cloud. + Reference documentation can be found at + https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html + and the 'Elasticsearch: The Definitive Guide' book can be found at + https://www.elastic.co/guide/en/elasticsearch/guide/current/index.html + '''.stripIndent().replace('\n', ' ').trim() + url 'https://www.elastic.co/' + + // signing setup + if (project.hasProperty('signing.password') && System.getProperty('build.snapshot', 'true') == 'false') { + signingKeyId = project.hasProperty('signing.keyId') ? project.property('signing.keyId') : 'D88E42B4' + signingKeyPassphrase = project.property('signing.password') + signingKeyRingFile = project.hasProperty('signing.secretKeyRingFile') ? + project.file(project.property('signing.secretKeyRingFile')) : + new File(new File(System.getProperty('user.home'), '.gnupg'), 'secring.gpg') + } + + requires('coreutils') + + fileMode 0644 + dirMode 0755 + user 'root' + permissionGroup 'root' + + into '/usr/share/elasticsearch' + with libFiles + with modulesFiles + with noticeFile +} + +task buildDeb(type: Deb) { + dependsOn processDebFiles + configure(commonPackageConfig('deb')) + + version = project.version + packageGroup 'web' + requires 'bash' + requires 'libc6' + requires 'adduser' + + into('/usr/share/lintian/overrides') { + from('src/deb/lintian/elasticsearch') + } + into('/usr/share/doc/elasticsearch') { + from 'src/deb/copyright' + fileMode 0644 + } +} + +// task that sanity checks if the Deb archive can be extracted +task checkDeb(type: LoggedExec) { + dependsOn buildDeb + onlyIf { new File('/usr/bin/dpkg-deb').exists() || new File('/usr/local/bin/dpkg-deb').exists() } + final File debExtracted = new File("${buildDir}", 'deb-extracted') + commandLine 'dpkg-deb', '-x', "deb/build/distributions/elasticsearch-${project.version}.deb", debExtracted + doFirst { + debExtracted.deleteDir() + } +} + +task buildRpm(type: Rpm) { + dependsOn processRpmFiles + configure(commonPackageConfig('rpm')) + + packageGroup 'Application/Internet' + requires '/bin/bash' + + prefix '/usr' + packager 'Elasticsearch' + version = project.version.replace('-', '_') + release = '1' + arch 'NOARCH' + os 'LINUX' + license '2009' + distribution 'Elasticsearch' + vendor 'Elasticsearch' + // TODO ospackage doesn't support icon but we used to have one + + // without this the rpm will have parent dirs of any files we copy in, eg /etc/elasticsearch + addParentDirs false + + // Declare the folders so that the RPM package manager removes + // them when upgrading or removing the package + directory('/usr/share/elasticsearch/bin', 0755) + directory('/usr/share/elasticsearch/lib', 0755) + directory('/usr/share/elasticsearch/modules', 0755) + modulesFiles.eachFile { FileCopyDetails fcp -> + if (fcp.name == "plugin-descriptor.properties") { + directory('/usr/share/elasticsearch/modules/' + fcp.file.parentFile.name, 0755) + } + } +} + +// task that sanity checks if the RPM archive can be extracted +task checkRpm(type: LoggedExec) { + dependsOn buildRpm + onlyIf { new File('/bin/rpm').exists() || new File('/usr/bin/rpm').exists() || new File('/usr/local/bin/rpm').exists() } + final File rpmDatabase = new File("${buildDir}", 'rpm-database') + final File rpmExtracted = new File("${buildDir}", 'rpm-extracted') + commandLine 'rpm', + '--badreloc', + '--nodeps', + '--noscripts', + '--notriggers', + '--dbpath', + rpmDatabase, + '--relocate', + "/=${rpmExtracted}", + '-i', + "rpm/build/distributions/elasticsearch-${project.version}.rpm" + doFirst { + rpmDatabase.deleteDir() + rpmExtracted.deleteDir() + } +} + +// This configures the default artifact for the distribution specific +// subprojects. We have subprojects because Gradle project substitutions +// can only bind to the default configuration of a project +subprojects { + apply plugin: 'distribution' + + String buildTask = "build${it.name.replaceAll(/-[a-z]/) { it.substring(1).toUpperCase() }.capitalize()}" + ext.buildDist = parent.tasks.getByName(buildTask) + artifacts { + 'default' buildDist + } +} + +check.dependsOn checkDeb, checkRpm + diff --git a/distribution/packages/deb/build.gradle b/distribution/packages/deb/build.gradle index cfc9aa4d8ef..4a6dde5fc0c 100644 --- a/distribution/packages/deb/build.gradle +++ b/distribution/packages/deb/build.gradle @@ -1,61 +1,2 @@ -import org.elasticsearch.gradle.LoggedExec - -/* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -task buildDeb(type: Deb) { - dependsOn preparePackagingFiles - baseName 'elasticsearch' // this is what pom generation uses for artifactId - // Follow elasticsearch's deb file naming convention - archiveName "${packageName}-${project.version}.deb" - version = project.version - - packageGroup 'web' - requires 'libc6' - requires 'adduser' - - into('/usr/share/lintian/overrides') { - from("${project.packagingFiles}/lintian/elasticsearch") - } - into('/usr/share/doc/elasticsearch') { - from "${project.packagingFiles}/copyright" - fileMode 0644 - } -} - -artifacts { - 'default' buildDeb - archives buildDeb -} - -integTest.enabled = false -licenseHeaders.enabled = false - -// task that sanity checks if the Deb archive can be extracted -task checkDeb(type: LoggedExec) { - onlyIf { new File('/usr/bin/dpkg-deb').exists() || new File('/usr/local/bin/dpkg-deb').exists() } - final File debExtracted = new File("${buildDir}", 'deb-extracted') - commandLine 'dpkg-deb', '-x', "${buildDir}/distributions/elasticsearch-${project.version}.deb", debExtracted - doFirst { - debExtracted.deleteDir() - } -} - -checkDeb.dependsOn buildDeb -check.dependsOn checkDeb +// This file is intentionally blank. All configuration of the +// distribution is done in the parent project. diff --git a/distribution/packages/rpm/build.gradle b/distribution/packages/rpm/build.gradle index 4432198f234..4a6dde5fc0c 100644 --- a/distribution/packages/rpm/build.gradle +++ b/distribution/packages/rpm/build.gradle @@ -1,85 +1,2 @@ -/* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import org.elasticsearch.gradle.LoggedExec - -task buildRpm(type: Rpm) { - dependsOn preparePackagingFiles - baseName 'elasticsearch' // this is what pom generation uses for artifactId - // Follow elasticsearch's rpm file naming convention - archiveName "${packageName}-${project.version}.rpm" - packageGroup 'Application/Internet' - prefix '/usr' - packager 'Elasticsearch' - version = project.version.replace('-', '_') - release = '1' - arch 'NOARCH' - os 'LINUX' - license '2009' - distribution 'Elasticsearch' - vendor 'Elasticsearch' - dirMode 0755 - fileMode 0644 - addParentDirs false - // TODO ospackage doesn't support icon but we used to have one - - // Declare the folders so that the RPM package manager removes - // them when upgrading or removing the package - directory('/usr/share/elasticsearch/bin', 0755) - directory('/usr/share/elasticsearch/lib', 0755) - directory('/usr/share/elasticsearch/modules', 0755) - modulesFiles.eachFile { FileCopyDetails fcp -> - if (fcp.name == "plugin-descriptor.properties") { - directory('/usr/share/elasticsearch/modules/' + fcp.file.parentFile.name, 0755) - } - } -} - -artifacts { - 'default' buildRpm - archives buildRpm -} - -integTest.enabled = false -licenseHeaders.enabled = false - -// task that sanity checks if the RPM archive can be extracted -task checkRpm(type: LoggedExec) { - onlyIf { new File('/bin/rpm').exists() || new File('/usr/bin/rpm').exists() || new File('/usr/local/bin/rpm').exists() } - final File rpmDatabase = new File("${buildDir}", 'rpm-database') - final File rpmExtracted = new File("${buildDir}", 'rpm-extracted') - commandLine 'rpm', - '--badreloc', - '--nodeps', - '--noscripts', - '--notriggers', - '--dbpath', - rpmDatabase, - '--relocate', - "/=${rpmExtracted}", - '-i', - "${buildDir}/distributions/elasticsearch-${project.version}.rpm" - doFirst { - rpmDatabase.deleteDir() - rpmExtracted.deleteDir() - } -} - -checkRpm.dependsOn buildRpm -check.dependsOn checkRpm +// This file is intentionally blank. All configuration of the +// distribution is done in the parent project. diff --git a/distribution/src/main/packaging/env/elasticsearch b/distribution/packages/src/common/env/elasticsearch similarity index 100% rename from distribution/src/main/packaging/env/elasticsearch rename to distribution/packages/src/common/env/elasticsearch diff --git a/distribution/src/main/packaging/scripts/postinst b/distribution/packages/src/common/scripts/postinst similarity index 100% rename from distribution/src/main/packaging/scripts/postinst rename to distribution/packages/src/common/scripts/postinst diff --git a/distribution/src/main/packaging/scripts/postrm b/distribution/packages/src/common/scripts/postrm similarity index 100% rename from distribution/src/main/packaging/scripts/postrm rename to distribution/packages/src/common/scripts/postrm diff --git a/distribution/src/main/packaging/scripts/preinst b/distribution/packages/src/common/scripts/preinst similarity index 100% rename from distribution/src/main/packaging/scripts/preinst rename to distribution/packages/src/common/scripts/preinst diff --git a/distribution/src/main/packaging/scripts/prerm b/distribution/packages/src/common/scripts/prerm similarity index 100% rename from distribution/src/main/packaging/scripts/prerm rename to distribution/packages/src/common/scripts/prerm diff --git a/distribution/src/main/packaging/systemd/elasticsearch.conf b/distribution/packages/src/common/systemd/elasticsearch.conf similarity index 100% rename from distribution/src/main/packaging/systemd/elasticsearch.conf rename to distribution/packages/src/common/systemd/elasticsearch.conf diff --git a/distribution/src/main/packaging/systemd/elasticsearch.service b/distribution/packages/src/common/systemd/elasticsearch.service similarity index 100% rename from distribution/src/main/packaging/systemd/elasticsearch.service rename to distribution/packages/src/common/systemd/elasticsearch.service diff --git a/distribution/src/main/packaging/systemd/sysctl/elasticsearch.conf b/distribution/packages/src/common/systemd/sysctl/elasticsearch.conf similarity index 100% rename from distribution/src/main/packaging/systemd/sysctl/elasticsearch.conf rename to distribution/packages/src/common/systemd/sysctl/elasticsearch.conf diff --git a/distribution/packages/deb/src/main/packaging/copyright b/distribution/packages/src/deb/copyright similarity index 100% rename from distribution/packages/deb/src/main/packaging/copyright rename to distribution/packages/src/deb/copyright diff --git a/distribution/packages/deb/src/main/packaging/init.d/elasticsearch b/distribution/packages/src/deb/init.d/elasticsearch similarity index 100% rename from distribution/packages/deb/src/main/packaging/init.d/elasticsearch rename to distribution/packages/src/deb/init.d/elasticsearch diff --git a/distribution/packages/deb/src/main/packaging/lintian/elasticsearch b/distribution/packages/src/deb/lintian/elasticsearch similarity index 100% rename from distribution/packages/deb/src/main/packaging/lintian/elasticsearch rename to distribution/packages/src/deb/lintian/elasticsearch diff --git a/distribution/packages/rpm/src/main/packaging/init.d/elasticsearch b/distribution/packages/src/rpm/init.d/elasticsearch similarity index 100% rename from distribution/packages/rpm/src/main/packaging/init.d/elasticsearch rename to distribution/packages/src/rpm/init.d/elasticsearch diff --git a/distribution/src/main/resources/bin/elasticsearch b/distribution/src/bin/elasticsearch similarity index 100% rename from distribution/src/main/resources/bin/elasticsearch rename to distribution/src/bin/elasticsearch diff --git a/distribution/src/main/resources/bin/elasticsearch-env b/distribution/src/bin/elasticsearch-env similarity index 100% rename from distribution/src/main/resources/bin/elasticsearch-env rename to distribution/src/bin/elasticsearch-env diff --git a/distribution/src/main/resources/bin/elasticsearch-env.bat b/distribution/src/bin/elasticsearch-env.bat similarity index 100% rename from distribution/src/main/resources/bin/elasticsearch-env.bat rename to distribution/src/bin/elasticsearch-env.bat diff --git a/distribution/src/main/resources/bin/elasticsearch-keystore b/distribution/src/bin/elasticsearch-keystore similarity index 100% rename from distribution/src/main/resources/bin/elasticsearch-keystore rename to distribution/src/bin/elasticsearch-keystore diff --git a/distribution/src/main/resources/bin/elasticsearch-keystore.bat b/distribution/src/bin/elasticsearch-keystore.bat similarity index 100% rename from distribution/src/main/resources/bin/elasticsearch-keystore.bat rename to distribution/src/bin/elasticsearch-keystore.bat diff --git a/distribution/src/main/resources/bin/elasticsearch-plugin b/distribution/src/bin/elasticsearch-plugin similarity index 100% rename from distribution/src/main/resources/bin/elasticsearch-plugin rename to distribution/src/bin/elasticsearch-plugin diff --git a/distribution/src/main/resources/bin/elasticsearch-plugin.bat b/distribution/src/bin/elasticsearch-plugin.bat similarity index 100% rename from distribution/src/main/resources/bin/elasticsearch-plugin.bat rename to distribution/src/bin/elasticsearch-plugin.bat diff --git a/distribution/src/main/resources/bin/elasticsearch-service-mgr.exe b/distribution/src/bin/elasticsearch-service-mgr.exe similarity index 100% rename from distribution/src/main/resources/bin/elasticsearch-service-mgr.exe rename to distribution/src/bin/elasticsearch-service-mgr.exe diff --git a/distribution/src/main/resources/bin/elasticsearch-service-x64.exe b/distribution/src/bin/elasticsearch-service-x64.exe similarity index 100% rename from distribution/src/main/resources/bin/elasticsearch-service-x64.exe rename to distribution/src/bin/elasticsearch-service-x64.exe diff --git a/distribution/src/main/resources/bin/elasticsearch-service.bat b/distribution/src/bin/elasticsearch-service.bat similarity index 100% rename from distribution/src/main/resources/bin/elasticsearch-service.bat rename to distribution/src/bin/elasticsearch-service.bat diff --git a/distribution/src/main/resources/bin/elasticsearch-translog b/distribution/src/bin/elasticsearch-translog similarity index 100% rename from distribution/src/main/resources/bin/elasticsearch-translog rename to distribution/src/bin/elasticsearch-translog diff --git a/distribution/src/main/resources/bin/elasticsearch-translog.bat b/distribution/src/bin/elasticsearch-translog.bat similarity index 100% rename from distribution/src/main/resources/bin/elasticsearch-translog.bat rename to distribution/src/bin/elasticsearch-translog.bat diff --git a/distribution/src/main/resources/bin/elasticsearch.bat b/distribution/src/bin/elasticsearch.bat similarity index 100% rename from distribution/src/main/resources/bin/elasticsearch.bat rename to distribution/src/bin/elasticsearch.bat diff --git a/distribution/src/main/resources/config/elasticsearch.yml b/distribution/src/config/elasticsearch.yml similarity index 100% rename from distribution/src/main/resources/config/elasticsearch.yml rename to distribution/src/config/elasticsearch.yml diff --git a/distribution/src/main/resources/config/jvm.options b/distribution/src/config/jvm.options similarity index 100% rename from distribution/src/main/resources/config/jvm.options rename to distribution/src/config/jvm.options diff --git a/distribution/src/main/resources/config/log4j2.properties b/distribution/src/config/log4j2.properties similarity index 100% rename from distribution/src/main/resources/config/log4j2.properties rename to distribution/src/config/log4j2.properties