mirror of https://github.com/apache/lucene.git
203 lines
6.5 KiB
Groovy
203 lines
6.5 KiB
Groovy
/*
|
|
* 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 com.google.common.base.Preconditions
|
|
import com.google.common.base.Strings
|
|
|
|
description = 'Solr Docker image'
|
|
|
|
apply plugin: 'base'
|
|
|
|
// Solr Docker inputs
|
|
def dockerImageRepo = propertyOrEnvOrDefault("solr.docker.imageRepo", "SOLR_DOCKER_IMAGE_REPO", "apache/solr")
|
|
def dockerImageTag = propertyOrEnvOrDefault("solr.docker.imageTag", "SOLR_DOCKER_IMAGE_TAG", "${version}")
|
|
def dockerImageName = propertyOrEnvOrDefault("solr.docker.imageName", "SOLR_DOCKER_IMAGE_NAME", "${dockerImageRepo}:${dockerImageTag}")
|
|
def baseDockerImage = propertyOrEnvOrDefault("solr.docker.baseImage", "SOLR_DOCKER_BASE_IMAGE", 'openjdk:11-jre-slim')
|
|
def githubUrlOrMirror = propertyOrEnvOrDefault("solr.docker.githubUrl", "SOLR_DOCKER_GITHUB_URL", 'github.com')
|
|
|
|
// Build directory locations
|
|
def dockerBuildDistribution = "$buildDir/distributions"
|
|
def imageIdFile = "$buildDir/image-id"
|
|
|
|
configurations {
|
|
packaging {
|
|
canBeResolved = true
|
|
}
|
|
dockerImage {
|
|
canBeResolved = true
|
|
}
|
|
}
|
|
|
|
dependencies {
|
|
packaging project(path: ":solr:packaging", configuration: 'archives')
|
|
|
|
dockerImage files(imageIdFile) {
|
|
builtBy 'dockerBuild'
|
|
}
|
|
}
|
|
|
|
task dockerTar(type: Tar) {
|
|
group = 'Docker'
|
|
description = 'Package docker context to prepare for docker build'
|
|
|
|
dependsOn configurations.packaging
|
|
into('scripts') {
|
|
from file('scripts')
|
|
fileMode 755
|
|
}
|
|
into('releases') {
|
|
from configurations.packaging
|
|
include '*.tgz'
|
|
}
|
|
from file('Dockerfile')
|
|
destinationDirectory = file(dockerBuildDistribution)
|
|
extension 'tgz'
|
|
compression = Compression.GZIP
|
|
}
|
|
|
|
task dockerBuild(dependsOn: tasks.dockerTar) {
|
|
group = 'Docker'
|
|
description = 'Build Solr docker image'
|
|
|
|
// Ensure that the docker image is rebuilt on build-arg changes or changes in the docker context
|
|
inputs.properties([
|
|
baseDockerImage: baseDockerImage,
|
|
githubUrlOrMirror: githubUrlOrMirror,
|
|
version: version
|
|
])
|
|
inputs.dir(dockerBuildDistribution)
|
|
|
|
doLast {
|
|
exec {
|
|
standardInput = tasks.dockerTar.outputs.files.singleFile.newDataInputStream()
|
|
commandLine "docker", "build",
|
|
"--iidfile", imageIdFile,
|
|
"--build-arg", "BASE_IMAGE=${inputs.properties.baseDockerImage}",
|
|
"--build-arg", "SOLR_VERSION=${version}",
|
|
"--build-arg", "GITHUB_URL=${inputs.properties.githubUrlOrMirror}",
|
|
"-"
|
|
}
|
|
}
|
|
|
|
// Print information on the image after it has been created
|
|
doLast {
|
|
def dockerImageId = file(imageIdFile).text
|
|
project.logger.lifecycle("Solr Docker Image Created")
|
|
project.logger.lifecycle("\tID: \t$dockerImageId")
|
|
project.logger.lifecycle("\tBase Image: \t$baseDockerImage")
|
|
project.logger.lifecycle("\tSolr Version: \t$version")
|
|
}
|
|
|
|
outputs.files(imageIdFile)
|
|
}
|
|
|
|
task dockerTag(dependsOn: tasks.dockerBuild) {
|
|
group = 'Docker'
|
|
description = 'Tag Solr docker image'
|
|
|
|
def dockerImageIdFile = file(imageIdFile)
|
|
// Ensure that the docker image is re-tagged if the image ID or desired tag changes
|
|
inputs.properties([
|
|
dockerImageName: dockerImageName,
|
|
])
|
|
inputs.file(dockerImageIdFile)
|
|
|
|
doLast {
|
|
def dockerImageId = dockerImageIdFile.text
|
|
|
|
exec {
|
|
commandLine "docker", "tag", dockerImageId, inputs.properties.dockerImageName
|
|
}
|
|
|
|
// Print information on the image after it has been created
|
|
project.logger.lifecycle("Solr Docker Image Tagged")
|
|
project.logger.lifecycle("\tID: \t$dockerImageId")
|
|
project.logger.lifecycle("\tTag: \t$dockerImageName")
|
|
}
|
|
}
|
|
|
|
task testDocker(dependsOn: tasks.dockerBuild) {
|
|
group = 'Docker'
|
|
description = 'Test Solr docker image'
|
|
|
|
def inputDir = "tests/cases"
|
|
def outputDir = "$buildDir/tmp/tests"
|
|
|
|
// Ensure that the docker image is re-tested if the image ID changes or the test files change
|
|
inputs.properties([
|
|
includeTests: new HashSet(Arrays.asList(propertyOrEnvOrDefault("solr.docker.tests.include", "SOLR_DOCKER_TESTS_INCLUDE", ",").split(","))),
|
|
excludeTests: new HashSet(Arrays.asList(propertyOrEnvOrDefault("solr.docker.tests.exclude", "SOLR_DOCKER_TESTS_EXCLUDE", ",").split(",")))
|
|
])
|
|
inputs.file(imageIdFile)
|
|
inputs.dir(inputDir)
|
|
|
|
doLast {
|
|
def solrImageId = tasks.dockerBuild.outputs.files.singleFile.text
|
|
def solrImageName = solrImageId.substring(7, 14)
|
|
|
|
// Print information on the image before it is tested
|
|
logger.lifecycle("Testing Solr Image:")
|
|
logger.lifecycle("\tID: $solrImageId\n")
|
|
|
|
// Run the tests
|
|
def sourceDir = file(inputDir)
|
|
sourceDir.eachFile { file ->
|
|
def testName = file.getName()
|
|
def testCaseBuildDir = "${outputDir}/${testName}"
|
|
|
|
// If specific tests are specified, only run those. Otherwise run all that are not ignored.
|
|
def runTest = !inputs.properties.includeTests.isEmpty() ? inputs.properties.includeTests.contains(testName) : !inputs.properties.excludeTests.contains(testName)
|
|
if (runTest) {
|
|
exec {
|
|
environment "TEST_DIR", file
|
|
environment "BUILD_DIR", testCaseBuildDir
|
|
commandLine "bash", "$file/test.sh", solrImageName
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
outputs.dir(outputDir)
|
|
}
|
|
|
|
task dockerPush(dependsOn: tasks.dockerTag) {
|
|
group = 'Docker'
|
|
description = 'Push Solr docker image'
|
|
|
|
// Ensure that the docker image is re-pushed if the image ID or tag changes
|
|
inputs.properties([
|
|
dockerImageName: dockerImageName,
|
|
])
|
|
inputs.file(imageIdFile)
|
|
|
|
// We don't want to push a docker image unless the tests have passed
|
|
mustRunAfter tasks.testDocker
|
|
|
|
doLast {
|
|
exec {
|
|
commandLine "docker", "push", dockerImageName
|
|
}
|
|
|
|
// Print information on the image after it has been created
|
|
project.logger.lifecycle("Solr Docker Image Pushed: \t$dockerImageName")
|
|
}
|
|
}
|
|
|
|
// One task to build and tag a Solr docker image
|
|
task docker {
|
|
dependsOn tasks.dockerBuild, tasks.dockerTag
|
|
} |