/* * 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 }