mirror of https://github.com/apache/lucene.git
SOLR-14949: Ability to customize Solr Docker build (#2020)
Also added a gradlew helpDocker page.
This commit is contained in:
parent
426a9c25c2
commit
212b0f8657
|
@ -17,6 +17,10 @@ jobs:
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
env:
|
||||||
|
SOLR_DOCKER_IMAGE_REPO: github-pr/solr
|
||||||
|
SOLR_DOCKER_IMAGE_TAG: ${{github.event.number}}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
# Setup
|
# Setup
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
|
|
@ -29,6 +29,7 @@ configure(rootProject) {
|
||||||
["Git", "help/git.txt", "Git assistance and guides."],
|
["Git", "help/git.txt", "Git assistance and guides."],
|
||||||
["ValidateLogCalls", "help/validateLogCalls.txt", "How to use logging calls efficiently."],
|
["ValidateLogCalls", "help/validateLogCalls.txt", "How to use logging calls efficiently."],
|
||||||
["IDEs", "help/IDEs.txt", "IDE support."],
|
["IDEs", "help/IDEs.txt", "IDE support."],
|
||||||
|
["Docker", "help/docker.txt", "Building Solr Docker images."],
|
||||||
]
|
]
|
||||||
|
|
||||||
helpFiles.each { section, path, sectionInfo ->
|
helpFiles.each { section, path, sectionInfo ->
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
Docker Images for Solr
|
||||||
|
======================
|
||||||
|
|
||||||
|
Solr docker images are built using Palantir's Docker Gradle plugin, https://github.com/palantir/gradle-docker.
|
||||||
|
|
||||||
|
Common Inputs
|
||||||
|
-------------
|
||||||
|
|
||||||
|
The docker image and its tag can be customized via the following options, all accepted via both Environment Variables and Gradle Properties.
|
||||||
|
|
||||||
|
Docker Image Repository:
|
||||||
|
Default: "apache/solr"
|
||||||
|
EnvVar: SOLR_DOCKER_IMAGE_REPO
|
||||||
|
Gradle Property: -Psolr.docker.imageRepo
|
||||||
|
|
||||||
|
Docker Image Tag:
|
||||||
|
Default: the Solr version, e.g. "9.0.0-SNAPSHOT"
|
||||||
|
EnvVar: SOLR_DOCKER_IMAGE_TAG
|
||||||
|
Gradle Property: -Psolr.docker.imageTag
|
||||||
|
|
||||||
|
Docker Image Name: (Use this to explicitly set a whole image name. If given, the image repo and image version options above are ignored.)
|
||||||
|
Default: {image_repo}/{image_tag} (both options provided above, with defaults)
|
||||||
|
EnvVar: SOLR_DOCKER_IMAGE_NAME
|
||||||
|
Gradle Property: -Psolr.docker.imageName
|
||||||
|
|
||||||
|
Building
|
||||||
|
--------
|
||||||
|
|
||||||
|
In order to build the Solr Docker image, run:
|
||||||
|
|
||||||
|
gradlew docker
|
||||||
|
|
||||||
|
The docker build task accepts the following inputs, in addition to the common inputs listed above:
|
||||||
|
|
||||||
|
Base Docker Image: (The docker image used for the "FROM" in the Solr Dockerfile)
|
||||||
|
Default: "openjdk:11-jre-slim"
|
||||||
|
EnvVar: SOLR_DOCKER_BASE_IMAGE
|
||||||
|
Gradle Property: -Psolr.docker.baseImage
|
||||||
|
|
||||||
|
Testing
|
||||||
|
-------
|
||||||
|
|
||||||
|
To test the docker image, run:
|
||||||
|
|
||||||
|
gradlew dockerTest
|
||||||
|
|
||||||
|
If a custom docker image name was used, via one of the common inputs described above, then the same input must be used while testing.
|
||||||
|
|
||||||
|
You can also specify an explicit list of tests to run, or an explicit list of tests to ignore.
|
||||||
|
Both inputs are optional, and by default all tests will be run.
|
||||||
|
|
||||||
|
gradlew testDocker --tests create_core,demo
|
||||||
|
gradlew testDocker --ignore demo-tini,initdb
|
|
@ -153,6 +153,8 @@ Other Changes
|
||||||
|
|
||||||
* SOLR-14978: Enable OOM Killer Script in Solr Foreground. Simplify getting heap dumps on OOM. (Mike Drob, Houston Putman)
|
* SOLR-14978: Enable OOM Killer Script in Solr Foreground. Simplify getting heap dumps on OOM. (Mike Drob, Houston Putman)
|
||||||
|
|
||||||
|
* SOLR-14949: Ability to customize docker image name/base image (Houston Putman)
|
||||||
|
|
||||||
Bug Fixes
|
Bug Fixes
|
||||||
---------------------
|
---------------------
|
||||||
* SOLR-14546: Fix for a relatively hard to hit issue in OverseerTaskProcessor that could lead to out of order execution
|
* SOLR-14546: Fix for a relatively hard to hit issue in OverseerTaskProcessor that could lead to out of order execution
|
||||||
|
|
|
@ -15,6 +15,9 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import com.google.common.base.Preconditions
|
||||||
|
import com.google.common.base.Strings
|
||||||
|
|
||||||
apply plugin: 'base'
|
apply plugin: 'base'
|
||||||
apply plugin: 'com.palantir.docker'
|
apply plugin: 'com.palantir.docker'
|
||||||
|
|
||||||
|
@ -31,8 +34,10 @@ dependencies {
|
||||||
docker dockerPackage
|
docker dockerPackage
|
||||||
}
|
}
|
||||||
|
|
||||||
def dockerImageName = "apache/solr:${version}"
|
def dockerImageRepo = propertyOrEnvOrDefault("solr.docker.imageRepo", "SOLR_DOCKER_IMAGE_REPO", "apache/solr")
|
||||||
def baseDockerImage = 'openjdk:11-jre-slim'
|
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')
|
||||||
|
|
||||||
docker {
|
docker {
|
||||||
name = dockerImageName
|
name = dockerImageName
|
||||||
|
@ -53,12 +58,22 @@ tasks.docker {
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class DockerTestSuite extends DefaultTask {
|
abstract class DockerTestSuite extends DefaultTask {
|
||||||
|
private String solrImageName = null;
|
||||||
private List<String> tests = new ArrayList<>();
|
private List<String> tests = new ArrayList<>();
|
||||||
private List<String> ignore = new ArrayList<>();
|
private List<String> ignore = new ArrayList<>();
|
||||||
|
|
||||||
@OutputDirectory
|
@OutputDirectory
|
||||||
abstract DirectoryProperty getOutputDir()
|
abstract DirectoryProperty getOutputDir()
|
||||||
|
|
||||||
|
public void setSolrImageName(String solrImageName) {
|
||||||
|
this.solrImageName = solrImageName
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSolrImageName() {
|
||||||
|
Preconditions.checkArgument(!Strings.isNullOrEmpty(solrImageName), "solrImageName is a required dockerTests configuration item.")
|
||||||
|
return solrImageName
|
||||||
|
}
|
||||||
|
|
||||||
@Option(option = "tests", description = "Only run these specified tests, comma separated.")
|
@Option(option = "tests", description = "Only run these specified tests, comma separated.")
|
||||||
public void setTests(List<String> tests) {
|
public void setTests(List<String> tests) {
|
||||||
this.tests = tests;
|
this.tests = tests;
|
||||||
|
@ -81,6 +96,8 @@ abstract class DockerTestSuite extends DefaultTask {
|
||||||
|
|
||||||
@TaskAction
|
@TaskAction
|
||||||
void execute() {
|
void execute() {
|
||||||
|
// Print information on the image before it is tested
|
||||||
|
project.logger.lifecycle("Testing Solr Image: $solrImageName\n")
|
||||||
def sourceDir = project.file("tests/cases")
|
def sourceDir = project.file("tests/cases")
|
||||||
sourceDir.eachFile { file ->
|
sourceDir.eachFile { file ->
|
||||||
def testName = file.getName()
|
def testName = file.getName()
|
||||||
|
@ -92,7 +109,7 @@ abstract class DockerTestSuite extends DefaultTask {
|
||||||
project.exec {
|
project.exec {
|
||||||
environment "TEST_DIR", "$file"
|
environment "TEST_DIR", "$file"
|
||||||
environment "BUILD_DIR", "$testCaseBuildDir"
|
environment "BUILD_DIR", "$testCaseBuildDir"
|
||||||
commandLine "bash", "$file/test.sh", "apache/solr:${project.version}"
|
commandLine "bash", "$file/test.sh", solrImageName
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -101,4 +118,5 @@ abstract class DockerTestSuite extends DefaultTask {
|
||||||
|
|
||||||
task testDocker(type: DockerTestSuite) {
|
task testDocker(type: DockerTestSuite) {
|
||||||
outputDir = project.file("$buildDir/tmp/tests")
|
outputDir = project.file("$buildDir/tmp/tests")
|
||||||
|
solrImageName = dockerImageName
|
||||||
}
|
}
|
|
@ -1,45 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
TEST_DIR="${TEST_DIR:-$(dirname -- "${BASH_SOURCE[0]}")}"
|
|
||||||
source "${TEST_DIR}/../../shared.sh"
|
|
||||||
|
|
||||||
echo "Running $container_name"
|
|
||||||
docker run --name "$container_name" -d "$tag"
|
|
||||||
|
|
||||||
wait_for_server_started "$container_name"
|
|
||||||
|
|
||||||
echo "Checking that the OS matches the tag '$tag'"
|
|
||||||
if echo "$tag" | grep -q -- -alpine; then
|
|
||||||
alpine_version=$(docker exec --user=solr "$container_name" cat /etc/alpine-release || true)
|
|
||||||
if [[ -z $alpine_version ]]; then
|
|
||||||
echo "Could not get alpine version from container $container_name"
|
|
||||||
container_cleanup "$container_name"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "Alpine $alpine_version"
|
|
||||||
else
|
|
||||||
debian_version=$(docker exec --user=solr "$container_name" cat /etc/debian_version || true)
|
|
||||||
if [[ -z $debian_version ]]; then
|
|
||||||
echo "Could not get debian version from container $container_name"
|
|
||||||
container_cleanup "$container_name"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "Debian $debian_version"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# check that the version of Solr matches the tag
|
|
||||||
changelog_version=$(docker exec --user=solr "$container_name" bash -c "grep -E '^==========* ' /opt/solr/CHANGES.txt | head -n 1 | tr -d '= '")
|
|
||||||
echo "Solr version $changelog_version"
|
|
||||||
solr_version_from_tag=$(echo "$tag" | sed -e 's/^.*://' -e 's/-.*//')
|
|
||||||
|
|
||||||
if [[ $changelog_version != "$solr_version_from_tag" ]]; then
|
|
||||||
echo "Solr version mismatch"
|
|
||||||
container_cleanup "$container_name"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
container_cleanup "$container_name"
|
|
||||||
|
|
||||||
echo "Test $TEST_NAME $tag succeeded"
|
|
Loading…
Reference in New Issue