2015-10-29 14:40:19 -04:00
|
|
|
/*
|
2017-01-05 11:15:34 -05:00
|
|
|
* Licensed to Elasticsearch under one or more contributor
|
2015-10-29 14:40:19 -04:00
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
|
2015-12-18 15:43:47 -05:00
|
|
|
|
2015-10-29 14:40:19 -04:00
|
|
|
import org.apache.tools.ant.filters.FixCrLfFilter
|
2015-11-20 14:43:49 -05:00
|
|
|
import org.apache.tools.ant.taskdefs.condition.Os
|
2016-05-13 19:32:35 -04:00
|
|
|
import org.elasticsearch.gradle.BuildPlugin
|
2017-12-26 04:51:47 -05:00
|
|
|
import org.elasticsearch.gradle.ConcatFilesTask
|
2015-12-18 15:43:47 -05:00
|
|
|
import org.elasticsearch.gradle.MavenFilteringHack
|
2017-02-15 12:40:16 -05:00
|
|
|
import org.elasticsearch.gradle.NoticeTask
|
2015-10-29 14:40:19 -04:00
|
|
|
import org.elasticsearch.gradle.precommit.DependencyLicensesTask
|
2015-12-01 20:08:27 -05:00
|
|
|
import org.elasticsearch.gradle.precommit.UpdateShasTask
|
2015-11-16 19:02:44 -05:00
|
|
|
import org.elasticsearch.gradle.test.RunTask
|
2015-10-29 14:40:19 -04:00
|
|
|
|
2018-02-14 01:49:53 -05:00
|
|
|
Collection distributions = project('archives').subprojects + project('packages').subprojects
|
2017-02-15 16:55:19 -05:00
|
|
|
|
2017-12-26 04:51:47 -05:00
|
|
|
/*****************************************************************************
|
|
|
|
* Third party dependencies report *
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
// Concatenates the dependencies CSV files into a single file
|
|
|
|
task generateDependenciesReport(type: ConcatFilesTask) {
|
|
|
|
files = fileTree(dir: project.rootDir, include: '**/dependencies.csv' )
|
|
|
|
headerLine = "name,version,url,license"
|
|
|
|
target = new File(System.getProperty('csv')?: "${project.buildDir}/dependencies/es-dependencies.csv")
|
|
|
|
}
|
|
|
|
|
2017-02-15 12:40:16 -05:00
|
|
|
/*****************************************************************************
|
|
|
|
* Notice file *
|
|
|
|
*****************************************************************************/
|
|
|
|
|
2018-01-11 13:30:43 -05:00
|
|
|
// integ test zip only uses server, so a different notice file is needed there
|
2017-02-15 12:40:16 -05:00
|
|
|
task buildCoreNotice(type: NoticeTask) {
|
2018-01-11 13:30:43 -05:00
|
|
|
licensesDir new File(project(':server').projectDir, 'licenses')
|
2017-02-15 12:40:16 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// other distributions include notices from modules as well, which are added below later
|
|
|
|
task buildFullNotice(type: NoticeTask) {
|
2018-01-11 13:30:43 -05:00
|
|
|
licensesDir new File(project(':server').projectDir, 'licenses')
|
2017-02-15 12:40:16 -05:00
|
|
|
}
|
|
|
|
|
2015-12-03 17:18:26 -05:00
|
|
|
/*****************************************************************************
|
|
|
|
* Modules *
|
|
|
|
*****************************************************************************/
|
|
|
|
|
2015-12-10 20:30:05 -05:00
|
|
|
task buildModules(type: Sync) {
|
2015-12-03 17:18:26 -05:00
|
|
|
into 'build/modules'
|
2016-07-11 16:00:45 -04:00
|
|
|
}
|
|
|
|
|
2015-12-04 16:38:09 -05:00
|
|
|
ext.restTestExpansions = [
|
|
|
|
'expected.modules.count': 0,
|
|
|
|
]
|
2015-12-03 17:18:26 -05:00
|
|
|
// we create the buildModules task above so the distribution subprojects can
|
2015-12-10 19:16:49 -05:00
|
|
|
// depend on it, but we don't actually configure it until here so we can do a single
|
|
|
|
// loop over modules to also setup cross task dependencies and increment our modules counter
|
2018-01-18 22:16:26 -05:00
|
|
|
project.rootProject.subprojects.findAll { it.parent.path == ':modules' }.each { Project module ->
|
2017-02-15 12:40:16 -05:00
|
|
|
buildFullNotice {
|
2017-04-10 07:37:42 -04:00
|
|
|
def defaultLicensesDir = new File(module.projectDir, 'licenses')
|
|
|
|
if (defaultLicensesDir.exists()) {
|
|
|
|
licensesDir defaultLicensesDir
|
|
|
|
}
|
2017-02-15 12:40:16 -05:00
|
|
|
}
|
2015-12-10 19:16:49 -05:00
|
|
|
buildModules {
|
|
|
|
dependsOn({ project(module.path).bundlePlugin })
|
|
|
|
into(module.name) {
|
|
|
|
from { zipTree(project(module.path).bundlePlugin.outputs.files.singleFile) }
|
2015-12-03 17:18:26 -05:00
|
|
|
}
|
2015-10-29 14:40:19 -04:00
|
|
|
}
|
2018-02-21 20:46:40 -05:00
|
|
|
// make sure the module's integration tests run after the integ-test-zip (ie rest tests)
|
2015-12-10 19:16:49 -05:00
|
|
|
module.afterEvaluate({
|
2018-02-14 01:49:53 -05:00
|
|
|
module.integTest.mustRunAfter(':distribution:archives:integ-test-zip:integTest')
|
2015-12-10 19:16:49 -05:00
|
|
|
})
|
|
|
|
restTestExpansions['expected.modules.count'] += 1
|
2015-10-29 14:40:19 -04:00
|
|
|
}
|
|
|
|
|
2017-01-03 15:39:36 -05:00
|
|
|
// Integ tests work over the rest http layer, so we need a transport included with the integ test zip.
|
2016-07-12 15:13:52 -04:00
|
|
|
// All transport modules are included so that they may be randomized for testing
|
|
|
|
task buildTransportModules(type: Sync) {
|
|
|
|
into 'build/transport-modules'
|
2016-07-11 16:00:45 -04:00
|
|
|
}
|
|
|
|
|
2016-07-12 15:13:52 -04:00
|
|
|
project.rootProject.subprojects.findAll { it.path.startsWith(':modules:transport-') }.each { Project transport ->
|
|
|
|
buildTransportModules {
|
|
|
|
dependsOn({ project(transport.path).bundlePlugin })
|
|
|
|
into(transport.name) {
|
|
|
|
from { zipTree(project(transport.path).bundlePlugin.outputs.files.singleFile) }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-07-11 16:00:45 -04:00
|
|
|
|
2015-12-03 17:18:26 -05:00
|
|
|
// make sure we have a clean task since we aren't a java project, but we have tasks that
|
|
|
|
// put stuff in the build dir
|
|
|
|
task clean(type: Delete) {
|
|
|
|
delete 'build'
|
|
|
|
}
|
|
|
|
|
2018-02-21 20:46:40 -05:00
|
|
|
configure(subprojects.findAll { ['archives', 'packages'].contains(it.name) }) {
|
2015-10-29 14:40:19 -04:00
|
|
|
// 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 {
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
* Common files in all distributions *
|
|
|
|
*****************************************************************************/
|
|
|
|
libFiles = copySpec {
|
|
|
|
into 'lib'
|
2018-01-11 13:30:43 -05:00
|
|
|
from { project(':server').jar }
|
|
|
|
from { project(':server').configurations.runtime }
|
2018-01-03 14:12:43 -05:00
|
|
|
from { project(':libs:plugin-classloader').jar }
|
2017-02-15 16:55:19 -05:00
|
|
|
// delay add tools using closures, since they have not yet been configured, so no jar task exists yet
|
2017-12-06 18:03:13 -05:00
|
|
|
from { project(':distribution:tools:launchers').jar }
|
2017-04-21 12:25:58 -04:00
|
|
|
from { project(':distribution:tools:plugin-cli').jar }
|
2015-12-03 17:18:26 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
modulesFiles = copySpec {
|
|
|
|
into 'modules'
|
|
|
|
from project(':distribution').buildModules
|
2015-10-29 14:40:19 -04:00
|
|
|
}
|
|
|
|
|
2016-07-12 15:13:52 -04:00
|
|
|
transportModulesFiles = copySpec {
|
|
|
|
into "modules"
|
|
|
|
from project(':distribution').buildTransportModules
|
2016-07-11 16:00:45 -04:00
|
|
|
}
|
2016-07-12 15:13:52 -04:00
|
|
|
|
2018-02-21 20:46:40 -05:00
|
|
|
configFiles = { distributionType ->
|
|
|
|
copySpec {
|
|
|
|
from '../src/config'
|
|
|
|
MavenFilteringHack.filter(it, expansionsForDistribution(distributionType))
|
|
|
|
}
|
2015-10-29 14:40:19 -04:00
|
|
|
}
|
|
|
|
|
2018-02-21 20:46:40 -05:00
|
|
|
binFiles = { distributionType ->
|
|
|
|
copySpec {
|
|
|
|
// everything except windows files
|
|
|
|
from '../src/bin'
|
|
|
|
exclude '*.bat'
|
|
|
|
exclude '*.exe'
|
|
|
|
eachFile { it.setMode(0755) }
|
|
|
|
MavenFilteringHack.filter(it, expansionsForDistribution(distributionType))
|
|
|
|
}
|
2015-10-29 14:40:19 -04:00
|
|
|
}
|
2016-05-26 12:19:38 -04:00
|
|
|
|
|
|
|
commonFiles = copySpec {
|
|
|
|
from rootProject.projectDir
|
|
|
|
include 'LICENSE.txt'
|
|
|
|
include 'README.textile'
|
|
|
|
}
|
2017-02-15 12:40:16 -05:00
|
|
|
|
|
|
|
noticeFile = copySpec {
|
|
|
|
if (project.name == 'integ-test-zip') {
|
|
|
|
from buildCoreNotice
|
|
|
|
} else {
|
|
|
|
from buildFullNotice
|
|
|
|
}
|
|
|
|
}
|
2015-10-29 14:40:19 -04:00
|
|
|
}
|
2016-05-05 20:53:01 -04:00
|
|
|
|
2015-10-29 14:40:19 -04:00
|
|
|
}
|
|
|
|
|
2016-05-13 19:36:26 -04:00
|
|
|
task run(type: RunTask) {
|
|
|
|
distribution = 'zip'
|
|
|
|
}
|
2015-11-16 19:02:44 -05:00
|
|
|
|
2015-11-05 15:47:54 -05:00
|
|
|
/**
|
|
|
|
* Build some variables that are replaced in the packages. This includes both
|
2016-02-04 10:00:55 -05:00
|
|
|
* scripts like bin/elasticsearch and bin/elasticsearch-plugin that a user might run and also
|
2015-11-05 15:47:54 -05:00
|
|
|
* scripts like postinst which are run as part of the installation.
|
|
|
|
*
|
|
|
|
* <dl>
|
|
|
|
* <dt>package.name</dt>
|
|
|
|
* <dd>The name of the project. Its sprinkled throughout the scripts.</dd>
|
|
|
|
* <dt>package.version</dt>
|
|
|
|
* <dd>The version of the project. Its mostly used to find the exact jar name.
|
|
|
|
* </dt>
|
|
|
|
* <dt>path.conf</dt>
|
|
|
|
* <dd>The default directory from which to load configuration. This is used in
|
|
|
|
* the packaging scripts, but in that context it is always
|
2016-02-04 10:00:55 -05:00
|
|
|
* /etc/elasticsearch. Its also used in bin/elasticsearch-plugin, where it is
|
2015-11-05 15:47:54 -05:00
|
|
|
* /etc/elasticsearch for the os packages but $ESHOME/config otherwise.</dd>
|
|
|
|
* <dt>path.env</dt>
|
|
|
|
* <dd>The env file sourced before bin/elasticsearch to set environment
|
|
|
|
* variables. Think /etc/defaults/elasticsearch.</dd>
|
|
|
|
* <dt>heap.min and heap.max</dt>
|
|
|
|
* <dd>Default min and max heap</dd>
|
|
|
|
* <dt>scripts.footer</dt>
|
|
|
|
* <dd>Footer appended to control scripts embedded in the distribution that is
|
|
|
|
* (almost) entirely there for cosmetic reasons.</dd>
|
|
|
|
* <dt>stopping.timeout</dt>
|
|
|
|
* <dd>RPM's init script needs to wait for elasticsearch to stop before
|
|
|
|
* returning from stop and it needs a maximum time to wait. This is it. One
|
|
|
|
* day. DEB retries forever.</dd>
|
|
|
|
* </dl>
|
|
|
|
*/
|
2018-02-21 20:46:40 -05:00
|
|
|
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<String, Object> expansions = [
|
|
|
|
'project.name': project.name,
|
|
|
|
'project.version': version,
|
|
|
|
|
|
|
|
'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.dump.path': [
|
|
|
|
'deb': "-XX:HeapDumpPath=/var/lib/elasticsearch",
|
|
|
|
'rpm': "-XX:HeapDumpPath=/var/lib/elasticsearch",
|
2018-03-18 15:32:37 -04:00
|
|
|
'def': "-XX:HeapDumpPath=data"
|
2018-02-21 20:46:40 -05:00
|
|
|
],
|
|
|
|
|
2018-03-13 16:32:16 -04:00
|
|
|
'error.file': [
|
|
|
|
'deb': "-XX:ErrorFile=/var/log/elasticsearch/hs_err_pid%p.log",
|
|
|
|
'rpm': "-XX:ErrorFile=/var/log/elasticsearch/hs_err_pid%p.log",
|
2018-03-18 15:33:17 -04:00
|
|
|
'def': "-XX:ErrorFile=logs/hs_err_pid%p.log"
|
2018-03-13 16:32:16 -04:00
|
|
|
],
|
|
|
|
|
2018-02-21 20:46:40 -05:00
|
|
|
'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<String, String> 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
|
|
|
|
}
|
2015-11-05 15:47:54 -05:00
|
|
|
}
|
2018-02-21 20:46:40 -05:00
|
|
|
result[key] = value
|
2015-11-05 15:47:54 -05:00
|
|
|
}
|
2018-02-21 20:46:40 -05:00
|
|
|
return result
|
2015-11-05 15:47:54 -05:00
|
|
|
}
|
|
|
|
}
|