diff --git a/src/main/kotlin/com/dcd/server/core/common/file/FileContent.kt b/src/main/kotlin/com/dcd/server/core/common/file/FileContent.kt index d615ddcc..81b39488 100644 --- a/src/main/kotlin/com/dcd/server/core/common/file/FileContent.kt +++ b/src/main/kotlin/com/dcd/server/core/common/file/FileContent.kt @@ -1,10 +1,27 @@ package com.dcd.server.core.common.file import com.dcd.server.core.domain.application.model.Application +import com.dcd.server.core.domain.application.model.enums.ApplicationType import java.lang.StringBuilder object FileContent { - fun getSpringBootDockerFileContent(version: String, port: Int, env: Map): String = + fun getApplicationDockerFileContent( + applicationType: ApplicationType, + version: String, + port: Int, + env: Map, + initialScripts: List + ): String = + when(applicationType) { + ApplicationType.SPRING_BOOT -> getSpringBootDockerFileContent(version, port, env, initialScripts) + ApplicationType.NEST_JS -> getNestJsDockerFileContent(version, port, env, initialScripts) + ApplicationType.MYSQL -> getMYSQLDockerFileContent(version, port, env, initialScripts) + ApplicationType.MARIA_DB -> getMARIADBDockerFileContent(version, port, env, initialScripts) + ApplicationType.H2_DB -> getH2DBDockerFileContent(version, port, env, initialScripts) + ApplicationType.REDIS -> getRedisDockerFileContent(version, port, env, initialScripts) + } + + private fun getSpringBootDockerFileContent(version: String, port: Int, env: Map, initialScripts: List): String = """ FROM openjdk:${version}-jdk COPY build/libs/*.jar build/libs/ @@ -12,10 +29,11 @@ object FileContent { RUN mv build/libs/*.jar build/libs/app.jar EXPOSE $port ${getEnvString(env)} + ${getInitialScriptsString(initialScripts)} CMD ["java", "-jar", "build/libs/app.jar"] """.trimIndent() - fun getNestJsDockerFileContent(version: String, port: Int, env: Map): String = + private fun getNestJsDockerFileContent(version: String, port: Int, env: Map, initialScripts: List): String = """ FROM node:${version} COPY . . @@ -23,35 +41,40 @@ object FileContent { RUN npm run build EXPOSE $port ${getEnvString(env)} + ${getInitialScriptsString(initialScripts)} CMD ["npm", "start"] """.trimIndent() - fun getMYSQLDockerFileContent(version: String, port: Int, env: Map): String = + private fun getMYSQLDockerFileContent(version: String, port: Int, env: Map, initialScripts: List): String = """ FROM mysql:${version} EXPOSE $port ${getEnvString(env)} + ${getInitialScriptsString(initialScripts)} """.trimIndent() - fun getMARIADBDockerFileContent(version: String, port: Int, env: Map): String = + private fun getMARIADBDockerFileContent(version: String, port: Int, env: Map, initialScripts: List): String = """ FROM mariadb:${version} EXPOSE $port ${getEnvString(env)} + ${getInitialScriptsString(initialScripts)} """.trimIndent() - fun getRedisDockerFileContent(version: String, port: Int, env: Map): String = + private fun getRedisDockerFileContent(version: String, port: Int, env: Map, initialScripts: List): String = """ FROM redis:${version} EXPOSE $port ${getEnvString(env)} + ${getInitialScriptsString(initialScripts)} """.trimIndent() - fun getH2DBDockerFileContent(version: String, port: Int, env: Map): String = + private fun getH2DBDockerFileContent(version: String, port: Int, env: Map, initialScripts: List): String = """ FROM oscarfonts/h2:${version} EXPOSE $port ${getEnvString(env)} + ${getInitialScriptsString(initialScripts)} """.trimIndent() fun getImageVersionShellScriptContent(imageName: String, minVersion: String): String { @@ -141,4 +164,11 @@ object FileContent { return envString.toString() } + private fun getInitialScriptsString(initialScripts: List): String { + val initialScriptString = StringBuilder() + for (initialScript in initialScripts) { + initialScriptString.append("RUN $initialScript\n") + } + return initialScriptString.toString() + } } \ No newline at end of file diff --git a/src/main/kotlin/com/dcd/server/core/domain/application/service/impl/CreateDockerFileServiceImpl.kt b/src/main/kotlin/com/dcd/server/core/domain/application/service/impl/CreateDockerFileServiceImpl.kt index bf07eaf5..aed08bba 100644 --- a/src/main/kotlin/com/dcd/server/core/domain/application/service/impl/CreateDockerFileServiceImpl.kt +++ b/src/main/kotlin/com/dcd/server/core/domain/application/service/impl/CreateDockerFileServiceImpl.kt @@ -7,9 +7,9 @@ import com.dcd.server.core.domain.application.event.ChangeApplicationStatusEvent import com.dcd.server.core.domain.application.exception.ApplicationNotFoundException import com.dcd.server.core.domain.application.model.Application import com.dcd.server.core.domain.application.model.enums.ApplicationStatus -import com.dcd.server.core.domain.application.model.enums.ApplicationType import com.dcd.server.core.domain.application.service.CreateDockerFileService import com.dcd.server.core.domain.application.spi.CheckExitValuePort +import com.dcd.server.core.domain.application.spi.QueryApplicationInitialScriptPort import com.dcd.server.core.domain.application.spi.QueryApplicationPort import com.dcd.server.core.domain.application.util.FailureCase import com.dcd.server.core.domain.env.spi.QueryApplicationEnvPort @@ -26,6 +26,7 @@ import java.io.IOException class CreateDockerFileServiceImpl( private val queryApplicationPort: QueryApplicationPort, private val queryApplicationEnvPort: QueryApplicationEnvPort, + private val queryApplicationInitialScriptPort: QueryApplicationInitialScriptPort, private val commandPort: CommandPort, private val checkExitValuePort: CheckExitValuePort, private val eventPublisher: ApplicationEventPublisher, @@ -57,6 +58,11 @@ class CreateDockerFileServiceImpl( it.key to it.value } + val initialScripts = + queryApplicationInitialScriptPort + .findAllByApplication(application) + .map { it.script } + commandPort.executeShellCommand("mkdir -p $directoryName") .also {exitValue -> if (exitValue != 0) @@ -65,25 +71,15 @@ class CreateDockerFileServiceImpl( } val file = File("./${application.name}/Dockerfile") - val fileContent = when (application.applicationType) { - ApplicationType.SPRING_BOOT -> - FileContent.getSpringBootDockerFileContent(version, application.port, applicationEnv) - - ApplicationType.MYSQL -> - FileContent.getMYSQLDockerFileContent(version, application.port, applicationEnv) - - ApplicationType.MARIA_DB -> - FileContent.getMARIADBDockerFileContent(version, application.port, applicationEnv) + val fileContent = + FileContent.getApplicationDockerFileContent( + application.applicationType, + version, + application.port, + applicationEnv, + initialScripts + ) - ApplicationType.REDIS -> - FileContent.getRedisDockerFileContent(version, application.port, applicationEnv) - - ApplicationType.NEST_JS -> - FileContent.getNestJsDockerFileContent(version, application.port, applicationEnv) - - ApplicationType.H2_DB -> - FileContent.getH2DBDockerFileContent(version, application.port, applicationEnv) - } try { if (!file.exists()) file.createNewFile() diff --git a/src/test/kotlin/com/dcd/server/core/domain/application/service/CreateDockerFileServiceImplTest.kt b/src/test/kotlin/com/dcd/server/core/domain/application/service/CreateDockerFileServiceImplTest.kt index 86765f00..01a9cc08 100644 --- a/src/test/kotlin/com/dcd/server/core/domain/application/service/CreateDockerFileServiceImplTest.kt +++ b/src/test/kotlin/com/dcd/server/core/domain/application/service/CreateDockerFileServiceImplTest.kt @@ -7,6 +7,7 @@ import com.dcd.server.core.domain.application.service.impl.CreateDockerFileServi import com.dcd.server.core.domain.application.spi.QueryApplicationPort import com.dcd.server.infrastructure.global.command.adapter.CommandAdapter import com.dcd.server.core.domain.application.spi.CheckExitValuePort +import com.dcd.server.core.domain.application.spi.QueryApplicationInitialScriptPort import com.dcd.server.core.domain.env.spi.QueryApplicationEnvPort import io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.shouldBe @@ -21,16 +22,18 @@ import java.io.File class CreateDockerFileServiceImplTest : BehaviorSpec({ val queryApplicationPort = mockk() val queryApplicationEnvPort = mockk() + val queryApplicationInitialScriptPort = mockk() val commandPort = spyk(CommandAdapter()) val eventPublisher = mockk(relaxed = true) val checkExitValuePort = mockk(relaxUnitFun = true) val encryptPort = mockk() - val createDockerFileService = CreateDockerFileServiceImpl(queryApplicationPort, queryApplicationEnvPort, commandPort, checkExitValuePort, eventPublisher, encryptPort) + val createDockerFileService = CreateDockerFileServiceImpl(queryApplicationPort, queryApplicationEnvPort, queryApplicationInitialScriptPort, commandPort, checkExitValuePort, eventPublisher, encryptPort) given("스프링 애플리케이션이 주어지고") { val application = ApplicationGenerator.generateApplication(applicationType = ApplicationType.SPRING_BOOT) every { queryApplicationEnvPort.findByApplication(application) } returns emptyList() + every { queryApplicationInitialScriptPort.findAllByApplication(application) } returns emptyList() `when`("서비스를 실행할때") { createDockerFileService.createFileToApplication(application, application.version) @@ -48,7 +51,7 @@ class CreateDockerFileServiceImplTest : BehaviorSpec({ } actualFileContent.deleteAt(actualFileContent.length - 1) - actualFileContent.toString() shouldBe FileContent.getSpringBootDockerFileContent(application.version, application.port, emptyMap()) + actualFileContent.toString() shouldBe FileContent.getApplicationDockerFileContent(application.applicationType, application.version, application.port, emptyMap(), listOf()) } } @@ -59,6 +62,7 @@ class CreateDockerFileServiceImplTest : BehaviorSpec({ val application = ApplicationGenerator.generateApplication(applicationType = ApplicationType.REDIS) every { queryApplicationEnvPort.findByApplication(application) } returns emptyList() + every { queryApplicationInitialScriptPort.findAllByApplication(application) } returns emptyList() `when`("서비스를 실행할때") { createDockerFileService.createFileToApplication(application, application.version) @@ -75,7 +79,7 @@ class CreateDockerFileServiceImplTest : BehaviorSpec({ actualFileContent.append(it + "\n") } - actualFileContent.toString() shouldBe FileContent.getRedisDockerFileContent(application.version, application.port, emptyMap()) + actualFileContent.toString() shouldBe FileContent.getApplicationDockerFileContent(application.applicationType, application.version, application.port, emptyMap(), listOf()) } } @@ -86,6 +90,7 @@ class CreateDockerFileServiceImplTest : BehaviorSpec({ val application = ApplicationGenerator.generateApplication(applicationType = ApplicationType.MYSQL) every { queryApplicationEnvPort.findByApplication(application) } returns emptyList() + every { queryApplicationInitialScriptPort.findAllByApplication(application) } returns emptyList() `when`("서비스를 실행할때") { createDockerFileService.createFileToApplication(application, application.version) @@ -102,7 +107,7 @@ class CreateDockerFileServiceImplTest : BehaviorSpec({ actualFileContent.append(it + "\n") } - actualFileContent.toString() shouldBe FileContent.getMYSQLDockerFileContent(application.version, application.port, emptyMap()) + actualFileContent.toString() shouldBe FileContent.getApplicationDockerFileContent(application.applicationType, application.version, application.port, emptyMap(), listOf()) } } @@ -113,6 +118,7 @@ class CreateDockerFileServiceImplTest : BehaviorSpec({ val application = ApplicationGenerator.generateApplication(applicationType = ApplicationType.MARIA_DB) every { queryApplicationEnvPort.findByApplication(application) } returns emptyList() + every { queryApplicationInitialScriptPort.findAllByApplication(application) } returns emptyList() `when`("서비스를 실행할때") { createDockerFileService.createFileToApplication(application, application.version) @@ -129,7 +135,7 @@ class CreateDockerFileServiceImplTest : BehaviorSpec({ actualFileContent.append(it + "\n") } - actualFileContent.toString() shouldBe FileContent.getMARIADBDockerFileContent(application.version, application.port, emptyMap()) + actualFileContent.toString() shouldBe FileContent.getApplicationDockerFileContent(application.applicationType, application.version, application.port, emptyMap(), listOf()) } }