blob: cc48294880a28bac0d14fa33f4ac1a58ed106a94 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.util.TeeOutputStream
// This project puts together a "distribution", assembling dependencies from
// various other projects.
plugins {
id 'base'
id 'distribution'
}
description = 'Solr distribution packaging'
ext {
distDir = file("$buildDir/solr-${version}")
slimDistDir = file("$buildDir/solr-${version}-slim")
devDir = file("$buildDir/dev")
slimDevDir = file("$buildDir/dev-slim")
}
configurations {
modules
example
prometheusExporter
server
docs
docker
solrFullTgz
solrSlimTgz
solrFullTgzSignature
solrSlimTgzSignature
}
dependencies {
project(":solr:modules").childProjects.values().stream().map(project -> project.path).each { module ->
modules project(path: module, configuration: "packaging")
}
prometheusExporter project(path: ":solr:prometheus-exporter", configuration: "packaging")
example project(path: ":solr:example", configuration: "packaging")
server project(path: ":solr:server", configuration: "packaging")
// Copy files from documentation output
docs project(path: ':solr:documentation', configuration: 'minimalSite')
docker project(path: ':solr:docker', configuration: 'packaging')
solrFullTgzSignature files("$buildDir/distributions/solr-${version}.tgz.asc") {
builtBy ":solr:distribution:signFullBinaryTgz"
}
solrSlimTgzSignature files("$buildDir/distributions/solr-${version}-slim.tgz.asc") {
builtBy ":solr:distribution:signSlimBinaryTgz"
}
}
distributions {
slim {
distributionBaseName = 'solr'
distributionClassifier = "slim"
contents {
from(rootDir, {
include "LICENSE.txt"
include "NOTICE.txt"
})
from(project(":solr").projectDir, {
include "bin/**"
include "licenses/**"
exclude "licenses/README.committers.txt"
include "CHANGES.txt"
})
from(projectDir, {
include "README.txt"
})
from ('static/lib', {
into 'lib'
})
from(configurations.example, {
into "example"
})
from(configurations.server, {
into "server"
})
from(configurations.docs, {
into "docs"
})
from(configurations.docker, {
into "docker"
filesMatching([
"scripts/**",
]) { copy ->
copy.setMode(0755)
}
})
// Manually correct posix permissions (matters when packaging on Windows).
filesMatching([
"**/*.sh",
"**/bin/solr",
"**/bin/systemd/solr.service",
]) { copy ->
copy.setMode(0755)
}
}
}
full {
distributionBaseName = 'solr'
contents {
// Build on-top of the slim distribution
with(distributions.slim.getContents())
from(configurations.modules, {
into "modules"
})
from(configurations.prometheusExporter, {
into "prometheus-exporter"
filesMatching([
"bin/*",
]) { copy ->
copy.setMode(0755)
}
})
}
}
}
installFullDist {
into distDir
}
installSlimDist {
into slimDistDir
}
assembleDist {
dependsOn tasks.assembleFullDist
dependsOn tasks.assembleSlimDist
}
installDist {
dependsOn tasks.installFullDist
dependsOn tasks.installSlimDist
}
task devFull(type: Copy) {
description "Assemble Full Solr distribution into 'development' folder at ${devDir}"
group "build"
from installFullDist.outputs
into devDir
}
task devSlim(type: Copy) {
description "Assemble Slim Solr distribution into 'development' folder at ${slimDevDir}"
group "build"
from installSlimDist.outputs
into slimDevDir
}
task dev {
description "Assemble Solr distributions into 'development' folders at ${devDir} and ${slimDevDir}"
group "build"
dependsOn tasks.devFull
dependsOn tasks.devSlim
}
fullDistTar {
compression = Compression.GZIP
}
slimDistTar {
compression = Compression.GZIP
}
distTar.dependsOn tasks.fullDistTar
distTar.dependsOn tasks.slimDistTar
fullDistZip.enabled = false
slimDistZip.enabled = false
assemble.dependsOn tasks.installDist
assemble.dependsOn tasks.installSlimDist
artifacts {
solrFullTgz(fullDistTar)
solrSlimTgz(slimDistTar)
}
task downloadBats(type: NpmTask) {
group = 'Build Dependency Download'
args = ["install", "https://github.com/bats-core/bats-core#v1.8.2",
"https://github.com/bats-core/bats-assert#v2.0.0",
"https://github.com/bats-core/bats-file#v0.3.0",
]
inputs.files("${project.ext.nodeProjectDir}/package.json")
outputs.dir("${project.ext.nodeProjectDir}/node_modules/bats")
outputs.dir("${project.ext.nodeProjectDir}/node_modules/bats-support")
outputs.dir("${project.ext.nodeProjectDir}/node_modules/bats-assert")
outputs.dir("${project.ext.nodeProjectDir}/node_modules/bats-file")
}
task integrationTests(type: BatsTask) {
dependsOn installFullDist
dependsOn downloadBats
def integrationTestOutput = "$buildDir/test-output"
def solrHome = "$integrationTestOutput/solr-home"
def solrTestFailuresDir = "$integrationTestOutput/failure-snapshots"
var solrPort = Integer.parseInt((String) project.findProperty('bats.port') ?: System.getProperty("bats.port", "-1"))
while (solrPort > 64000 || solrPort < 0) { // We need room for +1000 for ZK
try (ServerSocket s = new ServerSocket(0)) {
solrPort = s.getLocalPort()
} catch (Exception e) {
println("WARN: Could not assign random port for Bats tests. Using default port 8983.")
solrPort = 8983
}
}
inputs.dir(distDir)
outputs.dir(integrationTestOutput)
doFirst {
delete integrationTestOutput
mkdir integrationTestOutput
mkdir solrHome
mkdir solrTestFailuresDir
// TODO - if quiet then don't tee
standardOutput = new TeeOutputStream(System.out, new FileOutputStream("$integrationTestOutput/test-output.txt"))
println("Running BATS tests with Solr base port ${solrPort}")
}
environment SOLR_TIP: distDir.toString()
environment SOLR_HOME: solrHome
environment SOLR_PID_DIR: solrHome
environment SOLR_PORT: solrPort
environment SOLR2_PORT: solrPort + 1
environment SOLR3_PORT: solrPort + 2
environment ZK_PORT: solrPort + 1000
environment SOLR_LOGS_DIR: "$solrHome/logs"
environment TEST_OUTPUT_DIR: integrationTestOutput
environment TEST_FAILURE_DIR: solrTestFailuresDir
environment BATS_LIB_PREFIX: "$nodeProjectDir/node_modules"
}
class BatsTask extends Exec {
@InputDirectory
String testDir = 'test'
@Input
var testFiles = []
@Option(option = "tests", description = "Sets test cases to be included")
public void setTestNamePatterns(List<String> tests) {
// TODO: bats --filter <regex>
tests.each { testFiles << "$testDir/$it" }
}
@Override
@TaskAction
protected void exec() {
executable "$project.ext.nodeProjectDir/node_modules/bats/bin/bats"
// Note: tests to run must be listed after all other arguments
// Additional debugging output: -x, --verbose-run
setArgs(['-T', '--print-output-on-failure'] + (testFiles.empty ? testDir : testFiles))
super.exec()
}
}