From 2501db94f5d7f393aa8c9612b558020b60d75952 Mon Sep 17 00:00:00 2001 From: junleea <354425203@qq.com> Date: Thu, 4 Jul 2024 18:31:04 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8C=81=E7=BB=AD?= =?UTF-8?q?=E9=9B=86=E6=88=90=E9=83=A8=E7=BD=B2=E9=83=A8=E5=88=86=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E9=83=A8=E5=88=86=EF=BC=8Chandler=E5=A4=A7?= =?UTF-8?q?=E6=A6=82=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dao/cid.go | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++ handler/cid.go | 31 ++++++++++++++++++ main.go | 1 + 3 files changed, 117 insertions(+) create mode 100644 dao/cid.go create mode 100644 handler/cid.go diff --git a/dao/cid.go b/dao/cid.go new file mode 100644 index 0000000..a6a6b27 --- /dev/null +++ b/dao/cid.go @@ -0,0 +1,85 @@ +package dao + +import ( + "fmt" + "gorm.io/gorm" +) + +type CID struct { + gorm.Model + Auth_id int `gorm:"column:auth_id"` + Name string `gorm:"column:name"` + Url string `gorm:"column:url"` + Script string `gorm:"column:script"` + End string `gorm:"column:end"` +} + +type CIDRunLog struct { + gorm.Model + CID_id int `gorm:"column:cid_id"` + Auth_id int `form:"column:auth_id"` + Log string `gorm:"column:log"` +} + +// CreateCID 创建持续集成、部署 +func CreateCID(name, url, script, end string, auth_id int) uint { + cid := CID{Name: name, Url: url, Script: script, End: end, Auth_id: auth_id} + result := DB.Debug().Create(&cid) + if result.Error != nil { + return 0 + } + return cid.ID +} + +// DeleteCIDByID 删除持续集成、部署 +func DeleteCIDByID(id, auth_id int) bool { + res := DB.Debug().Model(&CID{}).Where("id = ? and auth_id = ?", id, auth_id).Delete(&CID{}) + if res.Error != nil { + return false + } + return true +} + +// FindCIDByID 查找持续集成、部署 +func FindCIDByID(id, auth_id int) CID { + var cid CID + DB.Debug().Where("id = ? and auth_id = ?", id, auth_id).First(&cid) + return cid +} + +// FindCIDByAuthID 查找持续集成、部署 +func FindCIDByAuthID(auth_id int) []CID { + var cids []CID + DB.Debug().Where("auth_id = ?", auth_id).Find(&cids) + return cids +} + +// UpdateCIDByID 更新持续集成、部署 +func UpdateCIDByID(id, auth_id int, name, url, script, end string) bool { + pd := FindCIDByID(id, auth_id) + if pd.ID == 0 { + return false + } + result := DB.Debug().Model(&CID{}).Where("id = ? and auth_id = ?", id, auth_id).Updates(CID{Name: name, Url: url, Script: script, End: end}) + if result.Error != nil { + return false + } + return true +} + +// CreateRunLog,添加执行日志 +func CreateRunLog(cid_id, auth_id int, log string) uint { + cidRunLog := CIDRunLog{CID_id: cid_id, Auth_id: auth_id, Log: log} + err := DB.Debug().Model(cidRunLog) + if err != nil { + fmt.Println(err) + return 0 + } + return cidRunLog.ID +} + +func FindRunLogByAuthID(auth_id, cid_id int) []CIDRunLog { + var cidRunLogs []CIDRunLog + DB.Debug().Where("cid_id = ? and auth_id = ?", cid_id, auth_id).Find(&cidRunLogs) + return cidRunLogs +} diff --git a/handler/cid.go b/handler/cid.go new file mode 100644 index 0000000..98c0c24 --- /dev/null +++ b/handler/cid.go @@ -0,0 +1,31 @@ +package handler + +import "github.com/gin-gonic/gin" + +func SetUpCIDGroup(router *gin.Engine) { + cidGroup := router.Group("/cid") //持续集成、部署 + cidGroup.POST("/create", GetImKey) + cidGroup.POST("/delete", DeleteCID) + cidGroup.POST("/update", UpdateCID) + cidGroup.POST("/list", GetCIDList) + cidGroup.POST("/run", RunCID) +} +func RunCID(c *gin.Context) { + +} + +func CreateCID(c *gin.Context) { + +} + +func DeleteCID(c *gin.Context) { + +} + +func UpdateCID(c *gin.Context) { + +} + +func GetCIDList(c *gin.Context) { + +} diff --git a/main.go b/main.go index eeccbda..400c4f3 100644 --- a/main.go +++ b/main.go @@ -24,6 +24,7 @@ func main() { handler.SetUpUserGroup(r) // User handler.SetUpDeviceGroup(r) // Device handler.SetUpIMGroup(r) // IM + handler.SetUpCIDGroup(r) // CID,持续集成、部署 r.Run(":8083") // listen and serve on 0.0.0.0:8082 defer dao.Close() defer worker.CloseRedis() From c4b96f9a9fa1f467561aaeb1b282f973cdcb198b Mon Sep 17 00:00:00 2001 From: junleea <354425203@qq.com> Date: Fri, 5 Jul 2024 10:28:05 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=8C=81=E7=BB=AD=E9=9B=86=E6=88=90?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=83=A8=E5=88=86=E5=AE=8C=E6=88=90=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=A1=A8=E7=BB=93=E6=9E=84=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dao/cid.go | 23 ++++++---- handler/cid.go | 118 ++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 127 insertions(+), 14 deletions(-) diff --git a/dao/cid.go b/dao/cid.go index a6a6b27..e8d4bca 100644 --- a/dao/cid.go +++ b/dao/cid.go @@ -11,7 +11,7 @@ type CID struct { Name string `gorm:"column:name"` Url string `gorm:"column:url"` Script string `gorm:"column:script"` - End string `gorm:"column:end"` + Token string `gorm:"column:token"` // 用于外部回调 } type CIDRunLog struct { @@ -19,11 +19,12 @@ type CIDRunLog struct { CID_id int `gorm:"column:cid_id"` Auth_id int `form:"column:auth_id"` Log string `gorm:"column:log"` + Error string `gorm:"column:error"` } // CreateCID 创建持续集成、部署 -func CreateCID(name, url, script, end string, auth_id int) uint { - cid := CID{Name: name, Url: url, Script: script, End: end, Auth_id: auth_id} +func CreateCID(name, url, script, token string, auth_id int) uint { + cid := CID{Name: name, Url: url, Script: script, Token: token, Auth_id: auth_id} result := DB.Debug().Create(&cid) if result.Error != nil { return 0 @@ -55,12 +56,16 @@ func FindCIDByAuthID(auth_id int) []CID { } // UpdateCIDByID 更新持续集成、部署 -func UpdateCIDByID(id, auth_id int, name, url, script, end string) bool { +func UpdateCIDByID(id, auth_id int, name, url, script, token string) bool { pd := FindCIDByID(id, auth_id) if pd.ID == 0 { return false } - result := DB.Debug().Model(&CID{}).Where("id = ? and auth_id = ?", id, auth_id).Updates(CID{Name: name, Url: url, Script: script, End: end}) + // 如果token为空,则不更新token + if token == "" { + token = pd.Token + } + result := DB.Debug().Model(&CID{}).Where("id = ? and auth_id = ?", id, auth_id).Updates(CID{Name: name, Url: url, Script: script, Token: token}) if result.Error != nil { return false } @@ -68,10 +73,10 @@ func UpdateCIDByID(id, auth_id int, name, url, script, end string) bool { } // CreateRunLog,添加执行日志 -func CreateRunLog(cid_id, auth_id int, log string) uint { - cidRunLog := CIDRunLog{CID_id: cid_id, Auth_id: auth_id, Log: log} - err := DB.Debug().Model(cidRunLog) - if err != nil { +func CreateRunLog(cid_id, auth_id int, log, err string) uint { + cidRunLog := CIDRunLog{CID_id: cid_id, Auth_id: auth_id, Log: log, Error: err} + result := DB.Debug().Create(&cidRunLog) + if result != nil { fmt.Println(err) return 0 } diff --git a/handler/cid.go b/handler/cid.go index 98c0c24..57ee73e 100644 --- a/handler/cid.go +++ b/handler/cid.go @@ -1,31 +1,139 @@ package handler -import "github.com/gin-gonic/gin" +import ( + "bytes" + "github.com/gin-gonic/gin" + "os" + "os/exec" + "videoplayer/dao" + "videoplayer/proto" +) + +type CIDCreateReq struct { + Name string `json:"name" form:"name"` + Url string `json:"url" form:"url"` + Script string `json:"script" form:"script"` +} + +type CIDDeleteReq struct { + ID int `json:"id" form:"id"` +} + +type CIDRunReq struct { + ID int `json:"id" form:"id"` +} + +type CIDUpdateReq struct { + ID int `json:"id" form:"id"` + Name string `json:"name" form:"name"` + Url string `json:"url" form:"url"` + Script string `json:"script" form:"script"` + Token string `json:"token" form:"token"` +} func SetUpCIDGroup(router *gin.Engine) { cidGroup := router.Group("/cid") //持续集成、部署 - cidGroup.POST("/create", GetImKey) + cidGroup.POST("/create", CreateCID) cidGroup.POST("/delete", DeleteCID) cidGroup.POST("/update", UpdateCID) cidGroup.POST("/list", GetCIDList) cidGroup.POST("/run", RunCID) } func RunCID(c *gin.Context) { - + var req CIDRunReq + if err := c.ShouldBind(&req); err == nil { + // 获取用户ID + id, _ := c.Get("id") + authID := int(id.(float64)) + cid := dao.FindCIDByID(req.ID, authID) + if cid.ID == 0 { + c.JSON(200, gin.H{"error": "CID not found", "code": proto.OperationFailed, "message": "failed"}) + return + } else { + scriptContent := `` + str, _ := generateRandomHexString(16) + scriptName := "" + str + `.sh` + // 写入脚本 + err2 := os.WriteFile(scriptName, []byte(scriptContent), 0755) + if err2 != nil { + c.JSON(200, gin.H{"error": err2.Error(), "code": proto.OperationFailed, "message": "failed"}) + return + } else { + //执行脚本 + cmd := exec.Command("/bin/bash", "-c", scriptName) + err3 := cmd.Run() + // 使用bytes.Buffer捕获输出 + var out bytes.Buffer + cmd.Stdout = &out + dao.CreateRunLog(req.ID, authID, out.String(), err3.Error()) //添加执行日志 + c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": "success"}) + } + } + } else { + c.JSON(200, gin.H{"error": err.Error(), "code": proto.ParameterError, "message": "failed"}) + } } func CreateCID(c *gin.Context) { + var req CIDCreateReq + if err := c.ShouldBind(&req); err == nil { + // 获取用户ID + id, _ := c.Get("id") + authID := int(id.(float64)) + token, _ := generateRandomHexString(32) + res := dao.CreateCID(req.Name, req.Url, req.Script, token, authID) + if res != 0 { + c.JSON(200, gin.H{}) + } else { + c.JSON(200, gin.H{"error": "CreateCID failed", "code": proto.OperationFailed, "message": "failed"}) + } + } else { + c.JSON(200, gin.H{"error": err.Error(), "code": proto.ParameterError, "message": "failed"}) + } } func DeleteCID(c *gin.Context) { - + var req CIDDeleteReq + if err := c.ShouldBind(&req); err == nil { + // 获取用户ID + id, _ := c.Get("id") + authID := int(id.(float64)) + cid := dao.DeleteCIDByID(req.ID, authID) + if cid == false { + c.JSON(200, gin.H{"error": "CID not found", "code": proto.OperationFailed, "message": "failed"}) + return + } else { + c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": "success"}) + } + } else { + c.JSON(200, gin.H{"error": err.Error(), "code": proto.ParameterError, "message": "failed"}) + } } func UpdateCID(c *gin.Context) { + var req CIDUpdateReq + if err := c.ShouldBind(&req); err == nil { + // 获取用户ID + id, _ := c.Get("id") + authID := int(id.(float64)) + cid := dao.UpdateCIDByID(req.ID, authID, req.Name, req.Url, req.Script, req.Token) + if cid == false { + c.JSON(200, gin.H{"error": "CID not found", "code": proto.OperationFailed, "message": "failed"}) + return + } else { + c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": "success"}) + } + } else { + c.JSON(200, gin.H{"error": err.Error(), "code": proto.ParameterError, "message": "failed"}) + } } func GetCIDList(c *gin.Context) { - + // 获取用户ID + id, _ := c.Get("id") + authID := int(id.(float64)) + cids := dao.FindCIDByAuthID(authID) + c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": cids}) } From f57d9ee392cbb1c9db65bcae32faf64b646112bc Mon Sep 17 00:00:00 2001 From: junleea <354425203@qq.com> Date: Fri, 5 Jul 2024 10:46:02 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=9F=A5=E7=9C=8B=E5=8F=8A=E6=B7=BB=E5=8A=A0=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=E8=84=9A=E6=9C=AC=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E5=BE=85=E6=8B=BC=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dao/cid.go | 16 +++++++++++-- handler/cid.go | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 2 deletions(-) diff --git a/dao/cid.go b/dao/cid.go index e8d4bca..3c4102d 100644 --- a/dao/cid.go +++ b/dao/cid.go @@ -83,8 +83,20 @@ func CreateRunLog(cid_id, auth_id int, log, err string) uint { return cidRunLog.ID } -func FindRunLogByAuthID(auth_id, cid_id int) []CIDRunLog { +func FindRunLogByAuthID(auth_id int) []CIDRunLog { var cidRunLogs []CIDRunLog - DB.Debug().Where("cid_id = ? and auth_id = ?", cid_id, auth_id).Find(&cidRunLogs) + DB.Debug().Where(" auth_id = ?", auth_id).Find(&cidRunLogs).Order("created_at desc") return cidRunLogs } + +func FindRunLogByID(auth_id, cid_id int) CIDRunLog { + var cidRunLog CIDRunLog + DB.Debug().Where("cid_id = ? and auth_id = ?", cid_id, auth_id).First(&cidRunLog) + return cidRunLog +} + +func FindCIDByIDAndToken(id int, token string) CID { + var cid CID + DB.Debug().Where("id = ? and token = ?", id, token).First(&cid) + return cid +} diff --git a/handler/cid.go b/handler/cid.go index 57ee73e..966fd69 100644 --- a/handler/cid.go +++ b/handler/cid.go @@ -5,6 +5,7 @@ import ( "github.com/gin-gonic/gin" "os" "os/exec" + "strconv" "videoplayer/dao" "videoplayer/proto" ) @@ -38,6 +39,9 @@ func SetUpCIDGroup(router *gin.Engine) { cidGroup.POST("/update", UpdateCID) cidGroup.POST("/list", GetCIDList) cidGroup.POST("/run", RunCID) + cidGroup.POST("/log", GetCIDLogList) //获取执行日志 + cidGroup.POST("/log/detail", GetCIDLog) //获取执行日志详情 + cidGroup.POST("/callback", CIDCallback) } func RunCID(c *gin.Context) { var req CIDRunReq @@ -137,3 +141,60 @@ func GetCIDList(c *gin.Context) { cids := dao.FindCIDByAuthID(authID) c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": cids}) } + +func GetCIDLog(c *gin.Context) { + var req CIDRunReq + if err := c.ShouldBind(&req); err == nil { + // 获取用户ID + id, _ := c.Get("id") + authID := int(id.(float64)) + cidLogs := dao.FindRunLogByID(req.ID, authID) + c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": cidLogs}) + } else { + c.JSON(200, gin.H{"error": err.Error(), "code": proto.ParameterError, "message": "failed"}) + } +} + +func GetCIDLogList(c *gin.Context) { + // 获取用户ID + id, _ := c.Get("id") + authID := int(id.(float64)) + cidLogs := dao.FindRunLogByAuthID(authID) + c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": cidLogs}) +} + +func CIDCallback(c *gin.Context) { + // 获取用户ID + token := c.Query("token") + cid_id := c.Query("id") + //将cid转换为int + cid, _ := strconv.Atoi(cid_id) + if token == "" || cid == 0 { + c.JSON(200, gin.H{"error": "parameter error", "code": proto.ParameterError, "message": "failed"}) + return + } + res := dao.FindCIDByIDAndToken(cid, token) + if res.ID != 0 { + scriptContent := `` + str, _ := generateRandomHexString(16) + scriptName := "" + str + `.sh` + // 写入脚本 + err2 := os.WriteFile(scriptName, []byte(scriptContent), 0755) + if err2 != nil { + c.JSON(200, gin.H{"error": err2.Error(), "code": proto.OperationFailed, "message": "failed"}) + return + } else { + //执行脚本 + cmd := exec.Command("/bin/bash", "-c", scriptName) + err3 := cmd.Run() + // 使用bytes.Buffer捕获输出 + var out bytes.Buffer + cmd.Stdout = &out + dao.CreateRunLog(cid, res.Auth_id, out.String(), err3.Error()) //添加执行日志 + c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": "success"}) + } + } else { + c.JSON(200, gin.H{"error": "CID not found by id and token", "code": proto.OperationFailed, "message": "failed"}) + return + } +} From 77b76caf39dfad1238579d6e3d810b5f0c78d52d Mon Sep 17 00:00:00 2001 From: junleea <354425203@qq.com> Date: Fri, 5 Jul 2024 11:38:59 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=90=8E=E7=AB=AFcid=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90=EF=BC=8C=E5=BE=85=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handler/cid.go | 82 +++++++++++++++++++++++++++----------------------- main.go | 7 +++++ proto/conf.go | 3 ++ 3 files changed, 55 insertions(+), 37 deletions(-) diff --git a/handler/cid.go b/handler/cid.go index 966fd69..f701622 100644 --- a/handler/cid.go +++ b/handler/cid.go @@ -3,8 +3,8 @@ package handler import ( "bytes" "github.com/gin-gonic/gin" - "os" "os/exec" + "regexp" "strconv" "videoplayer/dao" "videoplayer/proto" @@ -54,24 +54,28 @@ func RunCID(c *gin.Context) { c.JSON(200, gin.H{"error": "CID not found", "code": proto.OperationFailed, "message": "failed"}) return } else { - scriptContent := `` - str, _ := generateRandomHexString(16) - scriptName := "" + str + `.sh` - // 写入脚本 - err2 := os.WriteFile(scriptName, []byte(scriptContent), 0755) - if err2 != nil { - c.JSON(200, gin.H{"error": err2.Error(), "code": proto.OperationFailed, "message": "failed"}) - return - } else { - //执行脚本 - cmd := exec.Command("/bin/bash", "-c", scriptName) - err3 := cmd.Run() - // 使用bytes.Buffer捕获输出 - var out bytes.Buffer - cmd.Stdout = &out - dao.CreateRunLog(req.ID, authID, out.String(), err3.Error()) //添加执行日志 - c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": "success"}) - } + re := regexp.MustCompile(`(?i)(?:https?://|git@)[^/]+/([^/]+)/([^/]+)(?:\.git)?$`) + matches := re.FindStringSubmatch(cid.Url) + name := matches[2] + scriptContent := `#!/bin/bash + TARGET_DIR = ` + proto.CID_BASE_DIR + `/workspace` + name + ` + if [ ! -d $TARGET_DIR ]; then + git clone ` + cid.Url + ` + cd $TARGET_DIR/` + name + ` + else + cd $TARGET_DIR/` + name + ` + git pull + fi + ` + cid.Script + //执行脚本 + cmd := exec.Command("/bin/bash", "-c", scriptContent) + err3 := cmd.Run() + // 使用bytes.Buffer捕获输出 + var out bytes.Buffer + cmd.Stdout = &out + dao.CreateRunLog(req.ID, authID, out.String(), err3.Error()) //添加执行日志 + c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": "success"}) + } } else { c.JSON(200, gin.H{"error": err.Error(), "code": proto.ParameterError, "message": "failed"}) @@ -175,24 +179,28 @@ func CIDCallback(c *gin.Context) { } res := dao.FindCIDByIDAndToken(cid, token) if res.ID != 0 { - scriptContent := `` - str, _ := generateRandomHexString(16) - scriptName := "" + str + `.sh` - // 写入脚本 - err2 := os.WriteFile(scriptName, []byte(scriptContent), 0755) - if err2 != nil { - c.JSON(200, gin.H{"error": err2.Error(), "code": proto.OperationFailed, "message": "failed"}) - return - } else { - //执行脚本 - cmd := exec.Command("/bin/bash", "-c", scriptName) - err3 := cmd.Run() - // 使用bytes.Buffer捕获输出 - var out bytes.Buffer - cmd.Stdout = &out - dao.CreateRunLog(cid, res.Auth_id, out.String(), err3.Error()) //添加执行日志 - c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": "success"}) - } + //从url获取仓库名称 + re := regexp.MustCompile(`(?i)(?:https?://|git@)[^/]+/([^/]+)/([^/]+)(?:\.git)?$`) + matches := re.FindStringSubmatch(res.Url) + name := matches[2] + scriptContent := `#!/bin/bash + TARGET_DIR = ` + proto.CID_BASE_DIR + `/workspace` + name + ` + if [ ! -d $TARGET_DIR ]; then + git clone ` + res.Url + ` + cd $TARGET_DIR/` + name + ` + else + cd $TARGET_DIR/` + name + ` + git pull + fi + ` + res.Script + //执行脚本 + cmd := exec.Command("/bin/bash", "-c", scriptContent) + err3 := cmd.Run() + // 使用bytes.Buffer捕获输出 + var out bytes.Buffer + cmd.Stdout = &out + dao.CreateRunLog(cid, res.Auth_id, out.String(), err3.Error()) //添加执行日志 + c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": "success"}) } else { c.JSON(200, gin.H{"error": "CID not found by id and token", "code": proto.OperationFailed, "message": "failed"}) return diff --git a/main.go b/main.go index 400c4f3..eb212f4 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt" "io" + "os" "strings" "videoplayer/dao" "videoplayer/handler" @@ -29,6 +30,12 @@ func main() { defer dao.Close() defer worker.CloseRedis() } +func init() { + // 创建cid的目录 + os.MkdirAll(proto.CID_BASE_DIR, os.ModePerm) + os.MkdirAll(proto.CID_BASE_DIR+"script", os.ModePerm) + os.MkdirAll(proto.CID_BASE_DIR+"workspace", os.ModePerm) +} func writeLogger(c *gin.Context) { ip := c.ClientIP() diff --git a/proto/conf.go b/proto/conf.go index f27810c..5130b5f 100644 --- a/proto/conf.go +++ b/proto/conf.go @@ -15,6 +15,9 @@ const ( REIDS_DB = 2 TOKEN_SECRET = "mfjurnc_32ndj9dfhj" + + // 以下是持续集成、部署的配置 + CID_BASE_DIR = "/home/lijun/cid/" ) type User struct { From 69a25507e805c6664865e49b182608733e22533b Mon Sep 17 00:00:00 2001 From: junleea <354425203@qq.com> Date: Fri, 5 Jul 2024 16:55:57 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=8F=8Arun=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dao/db.go | 8 ++++++++ handler/cid.go | 6 ++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/dao/db.go b/dao/db.go index 344e21e..5bf9c7f 100644 --- a/dao/db.go +++ b/dao/db.go @@ -32,6 +32,14 @@ func Init() { if err != nil { fmt.Println("logger table:", err) } // 自动迁移,创建表,如果表已经存在,会自动更新表结构,不会删除表,只会创建不存在的表 + err = db.AutoMigrate(&CID{}) + if err != nil { + fmt.Println("cid table:", err) + } // 自动迁移,创建表,如果表已经存在,会自动更新表结构,不会删除表,只会创建不存在的表 + err = db.AutoMigrate(&CIDRunLog{}) + if err != nil { + fmt.Println("cidrunlog table:", err) + } // 自动迁移,创建表,如果表已经存在,会自动更新表结构,不会删除表,只会创建不存在的表 DB = db } diff --git a/handler/cid.go b/handler/cid.go index f701622..f3421de 100644 --- a/handler/cid.go +++ b/handler/cid.go @@ -2,6 +2,7 @@ package handler import ( "bytes" + "fmt" "github.com/gin-gonic/gin" "os/exec" "regexp" @@ -29,7 +30,7 @@ type CIDUpdateReq struct { Name string `json:"name" form:"name"` Url string `json:"url" form:"url"` Script string `json:"script" form:"script"` - Token string `json:"token" form:"token"` + Token string `json:"cidtoken" form:"cidtoken"` } func SetUpCIDGroup(router *gin.Engine) { @@ -70,6 +71,7 @@ func RunCID(c *gin.Context) { //执行脚本 cmd := exec.Command("/bin/bash", "-c", scriptContent) err3 := cmd.Run() + fmt.Println("bash content:", scriptContent) // 使用bytes.Buffer捕获输出 var out bytes.Buffer cmd.Stdout = &out @@ -92,7 +94,7 @@ func CreateCID(c *gin.Context) { res := dao.CreateCID(req.Name, req.Url, req.Script, token, authID) if res != 0 { - c.JSON(200, gin.H{}) + c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": res}) } else { c.JSON(200, gin.H{"error": "CreateCID failed", "code": proto.OperationFailed, "message": "failed"}) }