From c6526062a7960089e28eb1207f74b71b4b0bb40a Mon Sep 17 00:00:00 2001 From: Matthias Raab Date: Sun, 28 Jun 2020 19:06:15 +0200 Subject: [PATCH 1/2] Add tasks for solr, add task group, externalize task implementation --- .../icm/docker/ICMDockerProjectPlugin.kt | 136 +++++++++++++----- .../gradle/icm/docker/extension/Images.kt | 4 + .../gradle/icm/docker/tasks/APullImage.kt | 116 +++++++++++++++ .../gradle/icm/docker/tasks/DBPrepareTask.kt | 2 + .../docker/tasks/ISHUnitHTMLTestReportTask.kt | 4 + .../gradle/icm/docker/tasks/ISHUnitTask.kt | 4 + .../gradle/icm/docker/tasks/PullExtraImage.kt | 92 +----------- .../gradle/icm/docker/tasks/PullImage.kt | 84 +---------- .../icm/docker/utils/DatabaseTaskPreparer.kt | 54 ++----- ...ainerPreparer.kt => ServerTaskPreparer.kt} | 62 ++++---- .../icm/docker/utils/SolrCloudPreparer.kt | 95 ++++++++++++ .../icm/docker/utils/StandardTaskPreparer.kt | 78 ++++++++++ .../ICMDockerPluginIntegegrationSpec.groovy | 39 ++++- 13 files changed, 491 insertions(+), 279 deletions(-) create mode 100644 src/main/kotlin/com/intershop/gradle/icm/docker/tasks/APullImage.kt rename src/main/kotlin/com/intershop/gradle/icm/docker/utils/{ContainerPreparer.kt => ServerTaskPreparer.kt} (85%) create mode 100644 src/main/kotlin/com/intershop/gradle/icm/docker/utils/SolrCloudPreparer.kt create mode 100644 src/main/kotlin/com/intershop/gradle/icm/docker/utils/StandardTaskPreparer.kt diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/ICMDockerProjectPlugin.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/ICMDockerProjectPlugin.kt index 65e2195..7943f76 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/ICMDockerProjectPlugin.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/ICMDockerProjectPlugin.kt @@ -18,10 +18,12 @@ package com.intershop.gradle.icm.docker import com.intershop.gradle.icm.docker.extension.IntershopDockerExtension import com.intershop.gradle.icm.docker.tasks.ISHUnitTask -import com.intershop.gradle.icm.docker.utils.ContainerPreparer +import com.intershop.gradle.icm.docker.tasks.StartExtraContainerTask +import com.intershop.gradle.icm.docker.utils.ServerTaskPreparer import com.intershop.gradle.icm.docker.utils.DatabaseTaskPreparer import com.intershop.gradle.icm.docker.utils.ISHUnitTestRegistry -import com.intershop.gradle.icm.docker.utils.RunTaskPreparer +import com.intershop.gradle.icm.docker.utils.SolrCloudPreparer +import com.intershop.gradle.icm.docker.utils.StandardTaskPreparer import org.gradle.api.GradleException import org.gradle.api.Plugin import org.gradle.api.Project @@ -59,55 +61,117 @@ open class ICMDockerProjectPlugin : Plugin { addTestReportConfiguration(this) - val containerPreparer = ContainerPreparer(project, extension) + gradle.sharedServices.registerIfAbsent(ISHUNIT_REGISTRY, ISHUnitTestRegistry::class.java, { + it.maxParallelUsages.set(1) + }) - val removeContainerByName = containerPreparer.getRemoveContainerByName() - val pullImage = containerPreparer.getPullImage() - val baseContainer = containerPreparer.getBaseContainer(pullImage) - val startContainer = containerPreparer.getStartContainer(baseContainer) - val removeContainer = containerPreparer.getFinalizeContainer(startContainer) + val standardTaksPreparer = StandardTaskPreparer(project) + val startMSSQL = prepareDatabaseContainer(project, standardTaksPreparer, extension) - val runTaskPreparer = RunTaskPreparer(project) + prepareSolrCloudContainer(project, standardTaksPreparer, extension) + prepareBaseContainer(this, standardTaksPreparer, extension, startMSSQL) - val dbprepare = runTaskPreparer.getDBPrepareTask(baseContainer) - dbprepare.dependsOn(startContainer) - dbprepare.finalizedBy(removeContainer) + } + } + } - baseContainer.dependsOn(removeContainerByName) - startContainer.finalizedBy(removeContainer) + private fun prepareBaseContainer(project: Project, + taskPreparer: StandardTaskPreparer, + extension: IntershopDockerExtension, + startDatabase: StartExtraContainerTask) { - val dbTaskPreparer = DatabaseTaskPreparer(this, extension) - val pullMSSQL = dbTaskPreparer.getMSSQLPullTask() + val serverPreparer = ServerTaskPreparer(project, extension) - val startMSSQL = dbTaskPreparer.getMSSQLStartTask(pullMSSQL) - startMSSQL.dependsOn(pullMSSQL) + val removeContainerByName = taskPreparer.getRemoveTask( + ServerTaskPreparer.TASK_REMOVE, + ServerTaskPreparer.CONTAINER_EXTENSION) + val pullImage = taskPreparer.getBasePullTask( + ServerTaskPreparer.TASK_PULL, + extension.images.icmbase) - dbprepare.mustRunAfter(startMSSQL) - dbTaskPreparer.getMSSQLStopTask() - dbTaskPreparer.getMSSQLRemoveTask() + val baseContainer = serverPreparer.getBaseContainer(pullImage) + val startContainer = serverPreparer.getStartContainer(baseContainer) + val removeContainer = serverPreparer.getFinalizeContainer(startContainer) - gradle.sharedServices.registerIfAbsent(ISHUNIT_REGISTRY, ISHUnitTestRegistry::class.java, { - it.maxParallelUsages.set(1) - }) - val ishunitreport = runTaskPreparer.getISHUnitHTMLTestReportTask() + val dbprepare = serverPreparer.getDBPrepareTask(baseContainer) + dbprepare.dependsOn(startContainer) + dbprepare.finalizedBy(removeContainer) + dbprepare.mustRunAfter(startDatabase) + + baseContainer.dependsOn(removeContainerByName) + startContainer.finalizedBy(removeContainer) + + val ishunitreport = serverPreparer.getISHUnitHTMLTestReportTask() + + extension.ishUnitTests.all { + project.tasks.maybeCreate(it.name + ISHUNIT_TEST, ISHUnitTask::class.java).apply { + this.containerId.set(startContainer.containerId) + this.testCartridge.set(it.cartridge) + this.testSuite.set(it.testSuite) - extension.ishUnitTests.all { - tasks.maybeCreate(it.name + ISHUNIT_TEST, ISHUnitTask::class.java).apply { - this.containerId.set(startContainer.containerId) - this.testCartridge.set(it.cartridge) - this.testSuite.set(it.testSuite) + this.mustRunAfter(dbprepare) + this.finalizedBy(removeContainer) + this.dependsOn(startContainer) - this.mustRunAfter(dbprepare) - this.finalizedBy(removeContainer) - this.dependsOn(startContainer) - ishunitreport.dependsOn(this) - } - } + ishunitreport.dependsOn(this) } } } + private fun prepareDatabaseContainer(project: Project, + taskPreparer: StandardTaskPreparer, + extension: IntershopDockerExtension): StartExtraContainerTask { + + val dbTaskPreparer = DatabaseTaskPreparer(project, extension) + val pullMSSQL = taskPreparer.getPullTask( + DatabaseTaskPreparer.TASK_PULL, + extension.images.mssqldb) + taskPreparer.getStopTask( + DatabaseTaskPreparer.TASK_STOP, + DatabaseTaskPreparer.CONTAINER_EXTENSION, + extension.images.mssqldb) + taskPreparer.getRemoveTask( + DatabaseTaskPreparer.TASK_REMOVE, + DatabaseTaskPreparer.CONTAINER_EXTENSION) + + return dbTaskPreparer.getMSSQLStartTask(pullMSSQL) + } + + private fun prepareSolrCloudContainer(project: Project, + taskPreparer: StandardTaskPreparer, + extension: IntershopDockerExtension) { + val pullZK = taskPreparer.getPullTask( + SolrCloudPreparer.TASK_PULL_ZK, + extension.images.zookeeper) + val pullSolr = taskPreparer.getPullTask( + SolrCloudPreparer.TASK_PULL_SOLR, + extension.images.solr) + + val solrCloudTaskPreparer = SolrCloudPreparer(project, extension) + val zkStartTask = solrCloudTaskPreparer.getZKStartTask(pullZK) + val solrStartTask = solrCloudTaskPreparer.getSolrStartTask(pullSolr) + + solrStartTask.dependsOn(zkStartTask) + + val stopZK = taskPreparer.getStopTask( + SolrCloudPreparer.TASK_STOP_ZK, + SolrCloudPreparer.CONTAINER_EXTENSION_ZK, + extension.images.zookeeper) + val stopSolr = taskPreparer.getStopTask( + SolrCloudPreparer.TASK_STOP_SOLR, + SolrCloudPreparer.CONTAINER_EXTENSION_SOLR, + extension.images.solr) + stopZK.dependsOn(stopSolr) + + taskPreparer.getRemoveTask( + SolrCloudPreparer.TASK_REMOVE_ZK, + SolrCloudPreparer.CONTAINER_EXTENSION_ZK) + taskPreparer.getRemoveTask( + SolrCloudPreparer.TASK_REMOVE_SOLR, + SolrCloudPreparer.CONTAINER_EXTENSION_SOLR) + } + private fun addTestReportConfiguration(project: Project) { val configuration = project.configurations.maybeCreate(HTML_ANT_TESTREPORT_CONFIG) configuration diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/extension/Images.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/extension/Images.kt index b8aba5f..965aa85 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/extension/Images.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/extension/Images.kt @@ -29,6 +29,10 @@ open class Images @Inject constructor(objectFactory: ObjectFactory) { val webadapteragent: Property = objectFactory.property(String::class.java) + val solr: Property = objectFactory.property(String::class.java) + + val zookeeper: Property = objectFactory.property(String::class.java) + val icmbase: Property = objectFactory.property(String::class.java) val mssqldb: Property = objectFactory.property(String::class.java) diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/APullImage.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/APullImage.kt new file mode 100644 index 0000000..0795d88 --- /dev/null +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/APullImage.kt @@ -0,0 +1,116 @@ +/* + * Copyright 2020 Intershop Communications AG. + * + * Licensed 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. + * + */ +package com.intershop.gradle.icm.docker.tasks + +import com.bmuschko.gradle.docker.DockerRegistryCredentials +import com.bmuschko.gradle.docker.tasks.AbstractDockerRemoteApiTask +import com.bmuschko.gradle.docker.tasks.RegistryCredentialsAware +import com.github.dockerjava.api.command.PullImageResultCallback +import com.github.dockerjava.api.model.PullResponseItem +import groovy.lang.Closure +import org.gradle.api.Action +import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.options.Option +import org.gradle.util.ConfigureUtil +import javax.inject.Inject + +abstract class APullImage + @Inject constructor(objectFactory: ObjectFactory) : AbstractDockerRemoteApiTask(), RegistryCredentialsAware { + + private val registryCredentials: DockerRegistryCredentials = + objectFactory.newInstance(DockerRegistryCredentials::class.java) + + abstract val image: Property + + /** + * The target Docker registry credentials for usage with a task. + */ + override fun getRegistryCredentials(): DockerRegistryCredentials { + return registryCredentials + } + + /** + * Configures the target Docker registry credentials for use with a task. + * + * action + * 6.0.0 + */ + override fun registryCredentials(action: Action?) { + action!!.execute(registryCredentials) + } + + /** + * Set the credentials for the task. + * + * @param c closure with Docker registry credentials. + */ + fun registryCredentials(c: Closure) { + ConfigureUtil.configure(c, registryCredentials) + } + + @get:Option(option = "forcePull", description = "Call pull always also if the image is available.") + @get:Input + val force: Property = objectFactory.property(Boolean::class.java) + + init { + force.set(false) + } + + /** + * Executes the remote Docker command. + */ + override fun runRemoteCommand() { + with(project) { + logger.quiet("Pulling image '${image.get()}'.") + + var pull = true + + if(! force.get()) { + val listImagesCmd = dockerClient.listImagesCmd() + listImagesCmd.withImageNameFilter(image.get()) + val images = listImagesCmd.exec() + pull = images.size < 1 + } + + if(pull) { + val pullImageCmd = dockerClient.pullImageCmd(image.get()) + val authConfig = registryAuthLocator.lookupAuthConfig(image.get(), registryCredentials) + pullImageCmd.withAuthConfig(authConfig) + val callback = createCallback(nextHandler) + pullImageCmd.exec(callback).awaitCompletion() + } + } + } + + private fun createCallback(action: Action?): PullImageResultCallback { + return object: PullImageResultCallback() { + override fun onNext(item: PullResponseItem) { + if (action != null) { + try { + action.execute(item) + } catch ( e: Exception) { + logger.error("Failed to handle pull response", e) + return + } + } + super.onNext(item) + } + } + } +} diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/DBPrepareTask.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/DBPrepareTask.kt index 4f89e75..a3971fe 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/DBPrepareTask.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/DBPrepareTask.kt @@ -67,6 +67,8 @@ open class DBPrepareTask: AbstractDockerRemoteApiTask() { cleanDB.set("no") cartridges.set("") propertyKeys.set("") + + group = "icm docker project" } /** diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/ISHUnitHTMLTestReportTask.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/ISHUnitHTMLTestReportTask.kt index 3e5c88b..7b6fb7c 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/ISHUnitHTMLTestReportTask.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/ISHUnitHTMLTestReportTask.kt @@ -35,6 +35,10 @@ import javax.inject.Inject open class ISHUnitHTMLTestReportTask @Inject constructor(projectLayout: ProjectLayout, objectFactory: ObjectFactory) : DefaultTask() { + init { + group = "icm docker project" + } + @get:InputDirectory val testResultDirectory: DirectoryProperty = objectFactory.directoryProperty() diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/ISHUnitTask.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/ISHUnitTask.kt index 8b1fca6..02afaf7 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/ISHUnitTask.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/ISHUnitTask.kt @@ -42,6 +42,10 @@ import java.util.concurrent.TimeUnit */ open class ISHUnitTask : AbstractDockerRemoteApiTask() { + init { + group = "icm docker project" + } + /** * The ID or name of container used to perform operation. * The container for the provided ID has to be created first. diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/PullExtraImage.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/PullExtraImage.kt index f0b16fe..5e32ce5 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/PullExtraImage.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/PullExtraImage.kt @@ -17,102 +17,14 @@ package com.intershop.gradle.icm.docker.tasks -import com.bmuschko.gradle.docker.DockerRegistryCredentials -import com.bmuschko.gradle.docker.tasks.AbstractDockerRemoteApiTask -import com.bmuschko.gradle.docker.tasks.RegistryCredentialsAware -import com.github.dockerjava.api.command.PullImageResultCallback -import com.github.dockerjava.api.model.PullResponseItem -import groovy.lang.Closure -import org.gradle.api.Action import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.Property import org.gradle.api.tasks.Input -import org.gradle.api.tasks.options.Option -import org.gradle.util.ConfigureUtil import javax.inject.Inject open class PullExtraImage - @Inject constructor(objectFactory: ObjectFactory) : AbstractDockerRemoteApiTask(), RegistryCredentialsAware { + @Inject constructor(objectFactory: ObjectFactory) : APullImage(objectFactory) { - private val registryCredentials: DockerRegistryCredentials = - objectFactory.newInstance(DockerRegistryCredentials::class.java) - - @get:Input - val image: Property = objectFactory.property(String::class.java) - - /** - * The target Docker registry credentials for usage with a task. - */ - override fun getRegistryCredentials(): DockerRegistryCredentials { - return registryCredentials - } - - /** - * Configures the target Docker registry credentials for use with a task. - * - * action - * 6.0.0 - */ - override fun registryCredentials(action: Action?) { - action!!.execute(registryCredentials) - } - - /** - * Set the credentials for the task. - * - * @param c closure with Docker registry credentials. - */ - fun registryCredentials(c: Closure) { - ConfigureUtil.configure(c, registryCredentials) - } - - @get:Option(option = "forcePull", description = "Call pull always also if the image is available.") @get:Input - val force: Property = objectFactory.property(Boolean::class.java) - - init { - force.set(false) - } - - /** - * Executes the remote Docker command. - */ - override fun runRemoteCommand() { - with(project) { - logger.quiet("Pulling image '${image.get()}'.") - - var pull = true - - if(! force.get()) { - val listImagesCmd = dockerClient.listImagesCmd() - listImagesCmd.withImageNameFilter(image.get()) - val images = listImagesCmd.exec() - pull = images.size < 1 - } - - if(pull) { - val pullImageCmd = dockerClient.pullImageCmd(image.get()) - val authConfig = registryAuthLocator.lookupAuthConfig(image.get(), registryCredentials) - pullImageCmd.withAuthConfig(authConfig) - val callback = createCallback(nextHandler) - pullImageCmd.exec(callback).awaitCompletion() - } - } - } - - private fun createCallback(action: Action?): PullImageResultCallback { - return object: PullImageResultCallback() { - override fun onNext(item: PullResponseItem) { - if (action != null) { - try { - action.execute(item) - } catch ( e: Exception) { - logger.error("Failed to handle pull response", e) - return - } - } - super.onNext(item) - } - } - } + override val image: Property = objectFactory.property(String::class.java) } diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/PullImage.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/PullImage.kt index 9bcff5f..70135d9 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/PullImage.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/PullImage.kt @@ -34,89 +34,9 @@ import javax.inject.Inject * Task to pull an image. */ open class PullImage - @Inject constructor(objectFactory: ObjectFactory) : AbstractDockerRemoteApiTask(), RegistryCredentialsAware { - - private val registryCredentials: DockerRegistryCredentials = - objectFactory.newInstance(DockerRegistryCredentials::class.java) - + @Inject constructor(objectFactory: ObjectFactory) : APullImage(objectFactory) { @get:Option(option= "altImage", description = "Use an other image independent from the build configuration") @get:Input - val image: Property = objectFactory.property(String::class.java) - - @get:Option(option = "forcePull", description = "Call pull always also if the image is available.") - @get:Input - val force: Property = objectFactory.property(Boolean::class.java) - - /** - * The target Docker registry credentials for usage with a task. - */ - override fun getRegistryCredentials(): DockerRegistryCredentials { - return registryCredentials - } - - /** - * Configures the target Docker registry credentials for use with a task. - * - * action - * 6.0.0 - */ - override fun registryCredentials(action: Action?) { - action!!.execute(registryCredentials) - } - - /** - * Set the credentials for the task. - * - * @param c closure with Docker registry credentials. - */ - fun registryCredentials(c: Closure) { - ConfigureUtil.configure(c, registryCredentials) - } - - init { - force.set(false) - } - - /** - * Executes the remote Docker command. - */ - override fun runRemoteCommand() { - with(project) { - logger.quiet("Pulling image '${image.get()}'.") - - var pull = true - - if(! force.get()) { - val listImagesCmd = dockerClient.listImagesCmd() - listImagesCmd.withImageNameFilter(image.get()) - val images = listImagesCmd.exec() - pull = images.size < 1 - } - - if(pull) { - val pullImageCmd = dockerClient.pullImageCmd(image.get()) - val authConfig = registryAuthLocator.lookupAuthConfig(image.get(), registryCredentials) - pullImageCmd.withAuthConfig(authConfig) - val callback = createCallback(nextHandler) - pullImageCmd.exec(callback).awaitCompletion() - } - } - } - - private fun createCallback(action: Action?): PullImageResultCallback { - return object: PullImageResultCallback() { - override fun onNext(item: PullResponseItem) { - if (action != null) { - try { - action.execute(item) - } catch ( e: Exception) { - logger.error("Failed to handle pull response", e) - return - } - } - super.onNext(item) - } - } - } + override val image: Property = objectFactory.property(String::class.java) } diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/DatabaseTaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/DatabaseTaskPreparer.kt index 8e599cf..51d0e5b 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/DatabaseTaskPreparer.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/DatabaseTaskPreparer.kt @@ -17,6 +17,7 @@ package com.intershop.gradle.icm.docker.utils import com.intershop.gradle.icm.docker.extension.IntershopDockerExtension +import com.intershop.gradle.icm.docker.tasks.APullImage import com.intershop.gradle.icm.docker.tasks.PullExtraImage import com.intershop.gradle.icm.docker.tasks.RemoveContainerByName import com.intershop.gradle.icm.docker.tasks.StartExtraContainerTask @@ -27,35 +28,27 @@ class DatabaseTaskPreparer(val project: Project, private val dockerExtension: IntershopDockerExtension) { companion object { - const val TASK_PULL_MSSQLDB = "pullMSSQL" - const val TASK_START_MSSQLDB = "startMSSQL" - const val TASK_STOP_MSSQLDB = "stopMSSQL" - const val TASK_REMOVE_MSSQLDB = "removeMSSQL" - } - - fun getMSSQLPullTask(): PullExtraImage { - return with(project) { - tasks.maybeCreate( - TASK_PULL_MSSQLDB, - PullExtraImage::class.java).apply { - this.image.set(dockerExtension.images.mssqldb) + const val TASK_PULL = "pullMSSQL" + const val TASK_START = "startMSSQL" + const val TASK_STOP = "stopMSSQL" + const val TASK_REMOVE = "removeMSSQL" - this.onlyIf { dockerExtension.images.mssqldb.isPresent } - } - } + const val CONTAINER_EXTENSION = "mssql" } - fun getMSSQLStartTask(image: PullExtraImage): StartExtraContainerTask { + + fun getMSSQLStartTask(image: APullImage): StartExtraContainerTask { return with(project) { tasks.maybeCreate( - TASK_START_MSSQLDB, + TASK_START, StartExtraContainerTask::class.java).apply { + group = "icm docker project" attachStderr.set(true) attachStdout.set(true) targetImageId(image.image) - containerName.set("${project.name.toLowerCase()}-mssql") + containerName.set("${project.name.toLowerCase()}-${CONTAINER_EXTENSION}") with(dockerExtension.developmentConfig) { hostConfig.portBindings.set( @@ -80,30 +73,7 @@ class DatabaseTaskPreparer(val project: Project, )) } - this.onlyIf { dockerExtension.images.mssqldb.isPresent } - } - } - } - - fun getMSSQLStopTask(): StopExtraContainerTask { - return with(project) { - tasks.maybeCreate( - TASK_STOP_MSSQLDB, - StopExtraContainerTask::class.java).apply { - containerName.set("${project.name.toLowerCase()}-mssql") - - this.onlyIf { dockerExtension.images.mssqldb.isPresent } - } - } - } - - fun getMSSQLRemoveTask(): RemoveContainerByName { - return with(project) { - tasks.maybeCreate( - TASK_REMOVE_MSSQLDB, - RemoveContainerByName::class.java).apply { - containerName.set("${project.name.toLowerCase()}-mssql") - + dependsOn(image) this.onlyIf { dockerExtension.images.mssqldb.isPresent } } } diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/ContainerPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/ServerTaskPreparer.kt similarity index 85% rename from src/main/kotlin/com/intershop/gradle/icm/docker/utils/ContainerPreparer.kt rename to src/main/kotlin/com/intershop/gradle/icm/docker/utils/ServerTaskPreparer.kt index 452682a..c93a271 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/ContainerPreparer.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/ServerTaskPreparer.kt @@ -20,6 +20,9 @@ import com.bmuschko.gradle.docker.tasks.container.DockerCreateContainer import com.bmuschko.gradle.docker.tasks.container.DockerRemoveContainer import com.bmuschko.gradle.docker.tasks.container.DockerStartContainer import com.intershop.gradle.icm.docker.extension.IntershopDockerExtension +import com.intershop.gradle.icm.docker.tasks.APullImage +import com.intershop.gradle.icm.docker.tasks.DBPrepareTask +import com.intershop.gradle.icm.docker.tasks.ISHUnitHTMLTestReportTask import com.intershop.gradle.icm.docker.tasks.PullImage import com.intershop.gradle.icm.docker.tasks.RemoveContainerByName import org.gradle.api.Project @@ -31,13 +34,13 @@ import java.io.File /** * Provides methods to configure container related tasks. */ -class ContainerPreparer(val project: Project, private val dockerExtension: IntershopDockerExtension) { +class ServerTaskPreparer(val project: Project, private val dockerExtension: IntershopDockerExtension) { companion object { - const val TASK_PULLBASEIMAGE = "pullImage" + const val TASK_PULL = "pullImage" const val TASK_CREATECONTAINER = "createContainer" const val TASK_STARTCONTAINER = "startContainer" - const val TASK_REMOVECONTAINER = "removeContainer" + const val TASK_REMOVE = "removeContainer" const val TASK_FINALIZECONTAINER = "finalizeContainer" const val SERVERLOGS = "serverlogs" @@ -52,6 +55,11 @@ class ContainerPreparer(val project: Project, private val dockerExtension: Inter const val TASK_CREATECONFIG = "createConfig" const val TASK_CREATECLUSTERID = "createClusterID" const val TASK_COPYLIBS = "copyLibs" + + const val TASK_DBPREPARE = "dbPrepare" + const val TASK_ISHUNIT_REPORT = "ishUnitTestReport" + + const val CONTAINER_EXTENSION = "container" } private val addDirectories: Map> by lazy { @@ -61,25 +69,12 @@ class ContainerPreparer(val project: Project, private val dockerExtension: Inter ) } - /** - * Get pull image task. - */ - fun getPullImage(): PullImage { - return with(project) { - tasks.maybeCreate( - TASK_PULLBASEIMAGE, - PullImage::class.java).apply { - this.image.set(dockerExtension.images.icmbase) - } - } - } - /** * Creates base container. * * @param pullImage pull image task. */ - fun getBaseContainer(pullImage: PullImage): DockerCreateContainer { + fun getBaseContainer(pullImage: APullImage): DockerCreateContainer { return with(project) { val dirprep = tasks.maybeCreate( "dirPreparer").apply { @@ -151,17 +146,6 @@ class ContainerPreparer(val project: Project, private val dockerExtension: Inter } } - /** - * Remove base container. - */ - fun getRemoveContainerByName(): RemoveContainerByName { - return with(project) { - tasks.maybeCreate(TASK_REMOVECONTAINER, RemoveContainerByName::class.java).apply { - containerName.set("${project.name.toLowerCase()}-container") - } - } - } - /** * Configures remove container. * @@ -178,6 +162,28 @@ class ContainerPreparer(val project: Project, private val dockerExtension: Inter } } + /** + * Return a configured dbinit task. + * + * @param containertask task that creates the container. + */ + fun getDBPrepareTask(containertask: DockerCreateContainer): DBPrepareTask { + return with(project) { + tasks.maybeCreate(RunTaskPreparer.TASK_DBPREPARE, DBPrepareTask::class.java).apply { + containerId.set(containertask.containerId) + } + } + } + + /** + * Returns a task to create a HTML report from tes results. + */ + fun getISHUnitHTMLTestReportTask(): ISHUnitHTMLTestReportTask { + return with(project) { + tasks.maybeCreate(RunTaskPreparer.TASK_ISHUNIT_REPORT, ISHUnitHTMLTestReportTask::class.java) + } + } + private fun getOutputDirFor(taskName: String): File { val task = project.tasks.findByName(taskName) ?: throw GradleException("Task name '${taskName}' not found in project.") diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/SolrCloudPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/SolrCloudPreparer.kt new file mode 100644 index 0000000..cb11287 --- /dev/null +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/SolrCloudPreparer.kt @@ -0,0 +1,95 @@ +/* + * Copyright 2020 Intershop Communications AG. + * + * Licensed 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. + * + */ + +package com.intershop.gradle.icm.docker.utils + +import com.intershop.gradle.icm.docker.extension.IntershopDockerExtension +import com.intershop.gradle.icm.docker.tasks.APullImage +import com.intershop.gradle.icm.docker.tasks.StartExtraContainerTask +import org.gradle.api.Project + +class SolrCloudPreparer(val project: Project, + private val dockerExtension: IntershopDockerExtension) { + + companion object { + const val TASK_PULL_ZK = "pullZK" + const val TASK_PULL_SOLR = "pullSolr" + const val TASK_START_ZK = "startZK" + const val TASK_START_SOLR = "startSolr" + const val TASK_STOP_ZK = "stopZK" + const val TASK_STOP_SOLR = "stopSolr" + const val TASK_REMOVE_ZK = "removeZK" + const val TASK_REMOVE_SOLR = "removeSolr" + + const val CONTAINER_EXTENSION_ZK = "zk" + const val CONTAINER_EXTENSION_SOLR = "solr" + } + + fun getZKStartTask(image: APullImage): StartExtraContainerTask { + return with(project) { + tasks.maybeCreate( + TASK_START_ZK, + StartExtraContainerTask::class.java).apply { + dependsOn(image) + + group = "icm docker project" + attachStderr.set(true) + attachStdout.set(true) + + targetImageId(image.image) + + containerName.set("${project.name.toLowerCase()}-${CONTAINER_EXTENSION_ZK}") + + hostConfig.portBindings.set( + listOf("2181:2188")) + hostConfig.autoRemove.set(true) + + envVars.set(mutableMapOf( + "ZOO_MY_ID" to "1", + "ZOO_PORT" to "2181" , + "ZOO_SERVERS" to "server.1=zoo-1:2888:3888")) + } + } + } + + fun getSolrStartTask(image: APullImage): StartExtraContainerTask { + return with(project) { + tasks.maybeCreate( + TASK_START_SOLR, + StartExtraContainerTask::class.java).apply { + dependsOn(image) + + group = "icm docker project" + attachStderr.set(true) + attachStdout.set(true) + + targetImageId(image.image) + + containerName.set("${project.name.toLowerCase()}-${CONTAINER_EXTENSION_SOLR}") + + hostConfig.portBindings.set( + listOf("8983:8983")) + hostConfig.autoRemove.set(true) + + envVars.set(mutableMapOf( + "SOLR_PORT" to "8983", + "ZK_HOST" to "${project.name.toLowerCase()}-${CONTAINER_EXTENSION_ZK}:2181" , + "SOLR_HOST" to "${project.name.toLowerCase()}-${CONTAINER_EXTENSION_SOLR}")) + } + } + } +} diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/StandardTaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/StandardTaskPreparer.kt new file mode 100644 index 0000000..ad03442 --- /dev/null +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/StandardTaskPreparer.kt @@ -0,0 +1,78 @@ +/* + * Copyright 2020 Intershop Communications AG. + * + * Licensed 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. + * + */ + +package com.intershop.gradle.icm.docker.utils + +import com.intershop.gradle.icm.docker.tasks.APullImage +import com.intershop.gradle.icm.docker.tasks.PullExtraImage +import com.intershop.gradle.icm.docker.tasks.PullImage +import com.intershop.gradle.icm.docker.tasks.RemoveContainerByName +import com.intershop.gradle.icm.docker.tasks.StopExtraContainerTask +import org.gradle.api.Project +import org.gradle.api.provider.Provider + +class StandardTaskPreparer(val project: Project) { + + fun getPullTask(taskname: String, imageProvider: Provider): APullImage{ + return with(project) { + tasks.maybeCreate( taskname, PullExtraImage::class.java ).apply { + this.image.set(imageProvider) + + this.onlyIf { imageProvider.isPresent } + } + } + } + + fun getBasePullTask(taskname: String, imageProvider: Provider): APullImage{ + return with(project) { + tasks.maybeCreate( taskname, PullImage::class.java ).apply { + this.image.set(imageProvider) + + this.onlyIf { imageProvider.isPresent } + } + } + } + + fun getStopTask(taskname: String, + containerext: String, + imageProvider: Provider): StopExtraContainerTask { + return with(project) { + tasks.maybeCreate( taskname, StopExtraContainerTask::class.java ).apply { + group = "icm docker project" + containerName.set("${project.name.toLowerCase()}-${containerext}") + + this.onlyIf { imageProvider.isPresent } + } + } + } + + + fun getRemoveTask(taskname: String, containerext: String): RemoveContainerByName { + with(project) { + val cleanTask = tasks.findByName("clean") + + return tasks.maybeCreate( taskname, RemoveContainerByName::class.java ).apply { + group = "icm docker project" + containerName.set("${project.name.toLowerCase()}-${containerext}") + + if(cleanTask != null) { + cleanTask.dependsOn(this) + } + } + } + } +} diff --git a/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerPluginIntegegrationSpec.groovy b/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerPluginIntegegrationSpec.groovy index 6c43a7a..ebaeaf4 100644 --- a/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerPluginIntegegrationSpec.groovy +++ b/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerPluginIntegegrationSpec.groovy @@ -167,6 +167,9 @@ class ICMDockerPluginIntegegrationSpec extends AbstractIntegrationGroovySpec { images { icmbase = 'intershopmock/icm-as-mock:latest' mssqldb = 'mcr.microsoft.com/mssql/server:2019-CU4-ubuntu-16.04' + + solr = 'solr:8.5.2-slim' + zookeeper = 'zookeeper:3.6.1' } ishUnitTests { @@ -710,7 +713,41 @@ class ICMDockerPluginIntegegrationSpec extends AbstractIntegrationGroovySpec { .build() then: - result3.task(":removeMSSQL").outcome == SKIPPED + result3.task(":removeMSSQL").outcome == SUCCESS + + where: + gradleVersion << supportedGradleVersions + } + + def 'run solrcloud'() { + prepareDefaultBuildConfig(testProjectDir, settingsFile, buildFile) + + when: + def result1 = getPreparedGradleRunner() + .withArguments("startSolr", "-s", "-i") + .withGradleVersion(gradleVersion) + .build() + + then: + result1.task(":startSolr").outcome == SUCCESS + + when: + def result2 = getPreparedGradleRunner() + .withArguments("stopZK", "-s", "-i") + .withGradleVersion(gradleVersion) + .build() + + then: + result2.task(":stopZK").outcome == SUCCESS + + when: + def result3 = getPreparedGradleRunner() + .withArguments("removeSolr", "-s", "-i") + .withGradleVersion(gradleVersion) + .build() + + then: + result3.task(":removeSolr").outcome == SUCCESS where: gradleVersion << supportedGradleVersions From 7540eb49ae671b1789b4b56defb964b26f2a5f1a Mon Sep 17 00:00:00 2001 From: Matthias Raab Date: Sun, 28 Jun 2020 19:18:03 +0200 Subject: [PATCH 2/2] Update task configuration --- .../kotlin/com/intershop/gradle/icm/docker/tasks/APullImage.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/APullImage.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/APullImage.kt index 0795d88..8d7e711 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/APullImage.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/APullImage.kt @@ -36,6 +36,7 @@ abstract class APullImage private val registryCredentials: DockerRegistryCredentials = objectFactory.newInstance(DockerRegistryCredentials::class.java) + @get:Input abstract val image: Property /**