Files
devstar/services/devcontainer/OpenDevcontainerAbstractAgentService.go
xinitx e31075b296 !50 devcontainer页面功能实现及代码结构优化
### devcontainer页面功能实现

- devcontainer.json 可以正常编辑
- 可以创建devcontainer, **但是首次创建需要docker pull 容器镜像会造成系统卡死的情况,需要后续优化** 
- 可以open with WebTerminal, **但是进入的WebTerminal当前目录并不是当前项目目录下**
- 修改后的容器可以docker commit为新的容器镜像

### devcontainer代码结构优化

docker相关操作都放在了modules/docker/docker_api.go
2025-02-13 05:56:32 +00:00

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
}