beego 使用 coding 的 webhook 2.0 進行自動部署

snowlyg發表於2019-12-04

本文介紹 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 協議》,轉載必須註明作者和本文連結

相關文章