* 合并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
98 lines
3.0 KiB
Go
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"})
|
|
}
|