This commit is contained in:
init
2025-09-17 11:05:42 +08:00
repo.diff.parent 6ff9b9c665
repo.diff.commit fd532af745
repo.diff.stats_desc%!(EXTRA int=3, int=45, int=67)

repo.diff.view_file

@@ -12,6 +12,7 @@ import (
"net/http"
"net/url"
"path"
"strconv"
"strings"
"code.gitea.io/gitea/models/db"
@@ -396,7 +397,27 @@ func repoAssignment(ctx *Context, repo *repo_model.Repository) {
return
}
ctx.Data["Permission"] = &ctx.Repo.Permission
ctx.Data["AllowCreateDevcontainer"] = ctx.Doer.AllowCreateDevcontainer
if ctx.Doer != nil {
ctx.Data["AllowCreateDevcontainer"] = ctx.Doer.AllowCreateDevcontainer
} else {
query := ctx.Req.URL.Query()
userID := query.Get("user")
userNum, err := strconv.ParseInt(userID, 10, 64)
if err != nil {
return
}
u, err := user_model.GetUserByID(ctx, userNum)
if err != nil {
if user_model.IsErrUserNotExist(err) {
ctx.Redirect(setting.AppSubURL + "/-/admin/users")
} else {
ctx.ServerError("GetUserByID", err)
}
return
}
ctx.Data["AllowCreateDevcontainer"] = u.AllowCreateDevcontainer
}
if repo.IsMirror {
pullMirror, err := repo_model.GetMirrorByRepoID(ctx, repo.ID)
if err == nil {

repo.diff.view_file

@@ -305,12 +305,13 @@ func CreateDevContainer(ctx context.Context, repo *repo.Repository, doer *user.U
if setting.K8sConfig.Enable {
//k8s的逻辑
} else {
if isWebTerminal {
CreateDevContainerByDockerCommand(otherCtx, &newDevcontainer, repo, publicKeyList)
} else {
CreateDevContainerByDockerAPI(otherCtx, &newDevcontainer, repo, publicKeyList)
imageName, err := CreateDevContainerByDockerCommand(otherCtx, &newDevcontainer, repo, publicKeyList)
if err != nil {
return
}
if !isWebTerminal {
CreateDevContainerByDockerAPI(otherCtx, &newDevcontainer, imageName, repo, publicKeyList)
}
}
}()
return nil

repo.diff.view_file

@@ -41,7 +41,7 @@ func GetDevContainerStatusFromDocker(ctx context.Context, containerName string)
}
return containerStatus, nil
}
func CreateDevContainerByDockerAPI(ctx context.Context, newDevcontainer *devcontainer_models.Devcontainer, repo *repo.Repository, publicKeyList []string) error {
func CreateDevContainerByDockerAPI(ctx context.Context, newDevcontainer *devcontainer_models.Devcontainer, imageName string, repo *repo.Repository, publicKeyList []string) error {
dbEngine := db.GetEngine(ctx)
configurationString, err := GetDevcontainerConfigurationString(ctx, repo)
if err != nil {
@@ -51,8 +51,6 @@ func CreateDevContainerByDockerAPI(ctx context.Context, newDevcontainer *devcont
if err != nil {
return err
}
var imageName = configurationModel.Image
dockerSocket, err := docker_module.GetDockerSocketPath()
if err != nil {
return err
@@ -75,48 +73,6 @@ func CreateDevContainerByDockerAPI(ctx context.Context, newDevcontainer *devcont
if err != nil {
return err
}
} else {
dockerfileContent, err := GetFileContentByPath(ctx, repo, ".devcontainer/"+configurationModel.Build.Dockerfile)
if err != nil {
return err
}
// 创建构建上下文包含Dockerfile的tar包
var buf bytes.Buffer
tw := tar.NewWriter(&buf)
defer tw.Close()
// 添加Dockerfile到tar包
dockerfile := "Dockerfile"
content := []byte(dockerfileContent)
header := &tar.Header{
Name: dockerfile,
Size: int64(len(content)),
Mode: 0644,
}
if err := tw.WriteHeader(header); err != nil {
return err
}
if _, err := tw.Write(content); err != nil {
return err
}
// 执行镜像构建
imageName = fmt.Sprintf("%d", newDevcontainer.UserId) + "-" + fmt.Sprintf("%d", newDevcontainer.RepoId) + "-dockerfile"
buildOptions := types.ImageBuildOptions{
Tags: []string{imageName}, // 镜像标签
}
buildResponse, err := cli.ImageBuild(
context.Background(),
&buf,
buildOptions,
)
if err != nil {
return err
}
output, err := io.ReadAll(buildResponse.Body)
if err != nil {
return err
}
log.Info(string(output))
}
_, err = dbEngine.Table("devcontainer").
@@ -161,26 +117,26 @@ func CreateDevContainerByDockerAPI(ctx context.Context, newDevcontainer *devcont
return nil
}
func CreateDevContainerByDockerCommand(ctx context.Context, newDevcontainer *devcontainer_models.Devcontainer, repo *repo.Repository, publicKeyList []string) error {
func CreateDevContainerByDockerCommand(ctx context.Context, newDevcontainer *devcontainer_models.Devcontainer, repo *repo.Repository, publicKeyList []string) (string, error) {
dbEngine := db.GetEngine(ctx)
configurationString, err := GetDevcontainerConfigurationString(ctx, repo)
if err != nil {
return err
return "", err
}
configurationModel, err := UnmarshalDevcontainerConfigContent(configurationString)
if err != nil {
return err
return "", err
}
var imageName = configurationModel.Image
dockerSocket, err := docker_module.GetDockerSocketPath()
if err != nil {
return err
return "", err
}
if configurationModel.Build != nil && configurationModel.Build.Dockerfile != "" {
dockerfileContent, err := GetFileContentByPath(ctx, repo, ".devcontainer/"+configurationModel.Build.Dockerfile)
if err != nil {
return err
return "", err
}
// 创建构建上下文包含Dockerfile的tar包
var buf bytes.Buffer
@@ -195,10 +151,10 @@ func CreateDevContainerByDockerCommand(ctx context.Context, newDevcontainer *dev
Mode: 0644,
}
if err := tw.WriteHeader(header); err != nil {
return err
return "", err
}
if _, err := tw.Write(content); err != nil {
return err
return "", err
}
// 执行镜像构建
imageName = fmt.Sprintf("%d", newDevcontainer.UserId) + "-" + fmt.Sprintf("%d", newDevcontainer.RepoId) + "-dockerfile"
@@ -207,7 +163,7 @@ func CreateDevContainerByDockerCommand(ctx context.Context, newDevcontainer *dev
}
cli, err := docker_module.CreateDockerClient(ctx)
if err != nil {
return err
return "", err
}
buildResponse, err := cli.ImageBuild(
context.Background(),
@@ -215,11 +171,11 @@ func CreateDevContainerByDockerCommand(ctx context.Context, newDevcontainer *dev
buildOptions,
)
if err != nil {
return err
return "", err
}
output, err := io.ReadAll(buildResponse.Body)
if err != nil {
return err
return "", err
}
log.Info(string(output))
@@ -236,11 +192,11 @@ func CreateDevContainerByDockerCommand(ctx context.Context, newDevcontainer *dev
DevcontainerId: newDevcontainer.Id,
}); err != nil {
log.Info("Failed to insert record: %v", err)
return err
return imageName, err
}
cfg, err := setting.NewConfigProviderFromFile(setting.CustomConf)
if err != nil {
return err
return imageName, err
}
var startCommand string = `docker -H ` + dockerSocket + ` run -d --name ` + newDevcontainer.Name
@@ -299,7 +255,7 @@ func CreateDevContainerByDockerCommand(ctx context.Context, newDevcontainer *dev
DevcontainerId: newDevcontainer.Id,
}); err != nil {
log.Info("Failed to insert record: %v", err)
return err
return imageName, err
}
//安装基本工具的命令
onCreateCommand := strings.TrimSpace(strings.Join(configurationModel.ParseCommand(configurationModel.OnCreateCommand), ";"))
@@ -320,7 +276,7 @@ func CreateDevContainerByDockerCommand(ctx context.Context, newDevcontainer *dev
DevcontainerId: newDevcontainer.Id,
}); err != nil {
log.Info("Failed to insert record: %v", err)
return err
return imageName, err
}
//连接容器的命令
if _, err := dbEngine.Table("devcontainer_output").Insert(&devcontainer_models.DevcontainerOutput{
@@ -333,9 +289,9 @@ func CreateDevContainerByDockerCommand(ctx context.Context, newDevcontainer *dev
DevcontainerId: newDevcontainer.Id,
}); err != nil {
log.Info("Failed to insert record: %v", err)
return err
return imageName, err
}
return nil
return imageName, nil
}
func IsContainerNotFound(ctx context.Context, containerName string) (bool, error) {
cli, err := docker_module.CreateDockerClient(ctx)