beego 使用 coding 的 webhook 2.0 进行自动部署
本文介绍 beego
在 coding
上如果使用 webhook 2.0
进行自动部署。
coding
平台端的设置这里不做介绍,不清楚的可以看文档 lhttps://open.coding.net/webhooks/
项目使用 Supervisord 部署
自动部署接口实现代码如下
WebHookController.go
package controllers
import (
"fmt"
"io/ioutil"
"BeeCustom/enums"
"BeeCustom/file"
"BeeCustom/utils"
)
const SECRETTOKEN = "your code"
// 自动部署接口控制器
type WebHookController struct {
BaseController
}
func (c *WebHookController) Get() {
//获取 coding 发送的 signature
signature := c.Ctx.Request.Header.Get("X-Coding-Signature")
//获取 coding 发送的内容
content, err := ioutil.ReadAll(c.Ctx.Request.Body)
if err != nil {
utils.LogDebug(fmt.Sprintf("c.Ctx.Request.Body.Read:%v", err))
}
//获取 coding 发送的内容根据秘钥(秘钥在 coding 平台设置)加密内容
sha1 := enums.Hmac(SECRETTOKEN, content)
calculateSignature := "sha1=" + sha1
//比较加密内容
if calculateSignature == signature {
enums.Cmd("cd","", []string{"/root/go/src/your_project_name"}) //进项目目录
enums.Cmd("git", "",[]string{"pull"}) //拉代码
enums.Cmd("bee","", []string{"pack"}) //编译代码
//如果编译成功
if file.IsExist("/root/go/src/your_project_name/ your_project_name.tar.gz ") {
//移动编译文件到临时解压目录,自行设置
enums.Cmd("mv","y",[]string{"/root/go/src/your_project_name/ your_project_name.tar.gz", "/root/back"})
utils.LogDebug("mv error")
} else {
utils.LogDebug("not move")
}
//移动编译文件成功
if !file.IsExist("/root/go/src/your_project_name/your_project_name.tar.gz") && file.IsExist("/root/back/your_project_name.tar.gz") {
//进入临时目录,解压文件
enums.Cmd("cd","", []string{"/root/back"})
enums.Cmd("tar", "",[]string{"-zxvf", "/root/back/your_project_name.tar.gz", "your_project_name/ your_project_name"})
utils.LogDebug("tar error")
} else {
utils.LogDebug("not tar ")
}
//解压文件后移动文件到项目目录中
if file.IsExist("/root/back/ your_project_name") {
enums.Cmd("mv","", []string{"/root/back/your_project_name", "/root/go/src/your_project_name"})
utils.LogDebug("mv error")
} else {
utils.LogDebug("not mv")
}
//重启项目使用了 supervisord 部署
enums.Cmd("cd","", []string{"/etc/supervisord.conf.d"})
enums.Cmd("supervisorctl","", []string{"restart", "beepkg"})
}
c.ServeJSON()
}
公用方法文件
enums/common.go
......
// hmac 加密
func Hmac(key string, data []byte) string {
hmac := hmac.New(sha1.New, []byte(key))
hmac.Write(data)
return hex.EncodeToString(hmac.Sum([]byte("")))
}
func Cmd(action string, arg []string) {
cmd := exec.Command(action, arg...)
if len(input) > 0 {
cmd.Stdin = strings.NewReader(input)
}
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
utils.LogDebug(fmt.Sprintf("cmd:%v:%v--%v --%v", err, action, arg, stderr.String()))
}
}
文件处理相关方法
file/file.go
......
// 判断所给路径文件/文件夹是否存在(返回true是存在)
func IsExist(path string) bool {
_, err := os.Stat(path) //os.Stat获取文件信息
if err != nil {
if os.IsExist(err) {
return true
}
return false
}
return true
}
© 著作权归作者所有
举报
发表评论
0/200