beego 使用 coding 的 webhook 2.0 进行自动部署

beego 使用 coding 的 webhook 2.0 进行自动部署


本文介绍 beegocoding 上如果使用 webhook 2.0 进行自动部署。

coding 的 webhook 1.0 教程

coding 平台端的设置这里不做介绍,不清楚的可以看文档 lhttps://open.coding.net/webhooks/

项目使用 Supervisord 部署

beego 官方文档

自动部署接口实现代码如下

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() {
signature := c.Ctx.Request.Header.Get("X-Coding-Signature")
    content, err := ioutil.ReadAll(c.Ctx.Request.Body)
    if err != nil {
        utils.LogDebug(fmt.Sprintf("c.Ctx.Request.Body.Read:%v", err))
    }

    sha1 := enums.Hmac(SECRETTOKEN, content)
    calculateSignature := "sha1=" + sha1

if calculateSignature == signature {
        enums.Cmd("cd", "", []string{"/root/go/src/BeeCustom"})
        enums.Cmd("git", "", []string{"pull"})
        enums.Cmd("bee", "", []string{"pack"})

        if !file.IsExist("/root/go/src/BeeCustom/BeeCustom.tar.gz") {
            utils.LogDebug("/root/go/src/BeeCustom/BeeCustom.tar.gz exist")
        } else {
            enums.Cmd("tar", "y", []string{"-zxvf", "BeeCustom.tar.gz"})
            enums.Cmd("rm", "y", []string{"/root/go/src/BeeCustom/BeeCustom.tar.gz"})
            utils.LogDebug("tar BeeCustom.tar.gz success")
        }

        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
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!