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 {