240 lines
8.7 KiB
Groovy
240 lines
8.7 KiB
Groovy
|
/*
|
||
|
* 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.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
|
||
|
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
|
||
|
* 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
|
||
|
* exist on disk it petulantly creates it with 0755 permissions, no matter
|
||
|
* how hard you try to convince it otherwise.
|
||
|
* 2. Convincing ospackage to pick up an empty directory as part of a set of
|
||
|
* directories on disk is reasonably easy. Convincing it to just create an
|
||
|
* empty directory requires more wits than I have.
|
||
|
* 3. ospackage really wants to suck up some of the debian control scripts
|
||
|
* directly from the filesystem. It doesn't want to process them through
|
||
|
* MavenFilteringHack or any other copy-style action.
|
||
|
*
|
||
|
* The following commands are useful when it comes to check the user/group
|
||
|
* and files permissions set within the RPM and DEB packages:
|
||
|
*
|
||
|
* rpm -qlp --dump path/to/elasticsearch.rpm
|
||
|
* dpkg -c path/to/elasticsearch.deb
|
||
|
*/
|
||
|
|
||
|
// for deb/rpm
|
||
|
buildscript {
|
||
|
repositories {
|
||
|
maven {
|
||
|
url "https://plugins.gradle.org/m2/"
|
||
|
}
|
||
|
}
|
||
|
dependencies {
|
||
|
classpath 'com.netflix.nebula:gradle-ospackage-plugin:3.4.0'
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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'
|
||
|
|
||
|
MavenFilteringHack.filter(it, expansions)
|
||
|
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 <info@elastic.co>'
|
||
|
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')
|
||
|
}
|
||
|
|
||
|
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'
|
||
|
}
|
||
|
}
|
||
|
with noticeFile
|
||
|
|
||
|
configurationFile '/etc/elasticsearch/elasticsearch.yml'
|
||
|
configurationFile '/etc/elasticsearch/jvm.options'
|
||
|
configurationFile '/etc/elasticsearch/log4j2.properties'
|
||
|
into('/etc/elasticsearch') {
|
||
|
dirMode 0750
|
||
|
fileMode 0660
|
||
|
permissionGroup 'elasticsearch'
|
||
|
includeEmptyDirs true
|
||
|
createDirectoryEntry true
|
||
|
fileType CONFIG | NOREPLACE
|
||
|
from "${packagingFiles}/etc/elasticsearch"
|
||
|
}
|
||
|
|
||
|
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"
|
||
|
}
|
||
|
into('/usr/lib/sysctl.d') {
|
||
|
fileType CONFIG | NOREPLACE
|
||
|
from "${packagingFiles}/systemd/sysctl/elasticsearch.conf"
|
||
|
}
|
||
|
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) {
|
||
|
from "${packagingFiles}/${path}"
|
||
|
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)
|
||
|
}
|
||
|
}
|
||
|
|