diff --git a/build.gradle.kts b/build.gradle.kts index 0a48a38..067db8f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -23,7 +23,8 @@ plugins { // project plugins `java-gradle-plugin` groovy - kotlin("jvm") version "1.6.21" + + kotlin("jvm") version "1.7.10" // test coverage jacoco @@ -44,13 +45,13 @@ plugins { id("org.asciidoctor.jvm.convert") version "3.3.2" // documentation - id("org.jetbrains.dokka") version "1.4.32" + id("org.jetbrains.dokka") version "1.5.0" // code analysis for kotlin - id("io.gitlab.arturbosch.detekt") version "1.17.1" + id("io.gitlab.arturbosch.detekt") version "1.18.0" // plugin for publishing to Gradle Portal - id("com.gradle.plugin-publish") version "0.15.0" + id("com.gradle.plugin-publish") version "1.0.0" } scm { @@ -64,11 +65,63 @@ version = scm.version.version val sonatypeUsername: String by project val sonatypePassword: String? by project +repositories { + mavenLocal() + mavenCentral() + gradlePluginPortal() +} + +gradlePlugin { + plugins { + create("icmDockerPlugin") { + id = "com.intershop.gradle.icm.docker" + implementationClass = "com.intershop.gradle.icm.docker.ICMDockerPlugin" + displayName = "icm-docker-plugin" + description = "This ICM plugin contains Docker ICM integration." + } + create("icmDockerTestProjectPlugin") { + id = "com.intershop.gradle.icm.docker.test" + implementationClass = "com.intershop.gradle.icm.docker.ICMTestDockerPlugin" + displayName = "icm-docker-test-plugin" + description = "This ICM plugin contains special Docker tasks for special test container." + } + create("icmDockerReadmePlugin") { + id = "com.intershop.gradle.icm.docker.readmepush" + implementationClass = "com.intershop.gradle.icm.docker.ICMDockerReadmePushPlugin" + displayName = "icm-readmepush-plugin" + description = "This ICM plugin integrates tasks to readme files to Dockerhub." + } + create("icmDockerCustomizationPlugin") { + id = "com.intershop.gradle.icm.docker.customization" + implementationClass = "com.intershop.gradle.icm.docker.ICMDockerCustomizationPlugin" + displayName = "icm-docker-customization-plugin" + description = "This ICM plugin integrate Docker tasks to an ICM customization project." + } + create("icmSolrCloudPlugin") { + id = "com.intershop.gradle.icm.docker.solrcloud" + implementationClass = "com.intershop.gradle.icm.docker.ICMSolrCloudPlugin" + displayName = "icm-solrlcloud-plugin" + description = "This ICM plugin integrates tasks to maintain a ICM project." + } + create("icmGebTestPlugin") { + id = "com.intershop.gradle.icm.docker.gebtest" + implementationClass = "com.intershop.gradle.icm.docker.ICMGebTestPlugin" + displayName = "icm-gebtest-plugin" + description = "This ICM plugin integrates tasks to handle Geb Tests in a ICM project." + } + } +} + +pluginBundle { + val pluginURL = "https://github.com/IntershopCommunicationsAG/${project.name}" + website = pluginURL + vcsUrl = pluginURL + tags = listOf("intershop", "build", "icm", "docker") +} + java { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 - - withSourcesJar() } // set correct project status @@ -77,7 +130,7 @@ if (project.version.toString().endsWith("-SNAPSHOT")) { } detekt { - input = files("src/main/kotlin") + source = files("src/main/kotlin") config = files("detekt.yml") } @@ -93,7 +146,7 @@ tasks { } withType().configureEach { - systemProperty("intershop.gradle.versions", "7.2") + systemProperty("intershop.gradle.versions", "7.5.1") testLogging { showStandardStreams = true @@ -103,7 +156,7 @@ tasks { dependsOn("jar") } - val copyAsciiDoc = register("copyAsciiDoc") { + register("copyAsciiDoc") { includeEmptyDirs = false val outputDir = file("$buildDir/tmp/asciidoctorSrc") @@ -124,7 +177,7 @@ tasks { } withType { - dependsOn(copyAsciiDoc) + dependsOn("copyAsciiDoc") setSourceDir(file("$buildDir/tmp/asciidoctorSrc")) sources(delegateClosureOf { @@ -167,65 +220,22 @@ tasks { outputDirectory.set(buildDir.resolve("dokka")) } - register("javaDoc") { - dependsOn(dokkaJavadoc) - from(dokkaJavadoc) - archiveClassifier.set("javadoc") - } -} - -gradlePlugin { - plugins { - create("icmDockerPlugin") { - id = "com.intershop.gradle.icm.docker" - implementationClass = "com.intershop.gradle.icm.docker.ICMDockerPlugin" - displayName = "icm-docker-plugin" - description = "This ICM plugin contains Docker ICM integration." - } - create("icmDockerTestProjectPlugin") { - id = "com.intershop.gradle.icm.docker.test" - implementationClass = "com.intershop.gradle.icm.docker.ICMDockerTestPlugin" - displayName = "icm-docker-test-plugin" - description = "This ICM plugin contains special Docker tasks for special test container." - } - create("icmDockerReadmePlugin") { - id = "com.intershop.gradle.icm.docker.readmepush" - implementationClass = "com.intershop.gradle.icm.docker.ICMDockerReadmePushPlugin" - displayName = "icm-readmepush-plugin" - description = "This ICM plugin integrates tasks to readme files to Dockerhub." - } - create("icmDockerProjectPlugin") { - id = "com.intershop.gradle.icm.docker.project" - implementationClass = "com.intershop.gradle.icm.docker.ICMDockerProjectPlugin" - displayName = "icm-docker-project-plugin" - description = "This ICM plugin integrate Docker tasks to an ICM project." - } - create("icmDockerCustomizationPlugin") { - id = "com.intershop.gradle.icm.docker.customization" - implementationClass = "com.intershop.gradle.icm.docker.ICMDockerCustomizationPlugin" - displayName = "icm-docker-customization-plugin" - description = "This ICM plugin integrate Docker tasks to an ICM customization project." + withType { + val sign = this + withType { + this.dependsOn(sign) } - create("icmSolrCloudPlugin") { - id = "com.intershop.gradle.icm.docker.solrcloud" - implementationClass = "com.intershop.gradle.icm.docker.ICMSolrCloudPlugin" - displayName = "icm-solrlcloud-plugin" - description = "This ICM plugin integrates tasks to maintain a ICM project." - } - create("icmGebTestPlugin") { - id = "com.intershop.gradle.icm.docker.gebtest" - implementationClass = "com.intershop.gradle.icm.docker.ICMGebTestPlugin" - displayName = "icm-gebtest-plugin" - description = "This ICM plugin integrates tasks to handle Geb Tests in a ICM project." + withType { + this.dependsOn(sign) } } -} -pluginBundle { - val pluginURL = "https://github.com/IntershopCommunicationsAG/${project.name}" - website = pluginURL - vcsUrl = pluginURL - tags = listOf("intershop", "gradle", "plugin", "build", "icm", "docker") + afterEvaluate { + getByName("javadocJar") { + dependsOn(dokkaJavadoc) + from(dokkaJavadoc) + } + } } publishing { @@ -233,8 +243,6 @@ publishing { create("intershopMvn", MavenPublication::class.java) { from(components["java"]) - artifact(tasks.getByName("javaDoc")) - artifact(File(buildDir, "docs/asciidoc/html5/README.html")) { classifier = "reference" } @@ -297,18 +305,11 @@ dependencies { implementation(gradleKotlinDsl()) implementation("org.apache.solr:solr-solrj:8.11.2") - implementation("com.bmuschko:gradle-docker-plugin:7.1.0") - implementation("com.intershop.gradle.icm:icm-gradle-plugin:5.5.1") + implementation("com.bmuschko:gradle-docker-plugin:8.1.0") + implementation("com.intershop.gradle.icm:icm-gradle-plugin:5.6.0") implementation("com.intershop.gradle.jobrunner:icmjobrunner:1.0.5") - testImplementation("com.intershop.gradle.test:test-gradle-plugin:4.1.1") + testImplementation("com.intershop.gradle.test:test-gradle-plugin:4.1.2") testImplementation(gradleTestKit()) } -repositories { - mavenLocal() - mavenCentral() - maven { - url = uri("https://plugins.gradle.org/m2/") - } -} diff --git a/detekt.yml b/detekt.yml index f50943d..9907499 100644 --- a/detekt.yml +++ b/detekt.yml @@ -2,10 +2,10 @@ build: maxIssues: 0 excludeCorrectable: false weights: - # complexity: 2 - # LongParameterList: 1 - # style: 1 - # comments: 1 + # complexity: 2 + # LongParameterList: 1 + # style: 1 + # comments: 1 config: validation: true @@ -25,15 +25,14 @@ processors: console-reports: active: true exclude: - - 'ProjectStatisticsReport' - - 'ComplexityReport' - - 'NotificationReport' - # - 'FindingsReport' - - 'FileBasedFindingsReport' + - 'ProjectStatisticsReport' + - 'ComplexityReport' + - 'NotificationReport' + # - 'FindingsReport' + - 'FileBasedFindingsReport' comments: active: true - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] AbsentOrWrongFileLicense: active: false licenseTemplateFile: 'license.template' @@ -105,7 +104,7 @@ complexity: active: true excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] thresholdInFiles: 15 - thresholdInClasses: 15 + thresholdInClasses: 40 thresholdInInterfaces: 15 thresholdInObjects: 15 thresholdInEnums: 15 @@ -175,10 +174,10 @@ exceptions: SwallowedException: active: false ignoredExceptionTypes: - - InterruptedException - - NumberFormatException - - ParseException - - MalformedURLException + - InterruptedException + - NumberFormatException + - ParseException + - MalformedURLException allowedExceptionNameRegex: '_|(ignore|expected).*' ThrowingExceptionFromFinally: active: false @@ -187,31 +186,31 @@ exceptions: ThrowingExceptionsWithoutMessageOrCause: active: false exceptions: - - IllegalArgumentException - - IllegalStateException - - IOException + - IllegalArgumentException + - IllegalStateException + - IOException ThrowingNewInstanceOfSameException: active: false TooGenericExceptionCaught: active: false excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] exceptionNames: - - ArrayIndexOutOfBoundsException - - Error - - Exception - - IllegalMonitorStateException - - NullPointerException - - IndexOutOfBoundsException - - RuntimeException - - Throwable + - ArrayIndexOutOfBoundsException + - Error + - Exception + - IllegalMonitorStateException + - NullPointerException + - IndexOutOfBoundsException + - RuntimeException + - Throwable allowedExceptionNameRegex: '_|(ignore|expected).*' TooGenericExceptionThrown: active: true exceptionNames: - - Error - - Exception - - Throwable - - RuntimeException + - Error + - Exception + - Throwable + - RuntimeException formatting: active: true @@ -570,7 +569,7 @@ style: excludeReturnFromLambda: true excludeGuardClauses: false SafeCast: - active: false + active: true SerialVersionUIDInSerializableClass: active: false SpacingBetweenPackageAndImports: diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180..249e583 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a0f7639..ae04661 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 1b6c787..a69d9cb 100755 --- a/gradlew +++ b/gradlew @@ -205,6 +205,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index 107acd3..f127cfd 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +75,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/ICMDockerCustomizationPlugin.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/ICMDockerCustomizationPlugin.kt index 6daa59e..ad8ddd3 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/ICMDockerCustomizationPlugin.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/ICMDockerCustomizationPlugin.kt @@ -23,15 +23,11 @@ import com.intershop.gradle.icm.docker.tasks.ISHUnitHTMLTestReport import com.intershop.gradle.icm.docker.tasks.ISHUnitTest import com.intershop.gradle.icm.docker.tasks.PrepareNetwork import com.intershop.gradle.icm.docker.tasks.StartExtraContainer -import com.intershop.gradle.icm.docker.tasks.utils.ContainerEnvironment -import com.intershop.gradle.icm.docker.utils.Configuration import com.intershop.gradle.icm.docker.utils.CustomizationImageBuildPreparer import com.intershop.gradle.icm.docker.utils.ISHUnitTestRegistry -import com.intershop.gradle.icm.docker.utils.appserver.ContainerTaskPreparer -import com.intershop.gradle.icm.docker.utils.appserver.CustomServerTaskPreparer -import com.intershop.gradle.icm.docker.utils.appserver.TestContainerTaskPreparer +import com.intershop.gradle.icm.docker.utils.appsrv.AbstractASTaskPreparer import com.intershop.gradle.icm.docker.utils.network.TaskPreparer -import com.intershop.gradle.icm.docker.utils.solrcloud.StartSolrCloudTask +import com.intershop.gradle.icm.docker.utils.appsrv.TaskPreparer as AppSrvPreparer import com.intershop.gradle.icm.docker.utils.webserver.WATaskPreparer import org.gradle.api.GradleException import org.gradle.api.Plugin @@ -63,6 +59,10 @@ open class ICMDockerCustomizationPlugin : Plugin { const val ISHUNIT_REGISTRY = "ishUnitTestTegistry" const val HTML_ANT_TESTREPORT_CONFIG = "junitXmlToHtml" const val ISHUNIT_TEST = "ISHUnitTest" + + const val TASK_START_SERVER = "startServer" + const val TASK_STOP_SERVER = "stopServer" + const val TASK_REMOVE_SERVER = "removeServer" } /** @@ -74,10 +74,10 @@ open class ICMDockerCustomizationPlugin : Plugin { with(project) { if (project.rootProject == this) { logger.info("ICM Docker build plugin for customizations will be initialized") - // docker tasks required - plugins.apply(ICMDockerPlugin::class.java) // project tasks required plugins.apply(ICMProjectPlugin::class.java) + // docker tasks required + plugins.apply(ICMDockerPlugin::class.java) val dockerExtension = extensions.findByType( IntershopDockerExtension::class.java @@ -94,27 +94,24 @@ open class ICMDockerCustomizationPlugin : Plugin { "start${com.intershop.gradle.icm.docker.utils.mail.TaskPreparer.extName}", StartExtraContainer::class.java) val startSolrCloud = tasks.named( - "start${com.intershop.gradle.icm.docker.utils.solrcloud.TaskPreparer.TASK_EXT_SERVER}", - StartSolrCloudTask::class.java) + "start${com.intershop.gradle.icm.docker.utils.solrcloud.TaskPreparer.TASK_EXT_SERVER}") val prepareNetwork = project.tasks.named(TaskPreparer.PREPARE_NETWORK, PrepareNetwork::class.java) - val containerPreparer = ContainerTaskPreparer(project, prepareNetwork) - val testContainerPreparer = TestContainerTaskPreparer(project, prepareNetwork) - val appServerPreparer = CustomServerTaskPreparer(project, prepareNetwork, startSolrCloud, mailSrvTask) - val startAS = appServerPreparer.startTask + + val appSrvPreparer = AppSrvPreparer(project, prepareNetwork) + val containerPreparer = appSrvPreparer.getContainerTaskPreparer() + try { tasks.named("containerClean").configure { - it.dependsOn( - containerPreparer.removeTask, - testContainerPreparer.removeTask, - appServerPreparer.removeTask, - ) + it.dependsOn( containerPreparer.removeTask, + appSrvPreparer.getServerTaskPreparer().removeTask) } } catch (ex: UnknownTaskException) { logger.info("Task containerClean is not available.") } - startAS.configure { + val asStartTask = appSrvPreparer.getServerTaskPreparer().startTask + asStartTask.configure { it.mustRunAfter(startSolrCloud) it.mustRunAfter(mailSrvTask) } @@ -123,25 +120,25 @@ open class ICMDockerCustomizationPlugin : Plugin { val startWS = tasks.named( "start${com.intershop.gradle.icm.docker.utils.webserver.TaskPreparer.TASK_EXT_SERVER}") - tasks.register(ICMDockerProjectPlugin.TASK_START_SERVER) { task -> + tasks.register(TASK_START_SERVER) { task -> task.group = ICMDockerPlugin.GROUP_SERVERBUILD task.description = "Start app server container with webserver containers" task.dependsOn(startWS) - task.dependsOn(startAS) + task.dependsOn(asStartTask) } startWS.configure { - it.mustRunAfter(startAS) + it.mustRunAfter(asStartTask) } startWA.configure { - it.mustRunAfter(startAS) + it.mustRunAfter(asStartTask) } val stopWS = tasks.named( "stop${com.intershop.gradle.icm.docker.utils.webserver.TaskPreparer.TASK_EXT_SERVER}") - tasks.register(ICMDockerProjectPlugin.TASK_STOP_SERVER) { task -> + tasks.register(TASK_STOP_SERVER) { task -> task.group = ICMDockerPlugin.GROUP_SERVERBUILD task.description = "Stop app server container and webserver containers" task.dependsOn(containerPreparer.stopTask, stopWS) @@ -150,25 +147,29 @@ open class ICMDockerCustomizationPlugin : Plugin { val removeWS = tasks.named( "remove${com.intershop.gradle.icm.docker.utils.webserver.TaskPreparer.TASK_EXT_SERVER}") - tasks.register(ICMDockerProjectPlugin.TASK_REMOVE_SERVER) { task -> + tasks.register(TASK_REMOVE_SERVER) { task -> task.group = ICMDockerPlugin.GROUP_SERVERBUILD task.description = "Removes app server container and webserver containers" task.dependsOn(containerPreparer.removeTask, removeWS) } - val dbPrepare: TaskProvider = - getDBPrepare(this, testContainerPreparer, mssqlDatabase, oracleDatabase) - configureISHUnitTest(this, dockerExtension, testContainerPreparer, dbPrepare, mssqlDatabase, - oracleDatabase, startSolrCloud) + val dbPrepare: TaskProvider = getDBPrepare(this, + containerPreparer, mssqlDatabase, oracleDatabase) + + configureISHUnitTest(this, + dockerExtension, containerPreparer, dbPrepare, mssqlDatabase, oracleDatabase) + addTestReportConfiguration(this) val customizationName = project.getCustomizationName() + with(dockerExtension.imageBuild.images) { mainImage.nameExtension.set("") mainImage.description.set("customization $customizationName") testImage.nameExtension.set("test") testImage.description.set("test for customization $customizationName") } + CustomizationImageBuildPreparer(this, dockerExtension.images, dockerExtension.imageBuild.images).prepareImageBuilds() } @@ -183,10 +184,10 @@ open class ICMDockerCustomizationPlugin : Plugin { open fun Project.getCustomizationName(): String = name private fun getDBPrepare( - project: Project, - containerPreparer: ContainerTaskPreparer, - mssqlDatabase: TaskProvider, - oracleDatabase: TaskProvider, + project: Project, + containerPreparer: AbstractASTaskPreparer, + mssqlDatabase: TaskProvider, + oracleDatabase: TaskProvider, ): TaskProvider { return project.tasks.register(DBPrepareTask.TASK_NAME, DBPrepareTask::class.java) { task -> task.group = ICMDockerPlugin.GROUP_SERVERBUILD @@ -201,12 +202,10 @@ open class ICMDockerCustomizationPlugin : Plugin { private fun configureISHUnitTest( project: Project, extension: IntershopDockerExtension, - containerPreparer: ContainerTaskPreparer, + containerPreparer: AbstractASTaskPreparer, dbPrepare: TaskProvider, mssqlDatabase: TaskProvider, - oracleDatabase: TaskProvider, - startSolrCloud: TaskProvider, - ) { + oracleDatabase: TaskProvider) { project.gradle.sharedServices.registerIfAbsent(ISHUNIT_REGISTRY, ISHUnitTestRegistry::class.java) { it.maxParallelUsages.set(1) @@ -230,12 +229,6 @@ open class ICMDockerCustomizationPlugin : Plugin { task.finalizedBy(containerPreparer.removeTask) task.mustRunAfter(dbPrepare, mssqlDatabase, oracleDatabase) - - // use environment required by solrCloud - task.additionalEnvironment.set(ContainerEnvironment().add( - ContainerEnvironment.propertyNameToEnvName(Configuration.SOLR_CLOUD_HOSTLIST), - startSolrCloud.get().zookeeperHostList.get() - )) } ishUnitTest.configure { task -> diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/ICMDockerPlugin.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/ICMDockerPlugin.kt index 509a0b4..7d2ebf8 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/ICMDockerPlugin.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/ICMDockerPlugin.kt @@ -26,7 +26,6 @@ import com.intershop.gradle.icm.docker.tasks.PushImages import com.intershop.gradle.icm.docker.tasks.RemoveContainerByName import com.intershop.gradle.icm.docker.tasks.ShowICMASConfig import com.intershop.gradle.icm.docker.utils.Configuration -import com.intershop.gradle.icm.docker.utils.appserver.IcmServerTaskPreparer import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.UnknownTaskException @@ -83,9 +82,6 @@ open class ICMDockerPlugin : Plugin { val mailSrvTask = MailSrvPreparer(project, networkTasks.createNetworkTask) val solrcloudPreparer = SolrCloudPreparer(project, networkTasks) - val icmServerPreparer = IcmServerTaskPreparer(project, - networkTasks.createNetworkTask , mailSrvTask.startTask) - val webServerTasks = WebServerPreparer(project, networkTasks) /* TODO #72088 val nginxTasks = NginxTaskPreparer(project, networkTasks.createNetworkTask, webServerTasks.waTasks) @@ -109,13 +105,7 @@ open class ICMDockerPlugin : Plugin { mailSrvTask.removeTask, webServerTasks.removeTask, oracleTasks.removeTask, - solrcloudPreparer.removeTask, - icmServerPreparer.removeTask) - } - - val startAsContainer = icmServerPreparer.startTask - startAsContainer.configure { - it.mustRunAfter(mailSrvTask.startTask) + solrcloudPreparer.removeTask) } networkTasks.removeNetworkTask.configure { diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/ICMDockerProjectPlugin.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/ICMDockerProjectPlugin.kt deleted file mode 100644 index c677649..0000000 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/ICMDockerProjectPlugin.kt +++ /dev/null @@ -1,229 +0,0 @@ -/* - * 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 - -import com.intershop.gradle.icm.docker.ICMDockerPlugin.Companion.GROUP_SERVERBUILD -import com.intershop.gradle.icm.docker.extension.IntershopDockerExtension -import com.intershop.gradle.icm.docker.tasks.DBPrepareTask -import com.intershop.gradle.icm.docker.tasks.ISHUnitHTMLTestReport -import com.intershop.gradle.icm.docker.tasks.ISHUnitTest -import com.intershop.gradle.icm.docker.tasks.PrepareNetwork -import com.intershop.gradle.icm.docker.tasks.StartExtraContainer -import com.intershop.gradle.icm.docker.utils.ISHUnitTestRegistry -import com.intershop.gradle.icm.docker.utils.ProjectImageBuildPreparer -import com.intershop.gradle.icm.docker.utils.appserver.ContainerTaskPreparer -import com.intershop.gradle.icm.docker.utils.appserver.CustomServerTaskPreparer -import com.intershop.gradle.icm.docker.utils.solrcloud.StartSolrCloudTask -import com.intershop.gradle.icm.docker.utils.webserver.WATaskPreparer -import org.gradle.api.GradleException -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.Task -import org.gradle.api.UnknownTaskException -import org.gradle.api.artifacts.DependencySet -import org.gradle.api.tasks.TaskProvider -import com.intershop.gradle.icm.docker.utils.mail.TaskPreparer as MailPreparer -import com.intershop.gradle.icm.docker.utils.mssql.TaskPreparer as MSSQLPreparer -import com.intershop.gradle.icm.docker.utils.network.TaskPreparer as NetworkPreparer -import com.intershop.gradle.icm.docker.utils.oracle.TaskPreparer as OraclePreparer -import com.intershop.gradle.icm.docker.utils.solrcloud.TaskPreparer as SolrCloudPreparer -import com.intershop.gradle.icm.docker.utils.webserver.TaskPreparer as WebServerPreparer - -/** - * Main plugin class of the project plugin. - */ -open class ICMDockerProjectPlugin : Plugin { - - companion object { - const val INTERSHOP_EXTENSION_NAME = "intershop" - const val ISHUNIT_REGISTRY = "ishUnitTestTegistry" - const val HTML_ANT_TESTREPORT_CONFIG = "junitXmlToHtml" - const val ISHUNIT_TEST = "ISHUnitTest" - - const val TASK_DBPREPARE = "dbPrepare" - const val TASK_ISHUNIT_REPORT = "ishUnitTestReport" - - const val TASK_START_SERVER = "startServer" - const val TASK_STOP_SERVER = "stopServer" - const val TASK_REMOVE_SERVER = "removeServer" - } - - /** - * Main method of a plugin. - * - * @param project target project - */ - override fun apply(project: Project) { - with(project) { - if (project.rootProject == this) { - logger.info("ICM Docker build plugin for projects will be initialized") - plugins.apply(ICMDockerPlugin::class.java) - - val extension = extensions.findByType( - IntershopDockerExtension::class.java - ) ?: extensions.create("intershop_docker", IntershopDockerExtension::class.java, project) - - extension.developmentConfig.appserverAsContainer = true - - extensions.findByName(INTERSHOP_EXTENSION_NAME) - ?: throw GradleException("This plugin requires the plugin 'com.intershop.gradle.icm.project'!") - - val prepareNetwork = project.tasks.named(NetworkPreparer.PREPARE_NETWORK, PrepareNetwork::class.java) - val startSolrCloud = tasks.named( - "start${com.intershop.gradle.icm.docker.utils.solrcloud.TaskPreparer.TASK_EXT_SERVER}", - StartSolrCloudTask::class.java) - val mailSrvTask = tasks.named("start${MailPreparer.extName}", - StartExtraContainer::class.java) - - val containerPreparer = ContainerTaskPreparer(project, prepareNetwork) - val appServerPreparer = CustomServerTaskPreparer(project, prepareNetwork, startSolrCloud, mailSrvTask) - - val solrCloudTask = tasks.named("start${SolrCloudPreparer.TASK_EXT_SERVER}") - - appServerPreparer.startTask.configure { - it.mustRunAfter(solrCloudTask) - it.mustRunAfter(mailSrvTask) - } - - try { - tasks.named("containerClean").configure { - it.dependsOn( - containerPreparer.removeTask, - appServerPreparer.removeTask - ) - } - } catch (ex: UnknownTaskException) { - logger.info("Task containerClean is not available.") - } - - val startWA = tasks.named("start${WATaskPreparer.extName}") - val startWS = tasks.named("start${WebServerPreparer.TASK_EXT_SERVER}") - - tasks.register(TASK_START_SERVER) { task -> - task.group = GROUP_SERVERBUILD - task.description = "Start app server container with webserver containers" - task.dependsOn(startWS) - task.dependsOn(appServerPreparer.startTask) - } - - startWS.configure { - it.mustRunAfter(appServerPreparer.startTask) - } - - startWA.configure { - it.mustRunAfter(appServerPreparer.startTask) - } - - val stopWS = tasks.named("stop${WebServerPreparer.TASK_EXT_SERVER}") - - tasks.register(TASK_STOP_SERVER) { task -> - task.group = GROUP_SERVERBUILD - task.description = "Stop app server container and webserver containers" - task.dependsOn(appServerPreparer.stopTask, stopWS) - } - - val removeWS = tasks.named("remove${WebServerPreparer.TASK_EXT_SERVER}") - - tasks.register(TASK_REMOVE_SERVER) { task -> - task.group = GROUP_SERVERBUILD - task.description = "Removes app server container and webserver containers" - task.dependsOn(appServerPreparer.removeTask, removeWS) - } - - val mssqlDatabase = tasks.named("start${MSSQLPreparer.extName}") - val oracleDatabase = tasks.named("start${OraclePreparer.extName}") - - val dbprepare: TaskProvider = - getDBPrepare(this, containerPreparer, mssqlDatabase, oracleDatabase) - - configureISHUnitTest(this, extension, containerPreparer, dbprepare, mssqlDatabase, oracleDatabase) - addTestReportConfiguration(this) - ProjectImageBuildPreparer(this, extension.images, extension.imageBuild.images).prepareImageBuilds() - } - } - } - - - private fun getDBPrepare( - project: Project, - containerPreparer: ContainerTaskPreparer, - mssqlDatabase: TaskProvider, - oracleDatabase: TaskProvider, - ): TaskProvider { - return project.tasks.register(TASK_DBPREPARE, DBPrepareTask::class.java) { task -> - task.group = GROUP_SERVERBUILD - task.description = "Starts dbPrepare in an existing ICM base container." - task.executeUsing(containerPreparer.startTask) - - task.finalizedBy(containerPreparer.removeTask) - task.mustRunAfter(mssqlDatabase, oracleDatabase) - } - } - - private fun configureISHUnitTest( - project: Project, - extension: IntershopDockerExtension, - containerPreparer: ContainerTaskPreparer, - dbprepare: TaskProvider, - mssqlDatabase: TaskProvider, - oracleDatabase: TaskProvider, - ) { - project.gradle.sharedServices.registerIfAbsent(ISHUNIT_REGISTRY, ISHUnitTestRegistry::class.java) { - it.maxParallelUsages.set(1) - } - - val ishUnitTest = project.tasks.register(TASK_ISHUNIT_REPORT, - ISHUnitHTMLTestReport::class.java) { task -> - task.group = GROUP_SERVERBUILD - task.description = "Generates report for ISHUnitTest execution" - } - - extension.ishUnitTests.all { - val ishunitTest = project.tasks.register(it.name + ISHUNIT_TEST, ISHUnitTest::class.java) { task -> - task.group = GROUP_SERVERBUILD - task.description = "Starts ISHUnitTest suite '" + it.name + "' in an existing ICM base container." - - task.executeUsing(containerPreparer.startTask) - task.testCartridge.set(it.cartridge) - task.testSuite.set(it.testSuite) - - - task.finalizedBy(containerPreparer.removeTask) - task.mustRunAfter(dbprepare, mssqlDatabase, oracleDatabase) - } - - ishUnitTest.configure { task -> - task.dependsOn(ishunitTest) - } - } - } - - private fun addTestReportConfiguration(project: Project) { - val configuration = project.configurations.maybeCreate(HTML_ANT_TESTREPORT_CONFIG) - configuration - .setVisible(false) - .setTransitive(false) - .setDescription("HTML Ant Test Report libraries") - .defaultDependencies { dependencies: DependencySet -> - // this will be executed if configuration is empty - val dependencyHandler = project.dependencies - dependencies.add(dependencyHandler.create("org.apache.ant:ant-junit:1.9.7")) - } - - project.configurations.maybeCreate(HTML_ANT_TESTREPORT_CONFIG) - } -} diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/ICMGebTestPlugin.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/ICMGebTestPlugin.kt index 587bf69..5cb3f37 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/ICMGebTestPlugin.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/ICMGebTestPlugin.kt @@ -14,10 +14,8 @@ * limitations under the License. * */ - package com.intershop.gradle.icm.docker -import com.intershop.gradle.icm.docker.extension.IntershopDockerExtension import com.intershop.gradle.icm.docker.extension.geb.GebConfiguration import com.intershop.gradle.icm.docker.tasks.PrepareNetwork import com.intershop.gradle.icm.docker.tasks.StartExtraContainer @@ -29,20 +27,28 @@ import com.intershop.gradle.icm.docker.utils.Configuration import com.intershop.gradle.icm.docker.utils.Configuration.GEB_LOCAL_DRIVER import com.intershop.gradle.icm.docker.utils.Configuration.GEB_LOCAL_ENVIRONMENT import com.intershop.gradle.icm.docker.utils.OS -import com.intershop.gradle.icm.docker.utils.appserver.IcmServerTaskPreparer +import com.intershop.gradle.icm.docker.utils.appsrv.ICMServerTaskPreparer +import com.intershop.gradle.icm.docker.utils.appsrv.ServerTaskPreparer import com.intershop.gradle.icm.docker.utils.webserver.WATaskPreparer +import com.intershop.gradle.icm.extension.IntershopExtension import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.UnknownTaskException import org.gradle.api.plugins.GroovyPlugin import org.gradle.api.plugins.JavaPlugin import org.gradle.api.plugins.JavaPluginExtension +import org.gradle.api.tasks.TaskProvider import org.gradle.kotlin.dsl.getByType import com.intershop.gradle.icm.docker.utils.network.TaskPreparer as NetworkPreparer class ICMGebTestPlugin : Plugin { + companion object { + const val USEBUILDCNR = "useBuildContainer" + const val USELOCALSRV = "useLocalServer" + const val SRVSTARTTASK = "serverStartTaskName" + } /** * Main method of a plugin. * @@ -50,14 +56,19 @@ class ICMGebTestPlugin : Plugin { */ override fun apply(project: Project) { with(project) { - val extension = rootProject.project.extensions.getByType() + val extension = rootProject.project.extensions.getByType() + + val waitForServer = project.tasks.register("waitForServer", WaitForServer::class.java) + + initWebServer(rootProject, waitForServer) + initASServer(project, waitForServer) val gebExtension = extensions.findByType(GebConfiguration::class.java) ?: extensions.create("gebConfiguration", GebConfiguration::class.java) plugins.apply(GroovyPlugin::class.java) - val sourceSets = project.extensions.getByType(JavaPluginExtension::class.java).sourceSets + val sourceSets = extensions.getByType(JavaPluginExtension::class.java).sourceSets val sourcesets = sourceSets.create("gebTest") { it.java.srcDirs("src/gebTest/groovy") @@ -66,16 +77,6 @@ class ICMGebTestPlugin : Plugin { it.runtimeClasspath = it.output + it.compileClasspath } - val startWebSrv = rootProject.tasks.named( - "start" + WATaskPreparer.extName, - StartExtraContainer::class.java - ) - - val startASProvider = rootProject.tasks.named( - "start${IcmServerTaskPreparer.extName}", - StartServerContainer::class.java - ) - val networkTask = rootProject.tasks.named(NetworkPreparer.PREPARE_NETWORK, PrepareNetwork::class.java) val os = OS.bySystem() @@ -87,20 +88,6 @@ class ICMGebTestPlugin : Plugin { Configuration.WS_SECURE_URL_VALUE ) - try { - with(extension.developmentConfig) { - - project.tasks.register("waitForServer", WaitForServer::class.java) { wfs -> - wfs.probes.addAll(provider { startWebSrv.get().probes.get() }) - wfs.probes.addAll(provider { startASProvider.get().probes.get() }) - - wfs.mustRunAfter(startWebSrv, startASProvider) - } - } - } catch (ex: UnknownTaskException) { - project.logger.info("No startServer task found.") - } - val gebTest = tasks.register("gebTest", GebTest::class.java) { it.testClassesDirs = sourcesets.output.classesDirs it.classpath = sourcesets.runtimeClasspath @@ -150,4 +137,57 @@ class ICMGebTestPlugin : Plugin { } } + private fun initWebServer(project: Project, wfs: TaskProvider) { + with(project) { + try { + val startWebSrv = tasks.named( + "start" + WATaskPreparer.extName, + StartExtraContainer::class.java + ) + wfs.configure { + it.probes.addAll(provider { startWebSrv.get().probes.get() }) + it.mustRunAfter(startWebSrv) + } + } catch (ex: UnknownTaskException) { + logger.info("No start task for web server found.") + } + } + } + + private fun initASServer(project: Project, wfs: TaskProvider) { + with(project) { + try { + val useBuildContainer = hasProperty(USEBUILDCNR) && property(USEBUILDCNR) == "true" + + val useLocalServer = hasProperty(USELOCALSRV) && property(USELOCALSRV) == "true" + + val startTaskName = if (hasProperty(SRVSTARTTASK)) { + property(SRVSTARTTASK).toString() + } else { + "start${ServerTaskPreparer.extName}" + } + + if (useLocalServer == true && !useBuildContainer) { + + val startASServer = rootProject.tasks.named(startTaskName) + wfs.configure { + it.mustRunAfter(startASServer) + } + } else { + val serverTaskName = if (useBuildContainer) { + "start${ICMServerTaskPreparer.extName}" + } else { + startTaskName + } + val startASServer = rootProject.tasks.named(serverTaskName, StartServerContainer::class.java) + wfs.configure { + it.probes.addAll(provider { startASServer.get().probes.get() }) + it.mustRunAfter(startASServer) + } + } + } catch (ex: UnknownTaskException) { + project.logger.info("No start task for appserver found.") + } + } + } } diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/ICMSolrCloudPlugin.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/ICMSolrCloudPlugin.kt index 1f88c92..af34c81 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/ICMSolrCloudPlugin.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/ICMSolrCloudPlugin.kt @@ -16,7 +16,6 @@ */ package com.intershop.gradle.icm.docker -import com.intershop.gradle.icm.docker.ICMDockerProjectPlugin.Companion.TASK_DBPREPARE import com.intershop.gradle.icm.docker.extension.IntershopDockerExtension import com.intershop.gradle.icm.docker.tasks.StartExtraContainer import com.intershop.gradle.icm.docker.tasks.StartServerContainer @@ -31,7 +30,7 @@ import com.intershop.gradle.icm.docker.utils.Configuration.AS_ADMIN_USER_PASSWOR import com.intershop.gradle.icm.docker.utils.Configuration.SOLR_CLOUD_HOSTLIST import com.intershop.gradle.icm.docker.utils.Configuration.SOLR_CLOUD_INDEXPREFIX import com.intershop.gradle.icm.docker.utils.Configuration.SSL_VERIFICATION -import com.intershop.gradle.icm.docker.utils.appserver.CustomServerTaskPreparer +import com.intershop.gradle.icm.docker.utils.appsrv.ServerTaskPreparer import com.intershop.gradle.icm.docker.utils.webserver.WATaskPreparer import org.gradle.api.Plugin import org.gradle.api.Project @@ -42,6 +41,7 @@ class ICMSolrCloudPlugin : Plugin { companion object { const val SOLR_GROUP = "Solr Cloud Support" + const val TASK_DBPREPARE = "dbPrepare" } /** @@ -63,7 +63,7 @@ class ICMSolrCloudPlugin : Plugin { StartExtraContainer::class.java ) val startASProvider = tasks.named( - "start${CustomServerTaskPreparer.extName}", + "start${ServerTaskPreparer.extName}", StartServerContainer::class.java ) diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/ICMDockerTestPlugin.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/ICMTestDockerPlugin.kt similarity index 52% rename from src/main/kotlin/com/intershop/gradle/icm/docker/ICMDockerTestPlugin.kt rename to src/main/kotlin/com/intershop/gradle/icm/docker/ICMTestDockerPlugin.kt index 48ace4c..d97b245 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/ICMDockerTestPlugin.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/ICMTestDockerPlugin.kt @@ -16,14 +16,16 @@ */ package com.intershop.gradle.icm.docker -import com.bmuschko.gradle.docker.DockerRemoteApiPlugin import com.intershop.gradle.icm.docker.extension.IntershopDockerExtension import com.intershop.gradle.icm.docker.tasks.PrepareNetwork -import com.intershop.gradle.icm.docker.utils.mail.TestTaskPreparer as MailSrvPreparer +import com.intershop.gradle.icm.docker.tasks.StartExtraContainer +import com.intershop.gradle.icm.docker.utils.appsrv.TestTaskPreparer +import com.intershop.gradle.icm.docker.utils.network.TaskPreparer import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.UnknownTaskException -class ICMDockerTestPlugin: Plugin { +class ICMTestDockerPlugin: Plugin { /** * Main method of a plugin. @@ -37,11 +39,29 @@ class ICMDockerTestPlugin: Plugin { IntershopDockerExtension::class.java ) ?: extensions.create("intershop_docker", IntershopDockerExtension::class.java) - plugins.apply(DockerRemoteApiPlugin::class.java) + plugins.apply(ICMDockerPlugin::class.java) - val prepareNetwork = tasks.named("prepareNetwork", PrepareNetwork::class.java) + val createNetworkTask = project.tasks.named(TaskPreparer.PREPARE_NETWORK, PrepareNetwork::class.java) + + val mailSrvTask = tasks.named( + "start${com.intershop.gradle.icm.docker.utils.mail.TaskPreparer.extName}", + StartExtraContainer::class.java) + + + val appSrvPreparer = TestTaskPreparer(project, createNetworkTask) + + appSrvPreparer.getICMServerTaskPreparer().startTask.configure { + it.dependsOn(mailSrvTask) + } + + try { + tasks.named("containerClean").configure { + it.dependsOn( appSrvPreparer.getICMServerTaskPreparer().removeTask) + } + } catch (ex: UnknownTaskException) { + logger.info("Task containerClean is not available.") + } - MailSrvPreparer(this, prepareNetwork) } } } diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/extension/DevelopmentConfiguration.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/extension/DevelopmentConfiguration.kt index 93f399c..f93f642 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/extension/DevelopmentConfiguration.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/extension/DevelopmentConfiguration.kt @@ -79,21 +79,21 @@ open class DevelopmentConfiguration // read environment val gradleUserHomePath = GradleUserHomeLookup.gradleUserHome().absolutePath - var licDirPath = providerFactory.environmentVariable(LICENSE_DIR_ENV).forUseAtConfigurationTime().orNull - var configDirPath = providerFactory.environmentVariable(CONFIG_DIR_ENV).forUseAtConfigurationTime().orNull + var licDirPath = providerFactory.environmentVariable(LICENSE_DIR_ENV).orNull + var configDirPath = providerFactory.environmentVariable(CONFIG_DIR_ENV).orNull // read system if necessary if (licDirPath == null) { - licDirPath = providerFactory.systemProperty(LICENSE_DIR_SYS).forUseAtConfigurationTime().orNull + licDirPath = providerFactory.systemProperty(LICENSE_DIR_SYS).orNull } if (configDirPath == null) { - configDirPath = providerFactory.systemProperty(CONFIG_DIR_SYS).forUseAtConfigurationTime().orNull + configDirPath = providerFactory.systemProperty(CONFIG_DIR_SYS).orNull } if (licDirPath == null) { try { - licDirPath = providerFactory.gradleProperty(LICENSE_DIR_SYS).forUseAtConfigurationTime().orNull + licDirPath = providerFactory.gradleProperty(LICENSE_DIR_SYS).orNull } catch (ise: IllegalStateException) { log.error(ise.message) } @@ -101,7 +101,7 @@ open class DevelopmentConfiguration if (configDirPath == null) { try { - configDirPath = providerFactory.gradleProperty(CONFIG_DIR_SYS).forUseAtConfigurationTime().orNull + configDirPath = providerFactory.gradleProperty(CONFIG_DIR_SYS).orNull } catch (ise: IllegalStateException) { log.error(ise.message) } 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 ce58350..8237ca4 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 @@ -33,10 +33,6 @@ open class Images @Inject constructor(objectFactory: ObjectFactory) { val zookeeper: Property = objectFactory.property(String::class.java) - val icmbase: Property = objectFactory.property(String::class.java) - - val icmbasetest: Property = objectFactory.property(String::class.java) - val icmcustomizationbase: Property = objectFactory.property(String::class.java) val mssqldb: Property = objectFactory.property(String::class.java) @@ -52,8 +48,6 @@ open class Images @Inject constructor(objectFactory: ObjectFactory) { */ init { - icmbase.convention("docker.intershop.de/intershop/icm-as:latest") - icmbasetest.convention("docker.intershop.de/intershop/icm-as-test:latest") icmcustomizationbase.convention("intershophub/icm-as-customization-base:latest") webadapter.convention("intershophub/icm-webadapter:2.1.0") diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/extension/geb/GebConfiguration.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/extension/geb/GebConfiguration.kt index 60dab38..1d88c3b 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/extension/geb/GebConfiguration.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/extension/geb/GebConfiguration.kt @@ -14,7 +14,6 @@ * limitations under the License. * */ - package com.intershop.gradle.icm.docker.extension.geb import org.gradle.api.NamedDomainObjectContainer diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/AbstractICMASContainerTask.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/AbstractICMASContainerTask.kt index 636c834..94293bf 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/AbstractICMASContainerTask.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/AbstractICMASContainerTask.kt @@ -49,7 +49,6 @@ import javax.inject.Inject /** * Abstract base task to run a typical ICM-AS classes on a previously prepared container - * @see com.intershop.gradle.icm.docker.utils.appserver.ContainerTaskPreparer * @param result callback type * @param result callback template type * @param execution result type diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/ISHUnitHTMLTestReport.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/ISHUnitHTMLTestReport.kt index 49a8083..c835a4f 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/ISHUnitHTMLTestReport.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/ISHUnitHTMLTestReport.kt @@ -16,7 +16,6 @@ */ package com.intershop.gradle.icm.docker.tasks -import com.intershop.gradle.icm.docker.ICMDockerProjectPlugin.Companion.HTML_ANT_TESTREPORT_CONFIG import org.gradle.api.DefaultTask import org.gradle.api.file.DirectoryProperty import org.gradle.api.file.FileCollection @@ -38,6 +37,7 @@ open class ISHUnitHTMLTestReport @Inject constructor( ) : DefaultTask() { companion object { const val TASK_NAME = "ishUnitTestReport" + const val HTML_ANT_TESTREPORT_CONFIG = "junitXmlToHtml" } @get:InputDirectory diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/ISHUnitTest.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/ISHUnitTest.kt index 60f5af0..e198859 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/ISHUnitTest.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/ISHUnitTest.kt @@ -17,7 +17,6 @@ package com.intershop.gradle.icm.docker.tasks import com.github.dockerjava.api.command.ExecCreateCmdResponse -import com.intershop.gradle.icm.docker.ICMDockerProjectPlugin.Companion.ISHUNIT_REGISTRY import com.intershop.gradle.icm.docker.tasks.utils.ContainerEnvironment import com.intershop.gradle.icm.docker.tasks.utils.ISHUnitTestResult import com.intershop.gradle.icm.docker.tasks.utils.RedirectToLoggerCallback @@ -45,6 +44,7 @@ open class ISHUnitTest companion object { const val COMMAND = "/intershop/bin/ishunitrunner.sh" + const val ISHUNIT_REGISTRY = "ishUnitTestTegistry" } init { @@ -77,7 +77,7 @@ open class ISHUnitTest val serviceRegistry = services.get(BuildServiceRegistryInternal::class.java) val testResourceProvider = getBuildService(serviceRegistry, ISHUNIT_REGISTRY) val resource = serviceRegistry.forService(testResourceProvider) - locks.add(resource.getResourceLock(1)) + locks.add(resource.getResourceLock()) return Collections.unmodifiableList(locks) } diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/RemoveVolumes.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/RemoveVolumes.kt index 12a482d..a92645e 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/RemoveVolumes.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/tasks/RemoveVolumes.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020 Intershop Communications AG. + * Copyright 2022 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. @@ -17,6 +17,8 @@ package com.intershop.gradle.icm.docker.tasks import com.bmuschko.gradle.docker.tasks.AbstractDockerRemoteApiTask +import com.github.dockerjava.api.exception.ConflictException +import com.github.dockerjava.api.exception.NotFoundException import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.ListProperty import org.gradle.api.tasks.Input @@ -36,8 +38,25 @@ open class RemoveVolumes @Inject constructor(objectFactory: ObjectFactory) : Abs */ override fun runRemoteCommand() { volumeNames.get().forEach { - val resp = dockerClient.removeVolumeCmd(it).exec() - println(resp) + try { + dockerClient.removeVolumeCmd(it).exec() + } catch (exnf: NotFoundException) { + project.logger.warn("Volume '${it}' not found! ", exnf.message) + } catch (exc: ConflictException) { + var retry = 0 + project.logger.warn("Volume '${it}' is still used! Try it again ... ({}).", retry, exc.message) + // try it again ... + do { + Thread.sleep(10000) + try { + dockerClient.removeVolumeCmd(it).exec() + break + } catch (ex: Exception) { + retry++ + project.logger.warn("Volume '${it}' is still used! Try it again ... ({}).", retry, ex.message) + } + } while( retry < 5) + } } } } diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/AbstractTaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/AbstractTaskPreparer.kt index 1578592..b6c2f8d 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/AbstractTaskPreparer.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/AbstractTaskPreparer.kt @@ -25,6 +25,7 @@ import com.intershop.gradle.icm.docker.tasks.PullExtraImage import com.intershop.gradle.icm.docker.tasks.RemoveContainerByName import com.intershop.gradle.icm.docker.tasks.StartExtraContainer import com.intershop.gradle.icm.docker.tasks.StopExtraContainer +import com.intershop.gradle.icm.extension.IntershopExtension import org.gradle.api.Project import org.gradle.api.provider.Property import org.gradle.api.provider.Provider @@ -40,9 +41,10 @@ abstract class AbstractTaskPreparer( protected open fun getContainerExt(): String = getExtensionName().lowercase() protected abstract fun getImage(): Provider - protected val extension = project.extensions.getByType() + protected val dockerExtension = project.extensions.getByType() + protected val icmExtension = project.extensions.getByType() - fun getContainerName(): String = "${extension.containerPrefix}-${getContainerExt()}" + fun getContainerName(): String = "${dockerExtension.containerPrefix}-${getContainerExt()}" protected fun initBaseTasks() { project.tasks.register("pull${getExtensionName()}", PullExtraImage::class.java) { task -> diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/Configuration.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/Configuration.kt index e0105ad..e5a81e8 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/Configuration.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/Configuration.kt @@ -58,6 +58,9 @@ object Configuration { const val DB_USER_NAME_VALUE = "intershop" const val DB_USER_PASSWORD_VALUE = "intershop" + const val AS_USE_TESTIMAGE = "intershop.as.use.testimage" + const val AS_USE_TESTIMAGE_VALUE = "true" + const val AS_CONNECTOR_PORT = "intershop.servletEngine.connector.port" const val AS_CONNECTOR_PORT_VALUE = 7743 @@ -151,7 +154,6 @@ object Configuration { const val MAIL_READINESS_PROBE_TIMEOUT = "mail.readinessProbe.timeout" const val MAIL_READINESS_PROBE_TIMEOUT_VALUE = 15 // 15 secs - /* TODO #72088 const val NGINX_HTTP_PORT = "nginx.http.port" const val NGINX_HTTPS_PORT = "nginx.https.port" @@ -163,5 +165,4 @@ object Configuration { const val NGINX_CERT_FILENAME_VALUE = "fullchain.pem" const val NGINX_PRIVATEKEY_FILENAME = "nginx.privatekey.filename" const val NGINX_PRIVATEKEY_FILENAME_VALUE = "privkey.pem" - */ } diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/ProjectImageBuildPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/ProjectImageBuildPreparer.kt deleted file mode 100644 index b1eb29c..0000000 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/ProjectImageBuildPreparer.kt +++ /dev/null @@ -1,149 +0,0 @@ -/* - * 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.bmuschko.gradle.docker.tasks.image.Dockerfile -import com.intershop.gradle.icm.docker.ICMDockerPlugin.Companion.BUILD_MAIN_IMAGE -import com.intershop.gradle.icm.docker.ICMDockerPlugin.Companion.BUILD_TEST_IMAGE -import com.intershop.gradle.icm.docker.extension.image.build.ImageConfiguration -import com.intershop.gradle.icm.docker.tasks.BuildImage -import org.gradle.api.GradleException -import org.gradle.api.Project -import org.gradle.api.file.RegularFile -import org.gradle.api.file.RegularFileProperty -import org.gradle.api.provider.Provider -import org.gradle.api.tasks.TaskProvider -import org.gradle.api.tasks.bundling.Tar -import com.intershop.gradle.icm.docker.extension.Images as BaseImages -import com.intershop.gradle.icm.docker.extension.image.build.Images as BuildImages - -class ProjectImageBuildPreparer(private val project: Project, - private val images: BaseImages, - private val buildImages: BuildImages) { - - companion object { - const val PRJ_DIR = "intershop-prj" - - const val PREBUILDSTAGE = "PREBUILD" - const val BUILDSTAGE = "BUILD" - const val USERSET = "--chown=intershop:intershop" - - const val MAIN_ICM_DIR = "/intershop" - - const val DIFFDIRSCRIPT = "/${PRJ_DIR}/diffdir.sh" - const val WORKDIR = "${MAIN_ICM_DIR}/${PRJ_DIR}" - - const val DOCKERFILE_MAIN = "dockerfileMain" - const val DOCKERFILE_TEST = "dockerfileTest" - - const val DOCKERFILE_MAIN_DIR = "dockerfile/main" - const val DOCKERFILE_TEST_DIR = "dockerfile/test" - } - - fun prepareImageBuilds() { - - val mainPkgTaskName = buildImages.mainImage.pkgTaskName.getOrElse("createMainPkg") - val mainPkgTask = project.tasks.named(mainPkgTaskName, Tar::class.java) - val mainBuildImageTask = project.tasks.named(BUILD_MAIN_IMAGE, BuildImage::class.java ) - - val mainDockerFile = getBaseDockerfileTask( - DOCKERFILE_MAIN, DOCKERFILE_MAIN_DIR, images.icmbase, - MAIN_ICM_DIR, mainPkgTask, buildImages.mainImage) - - mainBuildImageTask.configure { task -> - task.dockerfile.set(getDockerfile(buildImages.mainImage.dockerfile, mainDockerFile)) - task.srcFiles.from(mainPkgTask) - task.dependsOn(mainDockerFile) - } - - - val testPkgTaskName = buildImages.testImage.pkgTaskName.getOrElse("createTestPkg") - val testPkgTask = project.tasks.named(testPkgTaskName, Tar::class.java) - val testBuildImageTask = project.tasks.named(BUILD_TEST_IMAGE, BuildImage::class.java ) - - val testDockerFile = getBaseDockerfileTask( - DOCKERFILE_TEST, DOCKERFILE_TEST_DIR, project.provider { "BASE_IMAGE" }, - MAIN_ICM_DIR, testPkgTask, buildImages.testImage) - - testBuildImageTask.configure { task -> - task.dockerfile.set( getDockerfile(buildImages.testImage.dockerfile, testDockerFile) ) - task.srcFiles.from(mainPkgTask) - task.dependsOn(testDockerFile) - } - } - - private fun getBaseDockerfileTask(taskname: String, - dirname: String, - image: Provider, - icmdir: String, pkg: TaskProvider, - imgConfiguration: ImageConfiguration): TaskProvider = - project.tasks.register(taskname, Dockerfile::class.java) { task -> - task.arg("SETUP_IMAGE") - task.arg("BASE_IMAGE") - - task.from(Dockerfile.From("\${SETUP_IMAGE}").withStage(PREBUILDSTAGE)) - task.runCommand("mkdir -p /${PRJ_DIR}/org") - - task.addFile(project.provider { - Dockerfile.File(pkg.get().outputs.files.first().name, "/${PRJ_DIR}/org") - } ) - - task.runCommand("echo '#!/bin/sh' > $DIFFDIRSCRIPT") - task.runCommand("echo 'for i in `ls -1 ${WORKDIR}/org`' >> $DIFFDIRSCRIPT") - task.runCommand("echo ' do' >> $DIFFDIRSCRIPT") - task.runCommand("echo ' dirdiff -srcdir ${WORKDIR}/org/\$i -targetdir ${icmdir}/\$i" + - " -diffdir ${WORKDIR}/diff/' >> $DIFFDIRSCRIPT") - task.runCommand("echo ' done' >> $DIFFDIRSCRIPT") - - task.runCommand("chmod a+x $DIFFDIRSCRIPT") - - task.from( project.provider { - if(image.getOrElse("").isEmpty()) { - throw GradleException("It is necessary to provide an ICM base image!") - } - Dockerfile.From(image.getOrElse("")).withStage(BUILDSTAGE) } ) - task.runCommand("mkdir -p ${WORKDIR}/diff") - task.instruction("COPY --from=${PREBUILDSTAGE} $USERSET /${PRJ_DIR}/ ${WORKDIR}/") - task.runCommand("${MAIN_ICM_DIR}${DIFFDIRSCRIPT}") - - task.from( project.provider { - if(image.getOrElse("").isEmpty()) { - throw GradleException("It is necessary to provide an ICM base image!") - } - Dockerfile.From(image.getOrElse("")) - } ) - task.instruction("COPY --from=${BUILDSTAGE} $USERSET ${WORKDIR}/diff ${icmdir}/") - - task.destFile.set(project.layout.buildDirectory.file("${dirname}/Dockerfile")) - - task.onlyIf { checkDockerFile(imgConfiguration.dockerfile) } - } - - private fun checkDockerFile(dockerfile: RegularFileProperty): Boolean = - ! dockerfile.isPresent || ! dockerfile.asFile.get().exists() - - private fun getDockerfile(dockerfile: RegularFileProperty, - dockerfileTask: TaskProvider): Provider = - project.provider { - if(dockerfile.orNull != null && dockerfile.asFile.get().exists()) { - dockerfile.get() - } else { - dockerfileTask.get().destFile.get() - } - } -} diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appserver/AbstractServerTaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appserver/AbstractServerTaskPreparer.kt deleted file mode 100644 index a4b2cb7..0000000 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appserver/AbstractServerTaskPreparer.kt +++ /dev/null @@ -1,103 +0,0 @@ -/* - * 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.appserver - -import com.intershop.gradle.icm.docker.extension.IntershopDockerExtension -import com.intershop.gradle.icm.docker.tasks.PrepareNetwork -import com.intershop.gradle.icm.docker.tasks.StartExtraContainer -import com.intershop.gradle.icm.docker.tasks.StartServerContainer -import com.intershop.gradle.icm.docker.tasks.utils.ICMContainerEnvironmentBuilder -import com.intershop.gradle.icm.docker.tasks.utils.ICMContainerEnvironmentBuilder.ClasspathLayout.RELEASE -import com.intershop.gradle.icm.docker.tasks.utils.ICMContainerEnvironmentBuilder.ClasspathLayout.SOURCE -import com.intershop.gradle.icm.docker.utils.Configuration -import com.intershop.gradle.icm.docker.utils.HostAndPort -import com.intershop.gradle.icm.docker.utils.solrcloud.StartSolrCloudTask -import org.gradle.api.Project -import org.gradle.api.provider.Provider -import org.gradle.kotlin.dsl.getByType -import java.net.URI - -abstract class AbstractServerTaskPreparer( - project: Project, - networkTask: Provider, - private val startSolrCloudTask: Provider?, - private val mailServerTask: Provider -) : AbstractTaskPreparer(project, networkTask) { - - - fun initServer( - task: StartServerContainer, - taskDescription: String, - customization: Boolean - ) { - configureContainerTask(task) - task.description = taskDescription - - task.targetImageId(project.provider { pullTask.get().image.get() }) - task.image.set(pullTask.get().image) - - task.hostConfig.binds.set(project.provider { - getServerVolumes(task, customization).apply { - project.logger.info( - "Using the following volume binds for container startup in task {}: {}", - task.name, this - ) - } - }) - - task.withPortMappings(*getPortMappings().toTypedArray()) - - task.hostConfig.network.set(networkId) - task.withEnvironment( - ICMContainerEnvironmentBuilder() - .withClasspathLayout(setOf(RELEASE, SOURCE)) - .withContainerName(getContainerName()) - .build() - ) - - val devConfig = project.extensions.getByType().developmentConfig - task.withHttpProbe( - URI.create( - StartServerContainer. - PATTERN_READINESS_PROBE_URL.format( - devConfig.asPortConfiguration.servletEngine.get().hostPort - ) - ), - devConfig.getDurationProperty( - Configuration.AS_READINESS_PROBE_INTERVAL, - Configuration.AS_READINESS_PROBE_INTERVAL_VALUE - ), - devConfig.getDurationProperty( - Configuration.AS_READINESS_PROBE_TIMEOUT, - Configuration.AS_READINESS_PROBE_TIMEOUT_VALUE - ) - ) - startSolrCloudTask?.run { - task.solrCloudZookeeperHostList = project.provider { - this.get().zookeeperHostList.get() - } - } - task.mailServer = project.provider { - HostAndPort( - mailServerTask.get().containerName.get(), - mailServerTask.get().getPrimaryPortMapping().get().containerPort - ) - } - } - -} diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appserver/CustomServerTaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appserver/CustomServerTaskPreparer.kt deleted file mode 100644 index 905bfc2..0000000 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appserver/CustomServerTaskPreparer.kt +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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.appserver - -import com.intershop.gradle.icm.docker.tasks.PrepareNetwork -import com.intershop.gradle.icm.docker.tasks.StartExtraContainer -import com.intershop.gradle.icm.docker.tasks.StartServerContainer -import com.intershop.gradle.icm.docker.utils.solrcloud.StartSolrCloudTask -import org.gradle.api.Project -import org.gradle.api.provider.Provider - -class CustomServerTaskPreparer( - project: Project, - networkTask: Provider, - startSolrCloudTask : Provider, - mailServerTask : Provider -) : AbstractServerTaskPreparer(project, networkTask, startSolrCloudTask, mailServerTask) { - - companion object { - const val extName: String = "AS" - } - - override fun getExtensionName(): String = extName - - init { - initAppTasks() - - project.tasks.register("start${this.getExtensionName()}", StartServerContainer::class.java) { task -> - - val customization = true - val taskDescription = - "Starts Application Server in a container - only for project use (e.g. solrcloud, responsive)" - - initServer(task, taskDescription, customization) - - task.dependsOn(prepareServer, pullTask, networkTask) - } - } - -} diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appserver/IcmServerTaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appserver/IcmServerTaskPreparer.kt deleted file mode 100644 index 4a11db6..0000000 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appserver/IcmServerTaskPreparer.kt +++ /dev/null @@ -1,60 +0,0 @@ -/* - * 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.appserver - -import com.intershop.gradle.icm.docker.ICMDockerPlugin -import com.intershop.gradle.icm.docker.tasks.BuildImage -import com.intershop.gradle.icm.docker.tasks.PrepareNetwork -import com.intershop.gradle.icm.docker.tasks.StartExtraContainer -import com.intershop.gradle.icm.docker.tasks.StartServerContainer -import org.gradle.api.Project -import org.gradle.api.provider.Provider - -class IcmServerTaskPreparer( - project: Project, - networkTask: Provider, - mailServerTask : Provider -) : AbstractServerTaskPreparer(project, networkTask, null, mailServerTask) { - - companion object { - const val extName: String = "AsTestContainer" - } - - override fun getExtensionName(): String = extName - - override fun getImage(): Provider { - val buildTestImageTask = project.tasks.named(ICMDockerPlugin.BUILD_TEST_IMAGE, BuildImage::class.java) - val imageProvider = project.provider { buildTestImageTask.get().images.get() } - return imageProvider.map { it.first() } - } - - init { - initAppTasks() - - project.tasks.register("start${this.getExtensionName()}", StartServerContainer::class.java) { task -> - - val customization = false - val taskDescription = "Starts Production Application Server in a container - only for use in icm-as" - - initServer(task, taskDescription, customization) - - task.dependsOn(pullTask, networkTask) - } - } - -} diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appserver/TestContainerTaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appserver/TestContainerTaskPreparer.kt deleted file mode 100644 index cabf939..0000000 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appserver/TestContainerTaskPreparer.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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.appserver - -import com.intershop.gradle.icm.docker.tasks.PrepareNetwork -import org.gradle.api.Project -import org.gradle.api.provider.Provider - -class TestContainerTaskPreparer( - project: Project, - networkTask: Provider, -) : ContainerTaskPreparer(project, networkTask) { - - companion object { - const val extName: String = "TestContainer" - } - - override fun getExtensionName(): String = extName - override fun getImage(): Provider = extension.images.icmbasetest - -} diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appserver/AbstractTaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/AbstractASTaskPreparer.kt similarity index 63% rename from src/main/kotlin/com/intershop/gradle/icm/docker/utils/appserver/AbstractTaskPreparer.kt rename to src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/AbstractASTaskPreparer.kt index 5af54f0..c7d9e22 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appserver/AbstractTaskPreparer.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/AbstractASTaskPreparer.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020 Intershop Communications AG. + * Copyright 2022 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. @@ -14,14 +14,15 @@ * limitations under the License. * */ -package com.intershop.gradle.icm.docker.utils.appserver +package com.intershop.gradle.icm.docker.utils.appsrv -import com.intershop.gradle.icm.docker.extension.IntershopDockerExtension import com.intershop.gradle.icm.docker.tasks.PrepareNetwork import com.intershop.gradle.icm.docker.tasks.PullImage import com.intershop.gradle.icm.docker.tasks.RemoveContainerByName +import com.intershop.gradle.icm.docker.tasks.StartExtraContainer import com.intershop.gradle.icm.docker.tasks.StopExtraContainer -import com.intershop.gradle.icm.docker.utils.Configuration.SITES_FOLDER_PATH +import com.intershop.gradle.icm.docker.utils.AbstractTaskPreparer +import com.intershop.gradle.icm.docker.utils.Configuration import com.intershop.gradle.icm.docker.utils.ContainerUtils import com.intershop.gradle.icm.docker.utils.OS import com.intershop.gradle.icm.docker.utils.PortMapping @@ -36,26 +37,18 @@ import org.gradle.api.tasks.TaskProvider import java.io.File import java.util.concurrent.TimeUnit -abstract class AbstractTaskPreparer( - project: Project, - networkTask: Provider, -) : com.intershop.gradle.icm.docker.utils.AbstractTaskPreparer(project, networkTask) { +abstract class AbstractASTaskPreparer( + project: Project, + networkTask: Provider) : AbstractTaskPreparer(project, networkTask) { - companion object { - const val SERVERLOGS = "serverlogs" - const val SERVERLOGS_PATH = "server/logs" - - const val ISHUNITOUT = "ishunitout" - const val ISHUNITOUT_PATH = "ishunitrunner/output" - - const val TASK_PREPARESERVER = "prepareServer" - const val TASK_EXTRACARTRIDGES = "setupCartridges" - const val TASK_CREATECONFIG = "createConfig" + init { + initAppTasks() } - override fun getImage(): Provider = extension.images.icmbase - - fun initAppTasks() { + val prepareServer: TaskProvider by lazy { + project.tasks.named(TaskPreparer.TASK_PREPARESERVER) + } + private fun initAppTasks() { project.tasks.register("pull${getExtensionName()}", PullImage::class.java) { task -> task.group = "icm container ${getContainerExt()}" task.description = "Pull image from registry" @@ -76,79 +69,92 @@ abstract class AbstractTaskPreparer( } } - val prepareServer: TaskProvider by lazy { - project.tasks.named(TASK_PREPARESERVER) - } - - private val addDirectories: Map> by lazy { - mapOf( - SERVERLOGS to project.layout.buildDirectory.dir(SERVERLOGS_PATH), - ISHUNITOUT to project.layout.buildDirectory.dir(ISHUNITOUT_PATH) - ) - } + /** + * Determines the port mappings using + * [com.intershop.gradle.icm.docker.extension.DevelopmentConfiguration.asPortConfiguration] + */ + protected fun getPortMappings(): Set = + with(dockerExtension.developmentConfig.asPortConfiguration){ + setOf( servletEngine.get(), debug.get(), jmx.get() ) + } protected fun getServerVolumes(task: Task, customization: Boolean): Map { addDirectories.forEach { (_, path) -> path.get().asFile.mkdirs() } - prepareSitesFolder(project, extension) + prepareSitesFolder() val volumes = mutableMapOf( - extension.developmentConfig.getConfigProperty(SITES_FOLDER_PATH, - project.layout.buildDirectory.dir("sites_folder").get().asFile.absolutePath) - to "/intershop/sites", - File(extension.developmentConfig.licenseDirectory).absolutePath - to "/intershop/license", - addDirectories.getValue(SERVERLOGS).get().asFile.absolutePath - to "/intershop/logs", - addDirectories.getValue(ISHUNITOUT).get().asFile.absolutePath - to "/intershop/ishunitrunner/output", - project.projectDir.absolutePath - to "/intershop/customizations/${extension.containerPrefix}/cartridges" + dockerExtension.developmentConfig.getConfigProperty( + Configuration.SITES_FOLDER_PATH, + project.layout.buildDirectory.dir("sites_folder").get().asFile.absolutePath) + to "/intershop/sites", + File(dockerExtension.developmentConfig.licenseDirectory).absolutePath + to "/intershop/license", + addDirectories.getValue(TaskPreparer.SERVERLOGS).get().asFile.absolutePath + to "/intershop/logs", + addDirectories.getValue(TaskPreparer.ISHUNITOUT).get().asFile.absolutePath + to "/intershop/ishunitrunner/output", + project.projectDir.absolutePath + to "/intershop/customizations/${dockerExtension.containerPrefix}/cartridges", + "${dockerExtension.containerPrefix}-customizations" + to "/intershop/customizations" ) if(customization) { - volumes[getOutputPathFor(TASK_EXTRACARTRIDGES, "")] = - "/intershop/customizations/additional-dependencies/cartridges" - volumes[getOutputPathFor(TASK_CREATECONFIG, "system-conf")] ="/intershop/system-conf" + volumes[getOutputPathFor(TaskPreparer.TASK_CREATECONFIG, "system-conf")] = "/intershop/system-conf" project.tasks.withType(CopyLibraries::class.java) { task.dependsOn(it) + val dir = it.librariesDirectory.get().asFile volumes[dir.absolutePath] = - "/intershop/customizations/${extension.containerPrefix}-${dir.name}-libs/lib" + "/intershop/customizations/${dockerExtension.containerPrefix}-${dir.name}-libs/lib" } - } - return ContainerUtils.transformVolumes(volumes) } - /** - * Determines the port mappings using - * [com.intershop.gradle.icm.docker.extension.DevelopmentConfiguration.asPortConfiguration] - */ - protected open fun getPortMappings(): Set = - with(extension.developmentConfig.asPortConfiguration){ - setOf( servletEngine.get(), debug.get(), jmx.get() ) + private fun getOutputPathFor(taskName: String, path: String): String { + return if(path.isNotEmpty()) { + File(getOutputDirFor(taskName), path).absolutePath + } else { + getOutputDirFor(taskName).absolutePath } + } + + private fun getOutputDirFor(taskName: String): File { + try { + val task = project.tasks.named(taskName) + return task.get().outputs.files.first() + } catch (ex: UnknownTaskException) { + throw GradleException("Task name '${taskName}' not found in project.") + } + } + + private val addDirectories: Map> by lazy { + mapOf( + TaskPreparer.SERVERLOGS to project.layout.buildDirectory.dir(TaskPreparer.SERVERLOGS_PATH), + TaskPreparer.ISHUNITOUT to project.layout.buildDirectory.dir(TaskPreparer.ISHUNITOUT_PATH) + ) + } - private fun prepareSitesFolder(project: Project, extension: IntershopDockerExtension) { + private fun prepareSitesFolder() { with(project) { - val sitesFolderPath = extension.developmentConfig.getConfigProperty( - SITES_FOLDER_PATH, "" + val sitesFolderPath = dockerExtension.developmentConfig.getConfigProperty( + Configuration.SITES_FOLDER_PATH, "" ) val defaultSitesFolder = - project.layout.buildDirectory.dir("sites_folder").forUseAtConfigurationTime().get().asFile + project.layout.buildDirectory.dir("sites_folder").get().asFile val sitesFolder : File if (sitesFolderPath.isEmpty()) { logger.warn( "There is no configuration for the sites folder. Check '{}' in your icm.properties! \n" + - "The default '{}' value will be used!", - SITES_FOLDER_PATH, + "The default '{}' value will be used!", + Configuration.SITES_FOLDER_PATH, defaultSitesFolder.path ) sitesFolder = defaultSitesFolder @@ -168,8 +174,10 @@ abstract class AbstractTaskPreparer( } else { logger.warn("The sites folder '{}' does not exist -> trying to create", sitesFolder.path) if (!sitesFolder.mkdirs()) { - throw GradleException("The sites folder '${sitesFolder.path}' does not exist, but can not be " + - "created!") + throw GradleException( + "The sites folder '${sitesFolder.path}' does not exist, but can not be " + + "created!" + ) } logger.quiet("Created sites folder '{}'", sitesFolder.path) } @@ -185,34 +193,32 @@ abstract class AbstractTaskPreparer( inheritIO().start() val isTimeout = !process.waitFor(5, TimeUnit.SECONDS) if (isTimeout){ - throw GradleException("Timed out while making the sites folder '${sitesFolder.path}' " + - "accessible to everyone!") + throw GradleException( + "Timed out while making the sites folder '${sitesFolder.path}' " + + "accessible to everyone!" + ) } val exitCode = process.exitValue() if (exitCode != 0){ - throw GradleException("Failed to make the sites folder '${sitesFolder.path}' accessible to " + - "everyone (exitCode=$exitCode)!") + throw GradleException( + "Failed to make the sites folder '${sitesFolder.path}' accessible to " + + "everyone (exitCode=$exitCode)!" + ) } } - } } } - private fun getOutputDirFor(taskName: String): File { + val mailServerTaskProvider: Provider? by lazy { try { - val task = project.tasks.named(taskName) - return task.get().outputs.files.first() + project.tasks.named( + "start${com.intershop.gradle.icm.docker.utils.mail.TaskPreparer.extName}", + StartExtraContainer::class.java + ) } catch (ex: UnknownTaskException) { - throw GradleException("Task name '${taskName}' not found in project.") - } - } - - private fun getOutputPathFor(taskName: String, path: String): String { - return if(path.isNotEmpty()) { - File(getOutputDirFor(taskName), path).absolutePath - } else { - getOutputDirFor(taskName).absolutePath + project.logger.info("MailSrv tasks not found") + null } } } diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appserver/ContainerTaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/ContainerTaskPreparer.kt similarity index 68% rename from src/main/kotlin/com/intershop/gradle/icm/docker/utils/appserver/ContainerTaskPreparer.kt rename to src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/ContainerTaskPreparer.kt index 60b95bd..1dba5e4 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appserver/ContainerTaskPreparer.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/ContainerTaskPreparer.kt @@ -1,5 +1,5 @@ /* - * Copyright 2020 Intershop Communications AG. + * Copyright 2022 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. @@ -14,28 +14,36 @@ * limitations under the License. * */ - -package com.intershop.gradle.icm.docker.utils.appserver +package com.intershop.gradle.icm.docker.utils.appsrv import com.intershop.gradle.icm.docker.tasks.PrepareNetwork import com.intershop.gradle.icm.docker.tasks.StartServerContainer +import com.intershop.gradle.icm.docker.utils.Configuration import org.gradle.api.Project import org.gradle.api.provider.Provider -open class ContainerTaskPreparer( - project: Project, - networkTask: Provider, -) : AbstractTaskPreparer(project, networkTask) { +class ContainerTaskPreparer( + project: Project, + networkTask: Provider +) : AbstractASTaskPreparer(project, networkTask) { companion object { const val extName: String = "Container" } + override fun getImage(): Provider { + if(dockerExtension.developmentConfig.getConfigProperty( + Configuration.AS_USE_TESTIMAGE, + Configuration.AS_USE_TESTIMAGE_VALUE + ).toBoolean()) { + return icmExtension.projectConfig.base.testImage + } + return icmExtension.projectConfig.base.image + } + override fun getExtensionName(): String = extName init { - initBaseTasks() - project.tasks.register("start${this.getExtensionName()}", StartServerContainer::class.java) { task -> configureContainerTask(task) @@ -47,15 +55,13 @@ open class ContainerTaskPreparer( task.entrypoint.set(listOf("/intershop/bin/startAndWait.sh")) task.hostConfig.binds.set(project.provider { - getServerVolumes(task,true).apply { + getServerVolumes(task, true).apply { project.logger.info("Using the following volume binds for container startup in task {}: {}", - task.name, this) + task.name, this) } }) task.withPortMappings(*getPortMappings().toTypedArray()) task.hostConfig.network.set(networkId) - - task.dependsOn(prepareServer, pullTask, networkTask) } } } diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/CustomizationPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/CustomizationPreparer.kt new file mode 100644 index 0000000..c170830 --- /dev/null +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/CustomizationPreparer.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2022 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.appsrv + +import com.intershop.gradle.icm.docker.tasks.PrepareNetwork +import com.intershop.gradle.icm.docker.tasks.StartExtraContainer +import com.intershop.gradle.icm.docker.utils.AbstractTaskPreparer +import org.gradle.api.Project +import org.gradle.api.provider.Provider + +class CustomizationPreparer(project: Project, + networkTask: Provider, + private val customizationName: String, + private val imagePath: Provider) : AbstractTaskPreparer(project, networkTask) { + + companion object { + const val extPrefix: String = "Customization" + } + + override fun getExtensionName(): String = "${customizationName}$extPrefix" + override fun getImage(): Provider = imagePath + + init { + initBaseTasks() + project.tasks.register("start${getExtensionName()}", StartExtraContainer::class.java) { task -> + configureContainerTask(task) + task.description = "Starts customization '${customizationName}'" + + task.targetImageId(project.provider { pullTask.get().image.get() }) + task.image.set(pullTask.get().image) + + task.hostConfig.binds.set( + mutableMapOf( + "${dockerExtension.containerPrefix}-customizations" to "/customizations" + ) + ) + + task.dependsOn(pullTask, networkTask) + } + } +} diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/ICMServerTaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/ICMServerTaskPreparer.kt new file mode 100644 index 0000000..c1c6dc7 --- /dev/null +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/ICMServerTaskPreparer.kt @@ -0,0 +1,109 @@ +/* + * Copyright 2022 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.appsrv + +import com.intershop.gradle.icm.docker.ICMDockerPlugin +import com.intershop.gradle.icm.docker.extension.IntershopDockerExtension +import com.intershop.gradle.icm.docker.tasks.BuildImage +import com.intershop.gradle.icm.docker.tasks.PrepareNetwork +import com.intershop.gradle.icm.docker.tasks.StartServerContainer +import com.intershop.gradle.icm.docker.tasks.utils.ICMContainerEnvironmentBuilder +import com.intershop.gradle.icm.docker.utils.Configuration +import com.intershop.gradle.icm.docker.utils.HostAndPort +import org.gradle.api.Project +import org.gradle.api.provider.Provider +import org.gradle.kotlin.dsl.getByType +import java.net.URI + + +class ICMServerTaskPreparer( + project: Project, + val networkTask: Provider) : AbstractASTaskPreparer(project, networkTask) { + + companion object { + const val extName: String = "AsTestContainer" + } + + override fun getExtensionName(): String = extName + + override fun getImage(): Provider { + val buildTestImageTask = project.tasks.named(ICMDockerPlugin.BUILD_TEST_IMAGE, BuildImage::class.java) + val imageProvider = project.provider { buildTestImageTask.get().images.get() } + return imageProvider.map { it.first() } + } + + init{ + project.tasks.register("start${this.getExtensionName()}", StartServerContainer::class.java) { task -> + configureContainerTask(task) + + task.description = "Starts Production Application Server in a container - only for use in icm-as" + + task.targetImageId(project.provider { pullTask.get().image.get() }) + task.image.set(pullTask.get().image) + + task.hostConfig.binds.set(project.provider { + getServerVolumes(task, false).apply { + project.logger.info( + "Using the following volume binds for container startup in task {}: {}", + task.name, this + ) + } + }) + + task.withPortMappings(*getPortMappings().toTypedArray()) + + task.hostConfig.network.set(networkId) + task.withEnvironment( + ICMContainerEnvironmentBuilder() + .withClasspathLayout( + setOf( + ICMContainerEnvironmentBuilder.ClasspathLayout.RELEASE, + ICMContainerEnvironmentBuilder.ClasspathLayout.SOURCE + ) + ) + .withContainerName(getContainerName()) + .build() + ) + + val devConfig = project.extensions.getByType().developmentConfig + task.withHttpProbe( + URI.create( + StartServerContainer.PATTERN_READINESS_PROBE_URL.format( + devConfig.asPortConfiguration.servletEngine.get().hostPort + ) + ), + devConfig.getDurationProperty( + Configuration.AS_READINESS_PROBE_INTERVAL, + Configuration.AS_READINESS_PROBE_INTERVAL_VALUE + ), + devConfig.getDurationProperty( + Configuration.AS_READINESS_PROBE_TIMEOUT, + Configuration.AS_READINESS_PROBE_TIMEOUT_VALUE + ) + ) + + if(mailServerTaskProvider != null) { + task.mailServer = project.provider { + HostAndPort( + mailServerTaskProvider!!.get().containerName.get(), + mailServerTaskProvider!!.get().getPrimaryPortMapping().get().containerPort + ) + } + } + } + } +} diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/ServerTaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/ServerTaskPreparer.kt new file mode 100644 index 0000000..bff341f --- /dev/null +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/ServerTaskPreparer.kt @@ -0,0 +1,135 @@ +/* + * Copyright 2022 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.appsrv + +import com.intershop.gradle.icm.docker.extension.IntershopDockerExtension +import com.intershop.gradle.icm.docker.tasks.PrepareNetwork +import com.intershop.gradle.icm.docker.tasks.StartExtraContainer +import com.intershop.gradle.icm.docker.tasks.StartServerContainer +import com.intershop.gradle.icm.docker.tasks.utils.ICMContainerEnvironmentBuilder +import com.intershop.gradle.icm.docker.utils.Configuration +import com.intershop.gradle.icm.docker.utils.HostAndPort +import com.intershop.gradle.icm.docker.utils.solrcloud.ZKPreparer +import org.gradle.api.Project +import org.gradle.api.UnknownTaskException +import org.gradle.api.provider.Provider +import org.gradle.kotlin.dsl.getByType +import java.net.URI + +class ServerTaskPreparer( + project: Project, + val networkTask: Provider) : AbstractASTaskPreparer(project, networkTask) { + + companion object { + const val extName: String = "AS" + } + + override fun getImage(): Provider { + if(dockerExtension.developmentConfig.getConfigProperty( + Configuration.AS_USE_TESTIMAGE, + Configuration.AS_USE_TESTIMAGE_VALUE + ).toBoolean()) { + return icmExtension.projectConfig.base.testImage + } + return icmExtension.projectConfig.base.image + } + + override fun getExtensionName(): String = extName + + init { + project.tasks.register("start${this.getExtensionName()}", StartServerContainer::class.java) { task -> + configureContainerTask(task) + + task.description = "Starts Production Application Server in a container" + + task.targetImageId(project.provider { pullTask.get().image.get() }) + task.image.set(pullTask.get().image) + + task.hostConfig.binds.set(project.provider { + getServerVolumes(task, true).apply { + project.logger.info( + "Using the following volume binds for container startup in task {}: {}", + task.name, this + ) + } + }) + + task.withPortMappings(*getPortMappings().toTypedArray()) + + task.hostConfig.network.set(networkId) + task.withEnvironment( + ICMContainerEnvironmentBuilder() + .withClasspathLayout( + setOf( + ICMContainerEnvironmentBuilder.ClasspathLayout.RELEASE, + ICMContainerEnvironmentBuilder.ClasspathLayout.SOURCE + ) + ) + .withContainerName(getContainerName()) + .build() + ) + + val devConfig = project.extensions.getByType().developmentConfig + task.withHttpProbe( + URI.create( + StartServerContainer.PATTERN_READINESS_PROBE_URL.format( + devConfig.asPortConfiguration.servletEngine.get().hostPort + ) + ), + devConfig.getDurationProperty( + Configuration.AS_READINESS_PROBE_INTERVAL, + Configuration.AS_READINESS_PROBE_INTERVAL_VALUE + ), + devConfig.getDurationProperty( + Configuration.AS_READINESS_PROBE_TIMEOUT, + Configuration.AS_READINESS_PROBE_TIMEOUT_VALUE + ) + ) + + if(zkTaskProvider != null) { + task.solrCloudZookeeperHostList = project.provider { + val containerPort = zkTaskProvider!!.get().getPortMappings().stream() + .filter { it.name == ZKPreparer.CONTAINER_PORTMAPPING } + .findFirst().get().containerPort + "${zkTaskProvider!!.get().containerName.get()}:${containerPort}" + } + } + + if(mailServerTaskProvider != null) { + task.mailServer = project.provider { + HostAndPort( + mailServerTaskProvider!!.get().containerName.get(), + mailServerTaskProvider!!.get().getPrimaryPortMapping().get().containerPort + ) + } + } + } + } + + private val zkTaskProvider: Provider? by lazy { + try { + project.tasks.named( + "start${ZKPreparer.extName}", + StartExtraContainer::class.java + ) + } catch (ex: UnknownTaskException) { + project.logger.info("ZooKeeper tasks not found") + null + } + } +} + diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/TaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/TaskPreparer.kt new file mode 100644 index 0000000..88b9a8e --- /dev/null +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/TaskPreparer.kt @@ -0,0 +1,136 @@ +/* + * Copyright 2022 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.appsrv + +import com.intershop.gradle.icm.docker.extension.IntershopDockerExtension +import com.intershop.gradle.icm.docker.tasks.CreateVolumes +import com.intershop.gradle.icm.docker.tasks.PrepareNetwork +import com.intershop.gradle.icm.docker.tasks.RemoveContainerByName +import com.intershop.gradle.icm.docker.tasks.RemoveVolumes +import com.intershop.gradle.icm.docker.tasks.StartExtraContainer +import com.intershop.gradle.icm.docker.utils.Configuration +import com.intershop.gradle.icm.extension.IntershopExtension +import org.gradle.api.Project +import org.gradle.api.Task +import org.gradle.api.provider.Provider +import org.gradle.api.tasks.TaskProvider +import org.gradle.kotlin.dsl.getByType + +class TaskPreparer (val project: Project, private val networkTask: Provider) { + + companion object { + const val SERVERLOGS = "serverlogs" + const val SERVERLOGS_PATH = "server/logs" + + const val ISHUNITOUT = "ishunitout" + const val ISHUNITOUT_PATH = "ishunitrunner/output" + + const val TASK_PREPARESERVER = "prepareServer" + const val TASK_CREATECONFIG = "createConfig" + + const val TASK_EXT_VOLUMES = "ASVolumes" + } + + private val dockerExtension = project.extensions.getByType() + private val icmExtension = project.extensions.getByType() + + private var containerTaskPreparer: AbstractASTaskPreparer + private var serverTaskPreparer: AbstractASTaskPreparer + //private var icmServerTaskPreparer: AbstractASTaskPreparer + + init { + val containerVolumes = mapOf( + "${dockerExtension.containerPrefix}-customizations" to "/customizations") + + val createVolumes = + project.tasks.register("create${TASK_EXT_VOLUMES}", CreateVolumes::class.java) { task -> + configureASTasks(task, "Creates volumes in Docker") + task.volumeNames.set( containerVolumes.keys ) + } + + val removeVolumes = + project.tasks.register( + "remove${TASK_EXT_VOLUMES}", + RemoveVolumes::class.java) { task -> + configureASTasks(task, "Removes volumes from Docker") + task.volumeNames.set( containerVolumes.keys ) + } + + val customizationStartTasks = mutableSetOf>() + val customizationRemoveTasks = mutableSetOf>() + icmExtension.projectConfig.modules.all { + val useTest = dockerExtension.developmentConfig. + getConfigProperty(Configuration.AS_USE_TESTIMAGE).toBoolean() + val imagePath = if (useTest || ! it.testImage.isPresent) { it.image } else { it.testImage } + val cp = CustomizationPreparer(project, networkTask, it.name, imagePath) + + cp.startTask.configure { + it.dependsOn(createVolumes) + } + customizationStartTasks.add(cp.startTask) + customizationRemoveTasks.add(cp.removeTask) + } + + containerTaskPreparer = ContainerTaskPreparer(project, networkTask) + containerTaskPreparer.startTask.configure { + it.dependsOn(customizationStartTasks, containerTaskPreparer.prepareServer, + containerTaskPreparer.pullTask, networkTask) + } + + containerTaskPreparer.removeTask.configure { + it.dependsOn(customizationRemoveTasks) + it.finalizedBy(removeVolumes) + } + + containerTaskPreparer.stopTask.configure { + it.dependsOn(customizationRemoveTasks) + it.finalizedBy(removeVolumes) + } + + serverTaskPreparer = ServerTaskPreparer(project, networkTask) + serverTaskPreparer.startTask.configure { + it.dependsOn(customizationStartTasks, serverTaskPreparer.prepareServer, + serverTaskPreparer.pullTask, networkTask) + } + + serverTaskPreparer.removeTask.configure { + it.dependsOn(customizationRemoveTasks) + it.finalizedBy(removeVolumes) + } + + serverTaskPreparer.stopTask.configure { + it.dependsOn(customizationRemoveTasks) + it.finalizedBy(removeVolumes) + } + + //icmServerTaskPreparer = ServerTaskPreparer(project, networkTask, true) + //icmServerTaskPreparer.startTask.configure { + // it.dependsOn(customizationContainer, icmServerTaskPreparer.pullTask, networkTask) + //} + } + + fun getContainerTaskPreparer() = containerTaskPreparer + + fun getServerTaskPreparer() = serverTaskPreparer + + //fun getICMServerTaskPreparer() = icmServerTaskPreparer + + private fun configureASTasks(task: Task, description: String) { + task.group = "icm container appserver " + task.description = description + } +} diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/TestTaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/TestTaskPreparer.kt new file mode 100644 index 0000000..60ede93 --- /dev/null +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/appsrv/TestTaskPreparer.kt @@ -0,0 +1,99 @@ +/* + * Copyright 2022 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.appsrv + +import com.intershop.gradle.icm.docker.extension.IntershopDockerExtension +import com.intershop.gradle.icm.docker.tasks.CreateVolumes +import com.intershop.gradle.icm.docker.tasks.PrepareNetwork +import com.intershop.gradle.icm.docker.tasks.RemoveContainerByName +import com.intershop.gradle.icm.docker.tasks.RemoveVolumes +import com.intershop.gradle.icm.docker.tasks.StartExtraContainer +import com.intershop.gradle.icm.docker.utils.Configuration +import com.intershop.gradle.icm.extension.IntershopExtension +import org.gradle.api.Project +import org.gradle.api.Task +import org.gradle.api.provider.Provider +import org.gradle.api.tasks.TaskProvider +import org.gradle.kotlin.dsl.getByType + +class TestTaskPreparer (val project: Project, private val networkTask: Provider) { + + companion object { + const val TASK_EXT_VOLUMES = "ASVolumes" + } + + private val dockerExtension = project.extensions.getByType() + private val icmExtension = project.extensions.getByType() + + private var icmServerTaskPreparer: AbstractASTaskPreparer + + init { + val containerVolumes = mapOf( + "${dockerExtension.containerPrefix}-customizations" to "/customizations") + + val createVolumes = + project.tasks.register("create${TASK_EXT_VOLUMES}", CreateVolumes::class.java) { task -> + configureASTasks(task, "Creates volumes in Docker") + task.volumeNames.set( containerVolumes.keys ) + } + + val removeVolumes = + project.tasks.register( + "remove${TASK_EXT_VOLUMES}", + RemoveVolumes::class.java) { task -> + configureASTasks(task, "Removes volumes from Docker") + task.volumeNames.set( containerVolumes.keys ) + } + + val customizationStartTasks = mutableSetOf>() + val customizationRemoveTasks = mutableSetOf>() + icmExtension.projectConfig.modules.all { + val useTest = dockerExtension.developmentConfig. + getConfigProperty(Configuration.AS_USE_TESTIMAGE).toBoolean() + val imagePath = if (useTest || ! it.testImage.isPresent) { it.image } else { it.testImage } + val cp = CustomizationPreparer(project, networkTask, it.name, imagePath) + + cp.startTask.configure { + it.dependsOn(createVolumes) + } + customizationStartTasks.add(cp.startTask) + customizationRemoveTasks.add(cp.removeTask) + } + + icmServerTaskPreparer = ICMServerTaskPreparer(project, networkTask) + icmServerTaskPreparer.startTask.configure { + it.dependsOn(customizationStartTasks, icmServerTaskPreparer.pullTask, networkTask) + } + + icmServerTaskPreparer.removeTask.configure { + it.dependsOn(customizationRemoveTasks) + it.finalizedBy(removeVolumes) + } + + icmServerTaskPreparer.stopTask.configure { + it.dependsOn(customizationRemoveTasks) + it.finalizedBy(removeVolumes) + } + } + + fun getICMServerTaskPreparer() = icmServerTaskPreparer + + private fun configureASTasks(task: Task, description: String) { + task.group = "icm container appserver " + task.description = description + } +} diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/mail/TaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/mail/TaskPreparer.kt index 3befd08..e7fbfce 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/mail/TaskPreparer.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/mail/TaskPreparer.kt @@ -36,7 +36,7 @@ class TaskPreparer(project: Project, } override fun getExtensionName(): String = extName - override fun getImage(): Provider = extension.images.mailsrv + override fun getImage(): Provider = dockerExtension.images.mailsrv init { initBaseTasks() diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/mail/TestTaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/mail/TestTaskPreparer.kt index dd2bdfe..6b6bd4d 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/mail/TestTaskPreparer.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/mail/TestTaskPreparer.kt @@ -14,7 +14,6 @@ * limitations under the License. * */ - package com.intershop.gradle.icm.docker.utils.mail import com.intershop.gradle.icm.docker.tasks.PrepareNetwork @@ -24,7 +23,7 @@ import com.intershop.gradle.icm.docker.utils.ContainerUtils import org.gradle.api.Project import org.gradle.api.provider.Provider -class TestTaskPreparer(project: Project, +open class TestTaskPreparer(project: Project, networkTask: Provider) : AbstractTaskPreparer(project, networkTask) { companion object { @@ -32,7 +31,7 @@ class TestTaskPreparer(project: Project, } override fun getExtensionName(): String = extName - override fun getImage(): Provider = extension.images.testmailsrv + override fun getImage(): Provider = dockerExtension.images.testmailsrv init { initBaseTasks() diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/mssql/TaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/mssql/TaskPreparer.kt index 5b8fca3..e604729 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/mssql/TaskPreparer.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/mssql/TaskPreparer.kt @@ -34,7 +34,7 @@ class TaskPreparer(project: Project, } override fun getExtensionName(): String = extName - override fun getImage(): Provider = extension.images.mssqldb + override fun getImage(): Provider = dockerExtension.images.mssqldb init { initBaseTasks() @@ -48,7 +48,7 @@ class TaskPreparer(project: Project, val portMapping : PortMapping val dbName : String - with(extension.developmentConfig) { + with(dockerExtension.developmentConfig) { portMapping = getPortMapping("JDBC", Configuration.DB_MSSQL_PORT, Configuration.DB_MSSQL_PORT_VALUE, @@ -103,24 +103,24 @@ class TaskPreparer(project: Project, // add data path if configured val dataPath = getConfigProperty(Configuration.DATA_FOLDER_PATH,"") - val dataPahtFP = if(dataPath.isNullOrBlank()) { + val dataPahtFP = if(dataPath.isBlank()) { project.layout.buildDirectory.dir("data_folder").get().asFile } else { File(dataPath) } - volumeMap[dataPahtFP.absolutePath] = extension.developmentConfig.getConfigProperty( + volumeMap[dataPahtFP.absolutePath] = dockerExtension.developmentConfig.getConfigProperty( Configuration.DATA_FOLDER_VOLUME, Configuration.DATA_FOLDER_VOLUME_VALUE) // add backup folder - default is build directory - var backupPath = getConfigProperty(Configuration.BACKUP_FOLDER_PATH) - val backupPathFP = if(backupPath.isNullOrBlank()) { + val backupPath = getConfigProperty(Configuration.BACKUP_FOLDER_PATH) + val backupPathFP = if(backupPath.isBlank()) { project.layout.buildDirectory.dir("data_backup_folder").get().asFile } else { File(backupPath) } - volumeMap[backupPathFP.absolutePath] = extension.developmentConfig.getConfigProperty( + volumeMap[backupPathFP.absolutePath] = dockerExtension.developmentConfig.getConfigProperty( Configuration.BACKUP_FOLDER_VOLUME, Configuration.BACKUP_FOLDER_VOLUME_VALUE) diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/oracle/TaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/oracle/TaskPreparer.kt index 69d87df..1926398 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/oracle/TaskPreparer.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/oracle/TaskPreparer.kt @@ -32,7 +32,7 @@ class TaskPreparer(project: Project, } override fun getExtensionName(): String = extName - override fun getImage(): Provider = extension.images.oracledb + override fun getImage(): Provider = dockerExtension.images.oracledb init { initBaseTasks() @@ -44,7 +44,7 @@ class TaskPreparer(project: Project, task.targetImageId(project.provider { pullTask.get().image.get() }) task.image.set(pullTask.get().image) - with(extension.developmentConfig) { + with(dockerExtension.developmentConfig) { val port = getConfigProperty( Configuration.DB_ORACLE_PORT, Configuration.DB_ORACLE_PORT_VALUE @@ -68,7 +68,7 @@ class TaskPreparer(project: Project, "${listenerPort}:${containerListenerPort}") ) } - with(extension.developmentConfig) { + with(dockerExtension.developmentConfig) { project.logger.quiet( "The database can be connected with jdbc:oracle:thin:@{}:{}:XE", task.containerName.get(), diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/solrcloud/SolrPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/solrcloud/SolrPreparer.kt index a3e558d..b15b921 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/solrcloud/SolrPreparer.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/solrcloud/SolrPreparer.kt @@ -29,24 +29,24 @@ class SolrPreparer( networkTask: Provider, zkPreparer: ZKPreparer, ) : AbstractTaskPreparer(project, networkTask) { - val zookeeperHostList : Provider companion object { const val extName: String = "Solr" const val CONTAINER_PORT = 8983 + const val GROUP_NAME = "icm container solrcloud" } override fun getExtensionName(): String = extName - override fun getImage(): Provider = extension.images.solr + override fun getImage(): Provider = dockerExtension.images.solr init { initBaseTasks() pullTask.configure { - it.group = "icm container solrcloud" + it.group = GROUP_NAME } stopTask.configure { - it.group = "icm container solrcloud" + it.group = GROUP_NAME it.dependsOn(zkPreparer.stopTask) } removeTask.configure { @@ -54,18 +54,15 @@ class SolrPreparer( it.dependsOn(zkPreparer.removeTask) } - val hostList = zkPreparer.renderedHostList - zookeeperHostList = project.provider { zkPreparer.renderedHostList } - project.tasks.register("start${getExtensionName()}", StartExtraContainer::class.java) { task -> configureContainerTask(task) - task.group = "icm container solrcloud" + task.group = GROUP_NAME task.description = "Start Solr component of SolrCloud" task.targetImageId(project.provider { pullTask.get().image.get() }) task.image.set(pullTask.get().image) - val portMapping = extension.developmentConfig.getPortMapping( + val portMapping = dockerExtension.developmentConfig.getPortMapping( "SOLR", Configuration.SOLR_CLOUD_HOST_PORT, Configuration.SOLR_CLOUD_HOST_PORT_VALUE, @@ -76,7 +73,7 @@ class SolrPreparer( task.envVars.set( mutableMapOf( "SOLR_PORT" to portMapping.containerPort.toString(), - "ZK_HOST" to hostList, + "ZK_HOST" to zkPreparer.renderedHostPort, "SOLR_HOST" to "${IPFinder.getSystemIP().first}", "SOLR_OPTS" to "-Dsolr.disableConfigSetsCreateAuthChecks=true" ) diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/solrcloud/StartSolrCloudTask.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/solrcloud/StartSolrCloudTask.kt deleted file mode 100644 index 954c262..0000000 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/solrcloud/StartSolrCloudTask.kt +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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.solrcloud - -import org.gradle.api.DefaultTask -import org.gradle.api.tasks.Internal -import javax.inject.Inject - -/** - * Ext. of [DefaultTask] that just provides the [SolrPreparer.zookeeperHostList] by - * [zookeeperHostList]. - */ -open class StartSolrCloudTask @Inject constructor(solrPreparer:SolrPreparer) : DefaultTask() { - - @Internal - val zookeeperHostList = solrPreparer.zookeeperHostList - -} diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/solrcloud/TaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/solrcloud/TaskPreparer.kt index e130df6..709a21a 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/solrcloud/TaskPreparer.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/solrcloud/TaskPreparer.kt @@ -35,10 +35,7 @@ class TaskPreparer( val solrTasks = SolrPreparer(project, networkTasks.createNetworkTask, zkTasks) project.tasks.register( - "start${TASK_EXT_SERVER}", - StartSolrCloudTask::class.java, - solrTasks - ).configure { task -> + "start${TASK_EXT_SERVER}").configure { task -> configureSolrCloudTasks(task, "Start all components of a one note SolrCloud cluster") task.dependsOn(zkTasks.startTask, solrTasks.startTask, networkTasks.createNetworkTask) } @@ -58,8 +55,8 @@ class TaskPreparer( } } - val startTask: TaskProvider by lazy { - project.tasks.named("start${TASK_EXT_SERVER}", StartSolrCloudTask::class.java) + val startTask: TaskProvider by lazy { + project.tasks.named("start${TASK_EXT_SERVER}") } val stopTask: TaskProvider by lazy { diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/solrcloud/ZKPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/solrcloud/ZKPreparer.kt index ead1847..27ab10e 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/solrcloud/ZKPreparer.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/solrcloud/ZKPreparer.kt @@ -20,6 +20,8 @@ import com.intershop.gradle.icm.docker.tasks.PrepareNetwork import com.intershop.gradle.icm.docker.tasks.StartExtraContainer import com.intershop.gradle.icm.docker.utils.AbstractTaskPreparer import com.intershop.gradle.icm.docker.utils.Configuration +import com.intershop.gradle.icm.docker.utils.PortMapping +import com.intershop.gradle.icm.docker.utils.solrcloud.SolrPreparer.Companion.GROUP_NAME import org.gradle.api.Project import org.gradle.api.provider.Provider @@ -27,44 +29,36 @@ class ZKPreparer( project: Project, networkTask: Provider, ) : AbstractTaskPreparer(project, networkTask) { - val renderedHostList: String companion object { const val extName: String = "ZK" const val CONTAINER_PORT = 2181 const val CONTAINER_METRICS_PORT = 7000 + const val CONTAINER_PORTMAPPING = "CONTAINER" } override fun getExtensionName(): String = extName - override fun getImage(): Provider = extension.images.zookeeper + override fun getImage(): Provider = dockerExtension.images.zookeeper init { initBaseTasks() pullTask.configure { - it.group = "icm container solrcloud" + it.group = GROUP_NAME } stopTask.configure { - it.group = "icm container solrcloud" + it.group = GROUP_NAME } removeTask.configure { - it.group = "icm container solrcloud" + it.group = GROUP_NAME } - val portMapping = extension.developmentConfig.getPortMapping( - "CONTAINER", - Configuration.ZOOKEEPER_HOST_PORT, - Configuration.ZOOKEEPER_HOST_PORT_VALUE, - CONTAINER_PORT, - true - ) - val metricsPortMapping = extension.developmentConfig.getPortMapping( + val metricsPortMapping = dockerExtension.developmentConfig.getPortMapping( "METRICS", Configuration.ZOOKEEPER_METRICS_HOST_PORT, Configuration.ZOOKEEPER_METRICS_HOST_PORT_VALUE, CONTAINER_METRICS_PORT, ) - renderedHostList = "${getContainerName()}:${portMapping.containerPort}" project.tasks.register("start${getExtensionName()}", StartExtraContainer::class.java) { task -> configureContainerTask(task) @@ -101,4 +95,18 @@ class ZKPreparer( } } + private val portMapping: PortMapping by lazy { + dockerExtension.developmentConfig.getPortMapping( + CONTAINER_PORTMAPPING, + Configuration.ZOOKEEPER_HOST_PORT, + Configuration.ZOOKEEPER_HOST_PORT_VALUE, + CONTAINER_PORT, + true + ) + } + + val renderedHostPort : String by lazy { + "${getContainerName()}:${portMapping.containerPort}" + } + } diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/webserver/TaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/webserver/TaskPreparer.kt index e5369b6..2b48652 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/webserver/TaskPreparer.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/webserver/TaskPreparer.kt @@ -33,7 +33,6 @@ class TaskPreparer(val project: Project, private val networkTasks: NetworkPrepar companion object { const val TASK_EXT_VOLUMES = "WebVolumes" const val TASK_EXT_SERVER = "WebServer" - } private val extension = project.extensions.getByType() @@ -73,10 +72,6 @@ class TaskPreparer(val project: Project, private val networkTasks: NetworkPrepar it.dependsOn(createVolumes) } - removeVolumes.configure { - it.dependsOn(waTasks.removeTask, waaTasks.removeTask) - } - waaTasks.startTask.configure { it.dependsOn(createVolumes, waTasks.startTask) } @@ -89,6 +84,7 @@ class TaskPreparer(val project: Project, private val networkTasks: NetworkPrepar project.tasks.register("stop${TASK_EXT_SERVER}") { task -> configureWebServerTasks(task, "Stop all components for ICM WebServer") task.dependsOn(waTasks.stopTask, waaTasks.stopTask) + task.finalizedBy(removeVolumes) } networkTasks.removeNetworkTask.configure { @@ -98,6 +94,7 @@ class TaskPreparer(val project: Project, private val networkTasks: NetworkPrepar project.tasks.register("remove${TASK_EXT_SERVER}") { task -> configureWebServerTasks(task, "Removes all components for ICM WebServer") task.dependsOn(waTasks.removeTask, waaTasks.removeTask) + task.finalizedBy(removeVolumes) } } diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/webserver/WAATaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/webserver/WAATaskPreparer.kt index 41a4baa..752b06d 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/webserver/WAATaskPreparer.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/webserver/WAATaskPreparer.kt @@ -20,7 +20,7 @@ import com.intershop.gradle.icm.docker.tasks.PrepareNetwork import com.intershop.gradle.icm.docker.tasks.StartExtraContainer import com.intershop.gradle.icm.docker.utils.AbstractTaskPreparer import com.intershop.gradle.icm.docker.utils.Configuration -import com.intershop.gradle.icm.docker.utils.appserver.CustomServerTaskPreparer +import com.intershop.gradle.icm.docker.utils.appsrv.ServerTaskPreparer import org.gradle.api.Project import org.gradle.api.provider.Provider @@ -30,22 +30,23 @@ class WAATaskPreparer(project: Project, companion object { const val extName: String = "WAA" + const val GROUP_NAME: String = "icm container webserver" } override fun getExtensionName(): String = extName - override fun getImage(): Provider = extension.images.webadapteragent + override fun getImage(): Provider = dockerExtension.images.webadapteragent init{ initBaseTasks() pullTask.configure { - it.group = "icm container webserver" + it.group = GROUP_NAME } stopTask.configure { - it.group = "icm container webserver" + it.group = GROUP_NAME } removeTask.configure { - it.group = "icm container webserver" + it.group = GROUP_NAME } project.tasks.register("start${getExtensionName()}", StartExtraContainer::class.java) { task -> @@ -56,7 +57,7 @@ class WAATaskPreparer(project: Project, task.targetImageId(project.provider { pullTask.get().image.get() }) task.image.set(pullTask.get().image) - with(extension.developmentConfig) { + with(dockerExtension.developmentConfig) { val asHTTPPort = if (appserverAsContainer) { getIntProperty( Configuration.AS_CONNECTOR_CONTAINER_PORT, @@ -70,7 +71,7 @@ class WAATaskPreparer(project: Project, } val asHostname = if (appserverAsContainer) { - "${extension.containerPrefix}-${CustomServerTaskPreparer.extName}" + "${dockerExtension.containerPrefix}-${ServerTaskPreparer.extName}" } else { getConfigProperty( Configuration.LOCAL_CONNECTOR_HOST, diff --git a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/webserver/WATaskPreparer.kt b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/webserver/WATaskPreparer.kt index 979ede3..0370745 100644 --- a/src/main/kotlin/com/intershop/gradle/icm/docker/utils/webserver/WATaskPreparer.kt +++ b/src/main/kotlin/com/intershop/gradle/icm/docker/utils/webserver/WATaskPreparer.kt @@ -26,8 +26,8 @@ import com.intershop.gradle.icm.docker.utils.Configuration.WS_READINESS_PROBE_IN import com.intershop.gradle.icm.docker.utils.Configuration.WS_READINESS_PROBE_INTERVAL_VALUE import com.intershop.gradle.icm.docker.utils.Configuration.WS_READINESS_PROBE_TIMEOUT import com.intershop.gradle.icm.docker.utils.Configuration.WS_READINESS_PROBE_TIMEOUT_VALUE -import com.intershop.gradle.icm.docker.utils.appserver.CustomServerTaskPreparer -import com.intershop.gradle.icm.utils.SocketProbe +import com.intershop.gradle.icm.docker.utils.appsrv.ServerTaskPreparer +import com.intershop.gradle.icm.docker.utils.webserver.WAATaskPreparer.Companion.GROUP_NAME import org.gradle.api.Project import org.gradle.api.provider.Provider @@ -42,7 +42,7 @@ class WATaskPreparer( } override fun getExtensionName(): String = extName - override fun getImage(): Provider = extension.images.webadapter + override fun getImage(): Provider = dockerExtension.images.webadapter val httpContainerPort: Int @@ -50,23 +50,23 @@ class WATaskPreparer( initBaseTasks() pullTask.configure { - it.group = "icm container webserver" + it.group = GROUP_NAME } stopTask.configure { - it.group = "icm container webserver" + it.group = GROUP_NAME } removeTask.configure { - it.group = "icm container webserver" + it.group = GROUP_NAME } - val httpPortMapping = extension.developmentConfig.getPortMapping( + val httpPortMapping = dockerExtension.developmentConfig.getPortMapping( "http", Configuration.WS_HTTP_PORT, Configuration.WS_HTTP_PORT_VALUE, Configuration.WS_CONTAINER_HTTP_PORT, Configuration.WS_CONTAINER_HTTP_PORT_VALUE, ) - val httpsPortMapping = extension.developmentConfig.getPortMapping( + val httpsPortMapping = dockerExtension.developmentConfig.getPortMapping( "https", Configuration.WS_HTTPS_PORT, Configuration.WS_HTTPS_PORT_VALUE, @@ -84,7 +84,7 @@ class WATaskPreparer( task.targetImageId(project.provider { pullTask.get().image.get() }) task.image.set(pullTask.get().image) - with(extension.developmentConfig) { + with(dockerExtension.developmentConfig) { task.withPortMappings(httpPortMapping, httpsPortMapping) val env = ContainerEnvironment() @@ -113,7 +113,7 @@ class WATaskPreparer( val port: Int if (appserverAsContainer) { // started as container - host = "${extension.containerPrefix}-${CustomServerTaskPreparer.extName.lowercase()}" + host = "${dockerExtension.containerPrefix}-${ServerTaskPreparer.extName.lowercase()}" port = portMapping.containerPort } else { @@ -135,7 +135,7 @@ class WATaskPreparer( task.hostConfig.binds.set(volumes) // add socketProbes to http and https ports - with(extension.developmentConfig) { + with(dockerExtension.developmentConfig) { task.withSocketProbe( httpPortMapping.hostPort, getDurationProperty(WS_READINESS_PROBE_INTERVAL, WS_READINESS_PROBE_INTERVAL_VALUE), 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 dc38b52..f2ea320 100644 --- a/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerPluginIntegegrationSpec.groovy +++ b/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerPluginIntegegrationSpec.groovy @@ -18,8 +18,6 @@ package com.intershop.gradle.icm.docker import com.intershop.gradle.icm.docker.util.TestRepo import com.intershop.gradle.test.AbstractIntegrationGroovySpec -import spock.lang.Ignore - import static org.gradle.testkit.runner.TaskOutcome.SUCCESS import static org.gradle.testkit.runner.TaskOutcome.SKIPPED @@ -49,11 +47,16 @@ class ICMDockerPluginIntegegrationSpec extends AbstractIntegrationGroovySpec { group = 'com.intershop.test' version = '10.0.0' - intershop_docker { - images { - icmbase = 'intershopmock/icm-as-mock:latest' + intershop { + projectConfig { + base { + dependency.set("com.intershop.icm:icm-as:1.0.0") + image.set("intershopmock/icm-as-mock:latest") + } } + } + intershop_docker { imageBuild { images { mainImage { @@ -198,7 +201,7 @@ class ICMDockerPluginIntegegrationSpec extends AbstractIntegrationGroovySpec { plugins { id 'java' id 'com.intershop.gradle.icm.project' version '4.3.0' - id 'com.intershop.gradle.icm.docker.project' + id 'com.intershop.gradle.icm.docker.customization' id 'com.intershop.gradle.icm.docker.solrcloud' } @@ -207,30 +210,24 @@ class ICMDockerPluginIntegegrationSpec extends AbstractIntegrationGroovySpec { intershop { projectConfig { - - cartridges = [ 'com.intershop.cartridge:cartridge_test:1.0.0', - 'prjCartridge_prod', - 'com.intershop.cartridge:cartridge_dev:1.0.0', - 'com.intershop.cartridge:cartridge_adapter:1.0.0', - 'prjCartridge_adapter', - 'prjCartridge_dev', - 'prjCartridge_test', - 'com.intershop.cartridge:cartridge_prod:1.0.0' ] - - dbprepareCartridges = [ 'prjCartridge_prod', - 'prjCartridge_test' ] base { dependency.set("com.intershop.icm:icm-as:1.0.0") platforms = [ "com.intershop:libbom:1.0.0" ] + image.set("intershopmock/icm-as-mock:latest") + testImage.set("intershopmock/icm-as-mock:latest") } modules { solrExt { dependency.set("com.intershop.search:solrcloud:1.0.0") + image.set("intershophub/icm-as:11.0.1") + testImage.set("intershopmock/icm-as-mock:latest") } paymentExt { dependency.set("com.intershop.payment:paymenttest:1.0.0") + image.set("intershophub/icm-as:11.0.1") + testImage.set("intershopmock/icm-as-mock:latest") } } @@ -280,7 +277,6 @@ class ICMDockerPluginIntegegrationSpec extends AbstractIntegrationGroovySpec { intershop_docker { images { - icmbase = 'intershopmock/icm-as-mock:latest' mssqldb = 'mcr.microsoft.com/mssql/server:2019-CU4-ubuntu-16.04' solr = 'solr:8.5.2-slim' @@ -442,7 +438,7 @@ class ICMDockerPluginIntegegrationSpec extends AbstractIntegrationGroovySpec { plugins { id 'java' id 'com.intershop.gradle.icm.project' version '4.3.0' - id 'com.intershop.gradle.icm.docker.project' + id 'com.intershop.gradle.icm.docker.customization' } group = 'com.intershop.test' @@ -450,22 +446,11 @@ class ICMDockerPluginIntegegrationSpec extends AbstractIntegrationGroovySpec { intershop { projectConfig { - - cartridges = [ 'com.intershop.cartridge:cartridge_test:1.0.0', - 'prjCartridge_prod', - 'com.intershop.cartridge:cartridge_dev:1.0.0', - 'com.intershop.cartridge:cartridge_adapter:1.0.0', - 'prjCartridge_adapter', - 'prjCartridge_dev', - 'prjCartridge_test', - 'com.intershop.cartridge:cartridge_prod:1.0.0' ] - - dbprepareCartridges = [ 'prjCartridge_prod', - 'prjCartridge_test' ] base { dependency = "com.intershop.icm:icm-as:1.0.0" platforms = [ "com.intershop:libbom:1.0.0" ] + image.set("intershopmock/icm-as-mock:latest") } modules { @@ -517,10 +502,6 @@ class ICMDockerPluginIntegegrationSpec extends AbstractIntegrationGroovySpec { } intershop_docker { - images { - icmbase = 'intershopmock/icm-as-mock:latest' - } - ishUnitTests { test1 { cartridge = 'ac_solr_cloud_test' @@ -651,30 +632,20 @@ class ICMDockerPluginIntegegrationSpec extends AbstractIntegrationGroovySpec { intershop { projectConfig { - - cartridges = [ 'com.intershop.cartridge:cartridge_test:1.0.0', - 'prjCartridge_prod', - 'com.intershop.cartridge:cartridge_dev:1.0.0', - 'com.intershop.cartridge:cartridge_adapter:1.0.0', - 'prjCartridge_adapter', - 'prjCartridge_dev', - 'prjCartridge_test', - 'com.intershop.cartridge:cartridge_prod:1.0.0' ] - - dbprepareCartridges = [ 'prjCartridge_prod', - 'prjCartridge_test' ] - base { dependency.set("com.intershop.icm:icm-as:1.0.0") platforms = [ "com.intershop:libbom:1.0.0" ] + image.set("intershopmock/icm-as-mock:latest") } modules { solrExt { dependency.set("com.intershop.search:solrcloud:1.0.0") + image.set("intershophub/icm-as:11.0.1") } paymentExt { dependency.set("com.intershop.payment:paymenttest:1.0.0") + image.set("intershophub/icm-as:11.0.1") } } @@ -725,7 +696,6 @@ class ICMDockerPluginIntegegrationSpec extends AbstractIntegrationGroovySpec { intershop_docker { images { icmcustomizationbase = 'intershophub/icm-as-customization-base:1.0.0' - icmbase = 'intershopmock/icm-as-mock:latest' mssqldb = 'mcr.microsoft.com/mssql/server:2019-CU4-ubuntu-16.04' solr = 'solr:8.5.2-slim' @@ -849,50 +819,6 @@ class ICMDockerPluginIntegegrationSpec extends AbstractIntegrationGroovySpec { return repoConf } - @Ignore("disabled on behalf of T.Bergmann, see https://dev.azure.com/intershop-com/Products/_workitems/edit/70900") - def 'pull image from extension'() { - prepareDefaultBuildConfig(testProjectDir, settingsFile, buildFile) - - when: - def result0 = getPreparedGradleRunner() - .withArguments("tasks", "-s") - .withGradleVersion(gradleVersion) - .build() - - then: - result0.task(":tasks").outcome == SUCCESS - - when: - def result = getPreparedGradleRunner() - .withArguments("pullAS", "-s") - .withGradleVersion(gradleVersion) - .build() - - then: - result.task(":pullAS").outcome == SUCCESS - - where: - gradleVersion << supportedGradleVersions - - } - - @Ignore("disabled on behalf of T.Bergmann, see https://dev.azure.com/intershop-com/Products/_workitems/edit/70900") - def 'pull image from extension with force'() { - prepareDefaultBuildConfig(testProjectDir, settingsFile, buildFile) - - when: - def result = getPreparedGradleRunner() - .withArguments("pullAS", "--forcePull", "-s") - .withGradleVersion(gradleVersion) - .buildAndFail() - - then: - result.output.contains("pull access denied for intershopmock/icm-as-mock") - - where: - gradleVersion << supportedGradleVersions - } - def 'pull image from extension with alt image'() { prepareDefaultBuildConfig(testProjectDir, settingsFile, buildFile) @@ -936,94 +862,6 @@ class ICMDockerPluginIntegegrationSpec extends AbstractIntegrationGroovySpec { gradleVersion << supportedGradleVersions } - @Ignore("disabled on behalf of T.Bergmann, see https://dev.azure.com/intershop-com/Products/_workitems/edit/70900") - def 'run dbprepare'() { - prepareDefaultBuildConfig(testProjectDir, settingsFile, buildFile) - - when: - def result2 = getPreparedGradleRunner() - .withArguments("dbPrepare", "-s", "--clean-db=yes") - .withGradleVersion(gradleVersion) - .build() - - then: - result2.task(":dbPrepare").outcome == SUCCESS - result2.output.contains("-classic --mode=auto --clean-db=yes") - - where: - gradleVersion << supportedGradleVersions - } - - @Ignore("disabled on behalf of T.Bergmann, see https://dev.azure.com/intershop-com/Products/_workitems/edit/70900") - def 'run dbprepare without parameters'() { - prepareDefaultBuildConfig(testProjectDir, settingsFile, buildFile) - - when: - def result2 = getPreparedGradleRunner() - .withArguments("dbPrepare", "-s") - .withGradleVersion(gradleVersion) - .build() - - then: - result2.task(":dbPrepare").outcome == SUCCESS - result2.output.contains("-classic --mode=auto --clean-db=no") - - where: - gradleVersion << supportedGradleVersions - } - - @Ignore - def 'run ishunit'() { - prepareDefaultBuildConfig(testProjectDir, settingsFile, buildFile) - - when: - def result2 = getPreparedGradleRunner() - .withArguments("ishUnitTestReport", "-s") - .withGradleVersion(gradleVersion) - .build() - - then: - result2.task(":ishUnitTestReport").outcome == SUCCESS - - where: - gradleVersion << supportedGradleVersions - } - - @Ignore - def 'run mssql db'() { - prepareDefaultBuildConfig(testProjectDir, settingsFile, buildFile) - - when: - def result1 = getPreparedGradleRunner() - .withArguments("startMSSQL", "-s", "-i") - .withGradleVersion(gradleVersion) - .build() - - then: - result1.task(":startMSSQL").outcome == SUCCESS - - when: - def result2 = getPreparedGradleRunner() - .withArguments("stopMSSQL", "-s", "-i") - .withGradleVersion(gradleVersion) - .build() - - then: - result2.task(":stopMSSQL").outcome == SUCCESS - - when: - def result3 = getPreparedGradleRunner() - .withArguments("removeMSSQL", "-s", "-i") - .withGradleVersion(gradleVersion) - .build() - - then: - result3.task(":removeMSSQL").outcome == SUCCESS - - where: - gradleVersion << supportedGradleVersions - } - def 'run solrcloud'() { prepareDefaultBuildConfig(testProjectDir, settingsFile, buildFile) @@ -1094,76 +932,6 @@ class ICMDockerPluginIntegegrationSpec extends AbstractIntegrationGroovySpec { gradleVersion << supportedGradleVersions } - @Ignore("disabled on behalf of T.Bergmann, see https://dev.azure.com/intershop-com/Products/_workitems/edit/70900") - def 'buildImages for projects - complex'() { - prepareDefaultBuildConfig(testProjectDir, settingsFile, buildFile) - - when: - def result1 = getPreparedGradleRunner() - .withArguments("tasks", "-s", "-i") - .withGradleVersion(gradleVersion) - .build() - - then: - result1.task(":tasks").outcome == SUCCESS - - when: - def result2 = getPreparedGradleRunner() - .withArguments("buildMainImage","-s", "-i") - .withGradleVersion(gradleVersion) - .build() - - then: - result2.task(":buildMainImage").outcome == SUCCESS - - when: - def result4 = getPreparedGradleRunner() - .withArguments("buildTestImage", "-s", "-i") - .withGradleVersion(gradleVersion) - .build() - - then: - result4.task(":buildTestImage").outcome == SKIPPED - - where: - gradleVersion << supportedGradleVersions - } - - @Ignore("disabled on behalf of T.Bergmann, see https://dev.azure.com/intershop-com/Products/_workitems/edit/70900") - def 'buildImages for projects - simple'() { - prepareSimpleBuildConfig(testProjectDir, settingsFile, buildFile) - - when: - def result1 = getPreparedGradleRunner() - .withArguments("tasks", "-s", "-i") - .withGradleVersion(gradleVersion) - .build() - - then: - result1.task(":tasks").outcome == SUCCESS - - when: - def result2 = getPreparedGradleRunner() - .withArguments("buildMainImage","-s", "-i") - .withGradleVersion(gradleVersion) - .build() - - then: - result2.task(":buildMainImage").outcome == SKIPPED - - when: - def result4 = getPreparedGradleRunner() - .withArguments("buildTestImage", "-s", "-i") - .withGradleVersion(gradleVersion) - .build() - - then: - result4.task(":buildTestImage").outcome == SKIPPED - - where: - gradleVersion << supportedGradleVersions - } - def 'buildCustomizationImage'() { prepareCustomizationBuildConfig(testProjectDir, settingsFile, buildFile) @@ -1199,23 +967,6 @@ class ICMDockerPluginIntegegrationSpec extends AbstractIntegrationGroovySpec { gradleVersion << supportedGradleVersions } - @Ignore - def 'writeImageProperties for projects'() { - prepareDefaultBuildConfig(testProjectDir, settingsFile, buildFile) - - when: - def result1 = getPreparedGradleRunner() - .withArguments("writeImageProperties", "-s", "-i", "-PrunOnCI=true") - .withGradleVersion(gradleVersion) - .build() - - then: - result1.task(":writeImageProperties").outcome == SUCCESS - - where: - gradleVersion << supportedGradleVersions - } - private def createLocalFile(String path, String content) { def testFile = new File(testProjectDir, path) testFile.parentFile.mkdirs() diff --git a/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerPluginSpec.groovy b/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerPluginSpec.groovy deleted file mode 100644 index a0a9985..0000000 --- a/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerPluginSpec.groovy +++ /dev/null @@ -1,29 +0,0 @@ -/* - * 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 - -import com.intershop.gradle.test.AbstractProjectSpec -import org.gradle.api.Plugin - -class ICMDockerPluginSpec extends AbstractProjectSpec { - - @Override - Plugin getPlugin() { - return new ICMDockerPlugin() - } -} diff --git a/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerProjectPluginSpec.groovy b/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerProjectPluginSpec.groovy deleted file mode 100644 index 2cd066c..0000000 --- a/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerProjectPluginSpec.groovy +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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 - -import com.intershop.gradle.icm.ICMProjectPlugin -import com.intershop.gradle.test.AbstractProjectSpec -import org.gradle.api.Plugin - -class ICMDockerProjectPluginSpec extends AbstractProjectSpec { - - def setup() { - project.plugins.apply(ICMProjectPlugin.class) - } - - @Override - Plugin getPlugin() { - return new ICMDockerProjectPlugin() - } -} diff --git a/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerTaskIntegrationSpec.groovy b/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerTaskIntegrationSpec.groovy index 7ec655a..0169a4e 100644 --- a/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerTaskIntegrationSpec.groovy +++ b/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerTaskIntegrationSpec.groovy @@ -23,14 +23,24 @@ import static org.gradle.testkit.runner.TaskOutcome.SUCCESS class ICMDockerTaskIntegrationSpec extends AbstractIntegrationGroovySpec { + final ICMGRADLEVERSION = "5.6.0" + def 'test create volumes task'() { settingsFile << """ + pluginManagement { + repositories { + gradlePluginPortal() + mavenCentral() + mavenLocal() + } + } rootProject.name='rootproject' """.stripIndent() buildFile << """ plugins { id 'java' + id 'com.intershop.gradle.icm.project' version '$ICMGRADLEVERSION' id 'com.intershop.gradle.icm.docker' } @@ -92,12 +102,20 @@ class ICMDockerTaskIntegrationSpec extends AbstractIntegrationGroovySpec { def 'test webserver configuration'() { settingsFile << """ + pluginManagement { + repositories { + gradlePluginPortal() + mavenCentral() + mavenLocal() + } + } rootProject.name='rootproject' """.stripIndent() buildFile << """ plugins { id 'java' + id 'com.intershop.gradle.icm.project' version '$ICMGRADLEVERSION' id 'com.intershop.gradle.icm.docker' } diff --git a/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerTestPluginIntegrationSpec.groovy b/src/test/groovy/com/intershop/gradle/icm/docker/ICMTestDockerPluginIntegrationSpec.groovy similarity index 96% rename from src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerTestPluginIntegrationSpec.groovy rename to src/test/groovy/com/intershop/gradle/icm/docker/ICMTestDockerPluginIntegrationSpec.groovy index fe8f385..75a9962 100644 --- a/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerTestPluginIntegrationSpec.groovy +++ b/src/test/groovy/com/intershop/gradle/icm/docker/ICMTestDockerPluginIntegrationSpec.groovy @@ -23,7 +23,7 @@ import static org.gradle.testkit.runner.TaskOutcome.SUCCESS import static org.gradle.testkit.runner.TaskOutcome.SUCCESS @Ignore -class ICMDockerTestPluginIntegrationSpec extends AbstractIntegrationGroovySpec { +class ICMTestDockerPluginIntegrationSpec extends AbstractIntegrationGroovySpec { def 'test test mailserver configuration'() { settingsFile << """ diff --git a/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerTestPluginSpec.groovy b/src/test/groovy/com/intershop/gradle/icm/docker/ICMTestDockerPluginSpec.groovy similarity index 90% rename from src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerTestPluginSpec.groovy rename to src/test/groovy/com/intershop/gradle/icm/docker/ICMTestDockerPluginSpec.groovy index df85b91..77fc57b 100644 --- a/src/test/groovy/com/intershop/gradle/icm/docker/ICMDockerTestPluginSpec.groovy +++ b/src/test/groovy/com/intershop/gradle/icm/docker/ICMTestDockerPluginSpec.groovy @@ -21,7 +21,7 @@ import com.intershop.gradle.icm.ICMProjectPlugin import com.intershop.gradle.test.AbstractProjectSpec import org.gradle.api.Plugin -class ICMDockerTestPluginSpec extends AbstractProjectSpec { +class ICMTestDockerPluginSpec extends AbstractProjectSpec { def setup() { project.plugins.apply(ICMProjectPlugin.class) @@ -30,6 +30,6 @@ class ICMDockerTestPluginSpec extends AbstractProjectSpec { @Override Plugin getPlugin() { - return new ICMDockerTestPlugin() + return new ICMTestDockerPlugin() } } diff --git a/src/test/groovy/com/intershop/gradle/icm/docker/TaskICMGenSpec.groovy b/src/test/groovy/com/intershop/gradle/icm/docker/TaskICMGenSpec.groovy index b9af0a3..d84657d 100644 --- a/src/test/groovy/com/intershop/gradle/icm/docker/TaskICMGenSpec.groovy +++ b/src/test/groovy/com/intershop/gradle/icm/docker/TaskICMGenSpec.groovy @@ -28,17 +28,27 @@ import static org.gradle.testkit.runner.TaskOutcome.SUCCESS class TaskICMGenSpec extends AbstractIntegrationGroovySpec { + final ICMGRADLEVERSION = "5.6.0" + String buildfileContent = """ plugins { id 'java' + id 'com.intershop.gradle.icm.project' version '$ICMGRADLEVERSION' id 'com.intershop.gradle.icm.docker' } """.stripIndent() String settingsfileContent = """ - rootProject.name='rootproject' + pluginManagement { + repositories { + gradlePluginPortal() + mavenCentral() + mavenLocal() + } + } + rootProject.name='rootproject' """.stripIndent() def 'test simple file creation'() {