实现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操作进行响应。

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

实现github的自动钩子的更多相关文章

  1. GitHub + circleCI 自动构建/自动部署 应用

    GitHub + circleCI 自动构建/自动部署, 这里略过了单元测试,以部署 laravel 应用为例子 比起 gitlab + ansible + genkins 操作起来节省了很多硬件资源 ...

  2. 使用 Github Actions 自动部署 Angular 应用到 Github Pages

    前言 最近在学习 Angular,一些基础的语法也学习的差不多了,就在 github 上新建了一个代码仓库,准备用 ng-zorro 搭个后台应用的模板,方便自己以后写些小东西时可以直接使用.前端项目 ...

  3. 利用 Github Actions 自动更新 docfx 文档

    利用 Github Actions 自动更新 docfx 文档 Intro docfx 是微软出品一个 .NET API 文档框架,有一个理念是代码即文档,会根据项目代码自动生成 API 文档,即使没 ...

  4. 如何使用 Github Actions 自动抓取每日必应壁纸?

    如何白嫖 Github 服务器自动抓取必应搜索的每日壁纸呢? 如果你访问过必应搜索网站,那么你一定会被搜索页面的壁纸吸引,必应搜索的壁纸每日不同,自动更换,十分精美.这篇文章会介绍如何一步步分析出必应 ...

  5. hexo配合github action 自动构建(多种形式)

    已经使用HEXO正常构建GitHub页面 根据github action 给hexo配置自动部署github page 前往墨抒颖的个人网站查看纯净版 1. 为仓库设置访问密钥 第一步先生成密钥,打开 ...

  6. 使用Github Action自动填写疫情通

    使用Github Action自动填写疫情通 西电晨午晚检一天三次,通过企业号功能进行填写.实际上,西电企业号大部分功能是以网页模式工作的,通过构造connection发送合适的request,设置计 ...

  7. 5 分钟教你快速掌握 GitHub Actions 自动部署博客

    自从 GitHub 宣布 GitHub Actions 在平台上对所有开发人员和存储库可用以来,GitHub Actions 越来越受欢迎.很多第三方平台在生态系统中有速度等限制,将进一步推动开发人员 ...

  8. 用GitHub Actions自动部署Hexo

    什么是 GitHub Actions ? GitHub Actions 是一个 CI/CD(持续集成/持续部署)工具,GitHub 于 2018 年 10 月推出,正式版于 2019 年 11 月正式 ...

  9. Github webhooks 自动部署博客文章,使用总结【含视频】

    作者:小傅哥 博客:https://bugstack.cn 原文:https://mp.weixin.qq.com/s/VtTHUfyiITNSoGy052jkXQ 沉淀.分享.成长,让自己和他人都能 ...

随机推荐

  1. git比较两个版本之间的区别

    查看当前没有add 的内容修改: git diff 查看已经add 没有commit 的改动 git diff --cached 查看当前没有add和commit的改动: git diff HEAD ...

  2. jieba中文分词源码分析(四)

    一.未登录词问题在jieba中文分词的第一节曾提到未登录词问题 中文分词的难点 分词规范,词的定义还不明确 (<统计自然语言处理>宗成庆)歧义切分问题,交集型切分问题,多义组合型切分歧义等 ...

  3. hdu 4430 Yukari's Birthday (简单数学 + 二分)

    Problem - 4430 题意是,给出蜡烛的数量,要求求出r和k,r是蜡烛的层数,k是每一层蜡烛数目的底数. 开始的时候,没有看清题目,其实中间的那根蜡烛是可放可不放的.假设放置中间的那根蜡烛,就 ...

  4. Tomcat停,图片名字中文显示不出来

    Tomcat停,图片名字中文显示不出来     Tomcat下,图片名字中文显示不出来在tomcat的server.xml中加入URIEncoding="utf-8"<Con ...

  5. Lavarel之环境配置 .env

    .env 文件位于项目根目录下,作为全局环境配置文件. 1. 配置参数 // 运行环境名称 APP_ENV=local // 调试模式,开发阶段启用,上线状态禁用. APP_DEBUG=true // ...

  6. 基于Springboot+Junit+Mockito做单元测试

    前言 前面的两篇文章讨论过< 为什么要写单元测试,何时写,写多细 >和<单元测试规范>,这篇文章介绍如何使用Springboot+Junit+Mockito做单元测试,案例选取 ...

  7. 性能测试基础-HTTP用例设计

    JSON格式请求: web_custom_request("https://xx.xx.xx.xx:xx/pvcpappinf//msgcustomization/xinPowGenDay, ...

  8. Python3装饰器的使用

    装饰器 简易装饰器模板 def wrapper(func): def inner(*args,**kwargs): print('主代码前添加的功能') ret=func(*args,**kwargs ...

  9. CF1220

    CF1220 A one和zero特的字母分别是'n'和'z' 输出他们的数量即可 #include<cstdio> #include<iostream> #include&l ...

  10. SVG路径无法识别问题

    SVG 路径不规范无法识别 使用 (?<=(,|-))\. 替换为0. 即可