Skip to content

Commit

Permalink
Merge pull request #7 from IntershopCommunicationsAG/addtasks
Browse files Browse the repository at this point in the history
Addtasks
  • Loading branch information
m-raab authored Jun 29, 2020
2 parents e1ff478 + 7540eb4 commit 24ac20d
Show file tree
Hide file tree
Showing 13 changed files with 492 additions and 279 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -59,55 +61,117 @@ open class ICMDockerProjectPlugin : Plugin<Project> {

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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ open class Images @Inject constructor(objectFactory: ObjectFactory) {

val webadapteragent: Property<String> = objectFactory.property(String::class.java)

val solr: Property<String> = objectFactory.property(String::class.java)

val zookeeper: Property<String> = objectFactory.property(String::class.java)

val icmbase: Property<String> = objectFactory.property(String::class.java)

val mssqldb: Property<String> = objectFactory.property(String::class.java)
Expand Down
117 changes: 117 additions & 0 deletions src/main/kotlin/com/intershop/gradle/icm/docker/tasks/APullImage.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
/*
* 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)

@get:Input
abstract val image: Property<String>

/**
* 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<in DockerRegistryCredentials>?) {
action!!.execute(registryCredentials)
}

/**
* Set the credentials for the task.
*
* @param c closure with Docker registry credentials.
*/
fun registryCredentials(c: Closure<DockerRegistryCredentials>) {
ConfigureUtil.configure(c, registryCredentials)
}

@get:Option(option = "forcePull", description = "Call pull always also if the image is available.")
@get:Input
val force: Property<Boolean> = 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<in PullResponseItem>?): 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)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ open class DBPrepareTask: AbstractDockerRemoteApiTask() {
cleanDB.set("no")
cartridges.set("")
propertyKeys.set("")

group = "icm docker project"
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Loading

0 comments on commit 24ac20d

Please sign in to comment.