菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
76
0

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

原创
05/13 14:22
阅读数 578

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() {
    //获取 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
76 点赞
0 评论
收藏
为你推荐 换一批