Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 0 additions & 124 deletions src/main/kotlin/com/dcd/server/core/common/file/FileContent.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,115 +5,7 @@ import com.dcd.server.core.domain.application.model.enums.ApplicationType
import java.lang.StringBuilder

object FileContent {
fun getApplicationDockerFileContent(
applicationType: ApplicationType,
version: String,
port: Int,
env: Map<String, String>,
initialScripts: List<String>
): String =
when(applicationType) {
ApplicationType.SPRING_BOOT -> getSpringBootDockerFileContent(version, port, env, initialScripts)
ApplicationType.NEST_JS -> getNestJsDockerFileContent(version, port, env, initialScripts)
ApplicationType.GIN -> getGinDockerFileContent(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<String, String>, initialScripts: List<String>): String =
"""
FROM amazoncorretto:${version} AS builder
WORKDIR /builder
COPY . .
RUN chmod +x ./gradlew && ./gradlew bootJar
RUN rm -f build/libs/*-plain.jar && mv build/libs/*.jar build/libs/app.jar

FROM amazoncorretto:${version}-alpine
WORKDIR /app
COPY --from=builder /builder/build/libs/app.jar app.jar
EXPOSE $port
${getEnvString(env)}
${getInitialScriptsString(initialScripts)}
CMD ["java", "-jar", "app.jar"]
""".trimIndent()

private fun getNestJsDockerFileContent(version: String, port: Int, env: Map<String, String>, initialScripts: List<String>): String =
"""
FROM node:${version} AS builder
WORKDIR /builder
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:${version}-alpine
WORKDIR /app
${getEnvString(env)}
${getInitialScriptsString(initialScripts)}
COPY package*.json ./
RUN npm ci --production=true
COPY --from=builder /builder/dist ./dist
EXPOSE $port
CMD ["sh", "-c", "TZ=Asia/Seoul node dist/main.js"]
""".trimIndent()

private fun getGinDockerFileContent(version: String, port: Int, env: Map<String, String>, initialScripts: List<String>): String =
"""
FROM golang:${version} AS builder
WORKDIR /builder
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go mod tidy
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .

FROM golang:${version}-alpine
WORKDIR /app
RUN apk --no-cache add ca-certificates tzdata
${getEnvString(env)}
${getInitialScriptsString(initialScripts)}
COPY --from=builder /builder/main .
EXPOSE $port
CMD ["./main"]
""".trimIndent()

private fun getMYSQLDockerFileContent(version: String, port: Int, env: Map<String, String>, initialScripts: List<String>): String =
"""
FROM mysql:${version}
WORKDIR /app
EXPOSE $port
${getEnvString(env)}
${getInitialScriptsString(initialScripts)}
""".trimIndent()

private fun getMARIADBDockerFileContent(version: String, port: Int, env: Map<String, String>, initialScripts: List<String>): String =
"""
FROM mariadb:${version}
WORKDIR /app
EXPOSE $port
${getEnvString(env)}
${getInitialScriptsString(initialScripts)}
""".trimIndent()

private fun getRedisDockerFileContent(version: String, port: Int, env: Map<String, String>, initialScripts: List<String>): String =
"""
FROM redis:${version}
WORKDIR /app
EXPOSE $port
${getEnvString(env)}
${getInitialScriptsString(initialScripts)}
""".trimIndent()

private fun getH2DBDockerFileContent(version: String, port: Int, env: Map<String, String>, initialScripts: List<String>): String =
"""
FROM oscarfonts/h2:${version}
WORKDIR /app
EXPOSE $port
${getEnvString(env)}
${getInitialScriptsString(initialScripts)}
""".trimIndent()

fun getApplicationHttpConfig(application: Application, domain: String): String =
"""
Expand All @@ -136,20 +28,4 @@ object FileContent {
}
}
""".trimIndent()

private fun getEnvString(env: Map<String, String>): String {
val envString = StringBuilder()
for (it in env) {
envString.append("ENV ${it.key}=${it.value}\n")
}
return envString.toString()
}

private fun getInitialScriptsString(initialScripts: List<String>): String {
val initialScriptString = StringBuilder()
for (initialScript in initialScripts) {
initialScriptString.append("RUN $initialScript\n")
}
return initialScriptString.toString()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import com.dcd.server.core.domain.application.event.DeployApplicationEvent
import com.dcd.server.core.domain.application.model.DeploymentResult
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.CreateImageFileService
import com.dcd.server.core.domain.application.service.DeleteApplicationDirectoryService
import com.dcd.server.core.domain.application.spi.ApplicationRemoteRepoPort
import com.dcd.server.core.domain.application.spi.ApplicationImageFilePort
import com.dcd.server.core.domain.application.spi.CommandApplicationPort
import com.dcd.server.core.domain.application.spi.QueryApplicationPort
import com.dcd.server.core.domain.volume.spi.QueryVolumePort
Expand All @@ -25,7 +25,7 @@ import org.springframework.transaction.event.TransactionalEventListener
class ApplicationEventListener(
private val commandApplicationPort: CommandApplicationPort,
private val applicationRemoteRepoPort: ApplicationRemoteRepoPort,
private val createImageFileService: CreateImageFileService,
private val applicationImageFilePort: ApplicationImageFilePort,
private val deleteApplicationDirectoryService: DeleteApplicationDirectoryService,
private val containerPort: ContainerPort,
private val queryApplicationPort: QueryApplicationPort,
Expand Down Expand Up @@ -60,7 +60,7 @@ class ApplicationEventListener(
}
else -> {}
}
createImageFileService.createFileToApplication(application)
applicationImageFilePort.createImageFile(application)

containerPort.execute {
buildImage(application, "./${application.name}/Dockerfile")
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.dcd.server.core.domain.application.spi

import com.dcd.server.core.domain.application.model.Application

interface ApplicationImageFilePort {
suspend fun createImageFile(application: Application)
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ import com.dcd.server.core.domain.application.dto.request.CreateApplicationReqDt
import com.dcd.server.core.domain.application.dto.response.CreateApplicationResDto
import com.dcd.server.core.domain.application.exception.AlreadyExistsApplicationException
import com.dcd.server.core.domain.application.model.enums.ApplicationType
import com.dcd.server.core.domain.application.service.CreateImageFileService
import com.dcd.server.core.domain.application.service.DeleteApplicationDirectoryService
import com.dcd.server.core.domain.application.service.GetExternalPortService
import com.dcd.server.core.domain.application.service.InitialScriptService
import com.dcd.server.core.domain.application.spi.ApplicationRemoteRepoPort
import com.dcd.server.core.domain.application.spi.ApplicationImageFilePort
import com.dcd.server.core.domain.application.spi.CommandApplicationPort
import com.dcd.server.core.domain.application.spi.QueryApplicationPort
import com.dcd.server.core.domain.env.service.EnvAutoMatchService
Expand All @@ -30,7 +30,7 @@ class CreateApplicationUseCase(
private val containerPort: ContainerPort,
private val queryVolumePort: QueryVolumePort,
private val applicationRemoteRepoPort: ApplicationRemoteRepoPort,
private val createImageFileService: CreateImageFileService,
private val applicationImageFilePort: ApplicationImageFilePort,
private val getExternalPortService: GetExternalPortService,
private val deleteApplicationDirectoryService: DeleteApplicationDirectoryService,
private val envAutoMatchService: EnvAutoMatchService,
Expand Down Expand Up @@ -60,7 +60,7 @@ class CreateApplicationUseCase(
else -> {}
}

createImageFileService.createFileToApplication(application)
applicationImageFilePort.createImageFile(application)

containerPort.execute {
buildImage(application, "./${application.name}/Dockerfile")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ import com.dcd.server.core.domain.application.exception.CanNotDeployApplicationE
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.CreateImageFileService
import com.dcd.server.core.domain.application.service.DeleteApplicationDirectoryService
import com.dcd.server.core.domain.application.spi.ApplicationRemoteRepoPort
import com.dcd.server.core.domain.application.spi.ApplicationImageFilePort
import com.dcd.server.core.domain.application.spi.QueryApplicationPort
import com.dcd.server.core.domain.volume.spi.QueryVolumePort
import com.dcd.server.core.domain.workspace.exception.WorkspaceNotFoundException
Expand All @@ -26,7 +26,7 @@ class DeployApplicationUseCase(
private val containerPort: ContainerPort,
private val queryVolumePort: QueryVolumePort,
private val applicationRemoteRepoPort: ApplicationRemoteRepoPort,
private val createImageFileService: CreateImageFileService,
private val applicationImageFilePort: ApplicationImageFilePort,
private val deleteApplicationDirectoryService: DeleteApplicationDirectoryService,
private val lockPort: LockPort,
private val eventPublisher: ApplicationEventPublisher,
Expand Down Expand Up @@ -95,7 +95,7 @@ class DeployApplicationUseCase(
}
else -> {}
}
createImageFileService.createFileToApplication(application)
applicationImageFilePort.createImageFile(application)
}

buildImage(application, "./${application.name}/Dockerfile")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.dcd.server.core.domain.application.service.impl
package com.dcd.server.infrastructure.domain.application.adapter

import com.dcd.server.core.common.file.exception.FileOperationException
import com.dcd.server.core.common.file.spi.FileOperationPort
Expand All @@ -7,40 +7,31 @@ 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.service.CreateImageFileService
import com.dcd.server.core.domain.application.spi.ApplicationImageFilePort
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.common.file.FileContent
import com.dcd.server.core.domain.env.spi.QueryApplicationEnvPort
import com.dcd.server.infrastructure.domain.application.file.ImageFileContent
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.withContext
import org.springframework.context.ApplicationEventPublisher
import org.springframework.stereotype.Service
import org.springframework.stereotype.Component
import java.io.File
import java.io.IOException
import java.nio.file.Paths

@Service
class CreateDockerFileServiceImpl(
private val queryApplicationPort: QueryApplicationPort,
@Component
class ApplicationImageFileAdapter(
private val queryApplicationEnvPort: QueryApplicationEnvPort,
private val queryApplicationInitialScriptPort: QueryApplicationInitialScriptPort,
private val fileOperationPort: FileOperationPort,
private val eventPublisher: ApplicationEventPublisher,
private val encryptPort: EncryptPort
) : CreateImageFileService {
override suspend fun createFileByApplicationId(id: String) {
val application = (queryApplicationPort.findById(id)
?: throw ApplicationNotFoundException())
withContext(Dispatchers.IO) {
createFile(application, this)
}
}

override suspend fun createFileToApplication(application: Application) {
) : ApplicationImageFilePort {
override suspend fun createImageFile(application: Application) {
withContext(Dispatchers.IO) {
createFile(application, this)
}
Expand Down Expand Up @@ -77,7 +68,7 @@ class CreateDockerFileServiceImpl(
}

val fileContent =
FileContent.getApplicationDockerFileContent(
ImageFileContent.getApplicationDockerFileContent(
application.applicationType,
version,
application.port,
Expand Down
Loading
Loading