Files
devstar/modules/docker/AssignDevcontainerUpdateDockerOperator.go
xinitx e6d1dbb381 !46 [DIP-2][DevContainer] 添加 WebSSH 和 保存镜像功能、更新了DevContainer相关的配置
* 合并devcontainer web相关的源文件,简化目录结构
* devcontainer、ssh_key_pair和devcontainer.cloud
* fixed bug:创建容器时Host为localhost时创建失败的问题
* 删除了死代码,更新了一些命名(主要是去掉devstar字符串)
* 常量名全大写
* devcontainer HOST改为用户设置的域名或IP
* 安装时如没有配置devcontainer则默认设置为docker方式
* 直接使用kubernetes和docker简化代码提高可读性
* 去除services/devstar_devcontainer文件夹名中不必要的devstar字符串
* 去除services/devstar_devcontainer文件夹名中不必要的devstar字符串
* 文件名中去掉不必要的devstar字符串
* 变量名中删除不必要的Devstar字符串
* Merge branch 'dev' into feature-websshAndUpdateImage
* change pages style
* change Structure
* fix bug
* websshAndUpdateImage
2025-01-07 01:25:54 +00:00

98 lines
3.0 KiB
Go

package docker
import (
"bytes"
"context"
"net/http"
"os/exec"
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/log"
gitea_web_context "code.gitea.io/gitea/services/context"
devcontainer_service_options "code.gitea.io/gitea/services/devcontainer/options"
files_service "code.gitea.io/gitea/services/repository/files"
"github.com/docker/docker/api/types"
)
func AssignDevcontainerUpdateDockerOperator(ctx *gitea_web_context.Context, opts *devcontainer_service_options.UpdateDevcontainerOptions) {
// 1. 创建docker client
reqctx := ctx.Req.Context()
cli, err := CreateDockerClient(&reqctx)
defer cli.Close()
if err != nil {
ctx.JSON(500, map[string]string{
"message": "error CreateDockerClient"})
return
}
dockerSocketPath, err := GetDockerSocketPath()
if err != nil {
ctx.JSON(500, map[string]string{
"message": "error GetDockerSocketPath"})
return
}
script := "docker " + "-H " + dockerSocketPath + " login -u " + opts.RepositoryUsername + " -p " + opts.PassWord + " " + opts.RepositoryAddress + " "
log.Info(string(script))
cmd := exec.Command("sh", "-c", script)
output, err := cmd.CombinedOutput()
log.Info(string(output))
if err != nil {
log.Info("error RegistryLogin:", err)
ctx.JSON(500, map[string]string{
"message": "error RegistryLogin"})
return
}
// 获取容器详细信息
containerJSON, err := cli.ContainerInspect(context.Background(), opts.DevContainerName)
if err != nil {
log.Info("error ContainerInspect:", err)
ctx.JSON(500, map[string]string{
"message": "error ContainerInspect"})
return
}
imageRef := opts.RepositoryAddress + "/" + opts.RepositoryUsername + "/" + opts.ImageName
commitResp, err := cli.ContainerCommit(ctx, containerJSON.ID, types.ContainerCommitOptions{Reference: imageRef})
log.Info(commitResp.ID)
if err != nil {
log.Info("error ContainerCommit:", err)
ctx.JSON(500, map[string]string{
"message": "error ContainerCommit"})
return
}
// 推送到仓库
script = "docker " + "-H " + dockerSocketPath + " push " + imageRef
log.Info(string(script))
cmd = exec.Command("sh", "-c", script)
output, err = cmd.CombinedOutput()
log.Info(string(output))
if err != nil {
log.Info("error docker push:", err)
ctx.JSON(500, map[string]string{
"message": "error docker push",
})
return
}
jsonString := `{"image":"` + imageRef + `"}`
resp, err := files_service.ChangeRepoFiles(db.DefaultContext, ctx.Repo.Repository, ctx.Doer, &files_service.ChangeRepoFilesOptions{
Files: []*files_service.ChangeRepoFile{
{
Operation: "update",
TreePath: ".devcontainer/devcontainer.json",
ContentReader: bytes.NewReader([]byte(jsonString)),
},
},
OldBranch: ctx.Repo.Repository.DefaultBranch,
Message: "Update container",
})
log.Info(resp.Commit.URL)
if err != nil {
log.Info("error ChangeRepoFiles:", err)
ctx.JSON(500, map[string]string{
"message": "error ChangeRepoFiles"})
return
}
ctx.JSON(http.StatusOK, map[string]string{
"redirect": ctx.Repo.RepoLink + "/dev-container",
"message": "success"})
}