实现github的自动钩子


最近在学习go,也写了一些玩具放到自己的服务器中,但是感觉每次写完在本地交叉编译后上传到服务器略显麻烦,上传代码到服务器中编译也是略显麻烦,把编译文件加入到git管理中会导致git包变大,拉取代码变慢,特别是神秘之墙的存在会导致拉取github代码很慢,所以就实现了一下github的自动钩子,在服务器上自动编译并完成自动部署,记录一下实现的过程。

实现服务端

首先,我们需要准备一个供webhook调用的服务端,我这里用go实现了一个demo,更多功能请参考官方文档

webhook 其实就是每当接受到push的时候,会向我们注册的url中发送一条post请求,请求中的参数可以参考webhook的文档


package main import (
"crypto/hmac"
"crypto/sha1"
"encoding/hex"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"os/exec"
"strings"
) const Secret = "AxkkeqzADO8WjkBT"
const HookShell = "/data/hook.sh" func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
//我们这里只接收json的请求体
if contentType := r.Header.Get("content-type"); contentType != "application/json" {
throwError(w, "not json")
return
} bytes,err := ioutil.ReadAll(r.Body)
if err != nil {
throwError(w, fmt.Sprintln("body err", err))
return
} //首先应该对secret进行校验
signature := r.Header.Get("X-Hub-Signature")
if len(signature) <= 0 {
throwError(w, "signature empty")
return
} hash := hmac.New(sha1.New, []byte(Secret))
hash.Write(bytes)
sign := "sha1=" + hex.EncodeToString(hash.Sum(nil))
if strings.Compare(sign, signature) != 0 {
throwError(w, "signature error")
return
} var body map[string]interface{}
if err := json.Unmarshal(bytes, &body); err != nil {
throwError(w, fmt.Sprintln("Unmarshal err", err))
return
} //body里就已经获取到我们想要的数据了, 在这里我们只拿取push的分支,更多参数参考可以参考文档
ref, ok := body["ref"].(string)
if !ok {
throwError(w, "!ok")
return
}
//拿到的ref:refs/heads/master,我们只需要把前面截掉,就是我们想要的分支名
branch := strings.TrimLeft(ref, "refs/heads/") //我们这里只对master分支进行自动部署
if branch != "master" {
w.WriteHeader(200)
_,_ = w.Write([]byte("not update"))
return
} //我这里的部署是运行一个shell脚本,我们可以在这里写自动更新和部署的逻辑
if err := exec.Command(HookShell).Run(); err != nil {
w.WriteHeader(500)
_,_ = w.Write([]byte("deploy error"))
}
}) _ = http.ListenAndServe(":49999", nil)
} func throwError(w http.ResponseWriter, msg string) {
w.WriteHeader(400)
_,_ = w.Write([]byte("bad request. " + msg))
}

配置webhook

部署完成后,我们需要在仓库中添加一个webhook



在webhooks配置中,需要输入钩子的url,content-type这里我选择application/json,secret这里是你的密钥,然后我这里只需要对push操作进行响应。

配置完成后,提交代码测试即可

最新文章

  1. iOS--二维码
  2. 《ASP.NET SignalR系列》第五课 在MVC中使用SignalR
  3. C#获取外网IP
  4. centos 6 安装
  5. Direct3D11学习:(七)绘图基础——彩色立方体的绘制
  6. Python 中的 is 和 id
  7. 推荐:ThoughtWorks(中国)程序员读书雷达
  8. Oracle EBS 预警系统管理
  9. TEXT类型
  10. C语言中全局变量存放在哪个位置?
  11. Linux系统下用户与组的管理
  12. git push 报错 &quot;Peer certificate cannot be authenticated with known CA certificates&quot;
  13. Git学习指北
  14. GMM基础
  15. 扩展BootstapTable支持TreeGrid
  16. eclipse复制工作空间配置
  17. mysql数据库的安装和基本使用
  18. text_edit 未定义解决
  19. linux内核分析 第三周
  20. Python3基础 list 查看filter()返回的对象

热门文章

  1. JSX语法及特点介绍
  2. PL/SQL语言的学习笔记
  3. [转]1.2 java web的发展历史
  4. [转]基于VS Code快速搭建Java项目
  5. nginx+tomcat实现负载均衡(windows环境)
  6. H3C 静态路由配置示例
  7. linux 一个使用整页的 scull: scullp
  8. Crazy Binary String&lt;Map法&gt;
  9. koa2--04.ejs模板引擎
  10. HDU4609 FFT+组合计数