### devcontainer页面功能实现 - devcontainer.json 可以正常编辑 - 可以创建devcontainer, **但是首次创建需要docker pull 容器镜像会造成系统卡死的情况,需要后续优化** - 可以open with WebTerminal, **但是进入的WebTerminal当前目录并不是当前项目目录下** - 修改后的容器可以docker commit为新的容器镜像 ### devcontainer代码结构优化 docker相关操作都放在了modules/docker/docker_api.go
65 lines
2.5 KiB
Go
65 lines
2.5 KiB
Go
package devcontainer
|
|
|
|
import (
|
|
"code.gitea.io/gitea/modules/log"
|
|
"code.gitea.io/gitea/modules/setting"
|
|
gitea_web_context "code.gitea.io/gitea/services/context"
|
|
docker_agent "code.gitea.io/gitea/services/devcontainer/docker"
|
|
devcontainer_service_errors "code.gitea.io/gitea/services/devcontainer/errors"
|
|
k8s_agent_services "code.gitea.io/gitea/services/devcontainer/k8s_agent"
|
|
devcontainer_service_options "code.gitea.io/gitea/services/devcontainer/options"
|
|
devcontainer_service_vo "code.gitea.io/gitea/services/devcontainer/vo"
|
|
)
|
|
|
|
// OpenDevcontainerService 获取 DevContainer 连接信息,抽象方法,适配多种 DevContainer Agent
|
|
func OpenDevcontainerService(ctx *gitea_web_context.Context, opts *devcontainer_service_options.OpenDevcontainerAppDispatcherOptions) (*devcontainer_service_vo.OpenDevcontainerAbstractAgentVO, error) {
|
|
|
|
// 0. 检查参数
|
|
if ctx == nil || opts == nil || len(opts.Name) == 0 {
|
|
return nil, devcontainer_service_errors.ErrIllegalParams{
|
|
FieldNameList: []string{"ctx", "opts.Name"},
|
|
}
|
|
}
|
|
|
|
// 1. 检查 DevContainer 功能是否开启
|
|
if setting.Devcontainer.Enabled == false {
|
|
return nil, devcontainer_service_errors.ErrOperateDevcontainer{
|
|
Action: "check availability of DevStar DevContainer",
|
|
Message: "DevContainer is turned off globally",
|
|
}
|
|
}
|
|
|
|
// 2. 根据 DevContainer Agent 类型分发任务
|
|
apiRequestContext := ctx.Req.Context()
|
|
openDevcontainerAbstractAgentVO := &devcontainer_service_vo.OpenDevcontainerAbstractAgentVO{}
|
|
switch setting.Devcontainer.Agent {
|
|
case setting.KUBERNETES:
|
|
devcontainerApp, err := k8s_agent_services.AssignDevcontainerGetting2K8sOperator(&apiRequestContext, opts)
|
|
if err != nil {
|
|
return nil, devcontainer_service_errors.ErrOperateDevcontainer{
|
|
Action: "Open DevContainer in k8s",
|
|
Message: err.Error(),
|
|
}
|
|
}
|
|
openDevcontainerAbstractAgentVO.NodePortAssigned = devcontainerApp.Status.NodePortAssigned
|
|
case setting.DOCKER:
|
|
port, err := docker_agent.GetDevcontainer(&apiRequestContext, opts)
|
|
log.Info("port %d", port)
|
|
if err != nil {
|
|
return nil, devcontainer_service_errors.ErrOperateDevcontainer{
|
|
Action: "Open DevContainer in docker",
|
|
Message: err.Error(),
|
|
}
|
|
}
|
|
openDevcontainerAbstractAgentVO.NodePortAssigned = port
|
|
default:
|
|
return nil, devcontainer_service_errors.ErrOperateDevcontainer{
|
|
Action: "Open DevContainer",
|
|
Message: "No Valid DevContainer Agent Found",
|
|
}
|
|
}
|
|
|
|
// 3. 封装返回结果
|
|
return openDevcontainerAbstractAgentVO, nil
|
|
}
|