Skip to content

Commit 84d4f44

Browse files
committed
feat(container): add Docker deployment UI and context creation
#306 - Added Docker deployment UI components and context creation logic in `RunDevContainerService`. - Updated `build.gradle.kts` to include the `com.jetbrains.gateway` plugin dependency.
1 parent 72fa299 commit 84d4f44

File tree

2 files changed

+59
-4
lines changed

2 files changed

+59
-4
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,7 @@ project(":exts:ext-container") {
661661
dependencies {
662662
intellijPlatform {
663663
intellijIde(prop("ideaVersion"))
664-
intellijPlugins(ideaPlugins + prop("devContainerPlugin") + "Docker")
664+
intellijPlugins(ideaPlugins + prop("devContainerPlugin") + "Docker" + "com.jetbrains.gateway")
665665
}
666666

667667
implementation(project(":core"))

exts/ext-container/src/233/main/kotlin/cc/unitmesh/container/RunDevContainerService.kt

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,28 @@
11
package cc.unitmesh.container
22

33
import cc.unitmesh.devti.provider.RunService
4+
import com.intellij.clouds.docker.gateway.DockerDevcontainerDeployContext
5+
import com.intellij.clouds.docker.gateway.ui.DockerDeployView
6+
import com.intellij.docker.DockerCloudConfiguration
7+
import com.intellij.docker.agent.devcontainers.DevcontainerPaths
8+
import com.intellij.docker.agent.devcontainers.buildStrategy.DevcontainerBuildStrategy.LocalBuildData
49
import com.intellij.docker.agent.util.nullize
510
import com.intellij.docker.connection.sshId
611
import com.intellij.docker.utils.createDefaultDockerServer
712
import com.intellij.docker.utils.getDockerServers
813
import com.intellij.execution.configurations.RunProfile
914
import com.intellij.openapi.actionSystem.AnAction
1015
import com.intellij.openapi.project.Project
16+
import com.intellij.openapi.project.guessProjectDir
17+
import com.intellij.openapi.ui.DialogWrapper
1118
import com.intellij.openapi.vfs.VirtualFile
1219
import com.intellij.psi.PsiElement
1320
import com.intellij.remoteServer.configuration.RemoteServer
21+
import com.intellij.util.ui.JBUI
22+
import com.intellij.util.ui.components.BorderLayoutPanel
23+
import com.jetbrains.rd.util.lifetime.Lifetime
24+
import java.io.File
25+
import javax.swing.JComponent
1426

1527
class RunDevContainerService : RunService {
1628
override fun isApplicable(project: Project, file: VirtualFile): Boolean = file.name == "devcontainer.json"
@@ -28,19 +40,62 @@ class RunDevContainerService : RunService {
2840
return null
2941
}
3042

43+
val server = dockerServers().firstOrNull() ?: return null
44+
val projectDir = project.guessProjectDir()!!.toNioPath().toFile()
45+
/// write virtualFile to projectDir/devcontainer.json
46+
val devcontainerFile = File(projectDir, "devcontainer.json")
47+
devcontainerFile.writeText(virtualFile.contentsToByteArray().toString(Charsets.UTF_8))
48+
49+
val content = createContext(devcontainerFile, projectDir, server)
50+
val wrapper = object : DialogWrapper(project) {
51+
override fun createCenterPanel(): JComponent? {
52+
val lifetime = Lifetime.Companion.Eternal
53+
val component = DockerDeployView(project, lifetime, content).component
54+
55+
val contentPlanel = BorderLayoutPanel()
56+
component.setBorder(JBUI.Borders.empty())
57+
contentPlanel.add(component)
58+
contentPlanel.revalidate()
59+
contentPlanel.repaint()
60+
return contentPlanel
61+
}
62+
}
63+
64+
wrapper.show()
3165
return createActions.first().templatePresentation.text
3266
}
3367

3468
fun createActions(project: Project): List<AnAction> {
69+
val filteredServers =
70+
dockerServers()
71+
72+
return filteredServers.map {
73+
createDevcontainerCreateWithMountedSources(it)
74+
}
75+
}
76+
77+
private fun dockerServers(): List<RemoteServer<DockerCloudConfiguration>> {
3578
val filteredServers =
3679
getDockerServers().filter {
3780
it.sshId == null
3881
}.nullize()
3982
?: listOf(createDefaultDockerServer("Local"))
83+
return filteredServers
84+
}
4085

41-
return filteredServers.map {
42-
createDevcontainerCreateWithMountedSources(it)
43-
}
86+
fun createContext(
87+
modelFile: File,
88+
workingDir: File,
89+
dockerServer: RemoteServer<DockerCloudConfiguration>
90+
): DockerDevcontainerDeployContext {
91+
val path = modelFile.toPath()
92+
val computeSourcesMountPath = DevcontainerPaths.computeSourcesMountPath(path)
93+
val sources = (computeSourcesMountPath?.toFile())
94+
95+
val deployContext = DockerDevcontainerDeployContext()
96+
deployContext.config = dockerServer
97+
deployContext.buildFromLocalSources = LocalBuildData(workingDir, modelFile, sources, true)
98+
return deployContext
4499
}
45100

46101
fun createDevcontainerCreateWithMountedSources(server: RemoteServer<*>): AnAction {

0 commit comments

Comments
 (0)