嘎里三分熟
  • 首页
  • JMusic
  • TSBay
  • 常用工具
  • About Me
  • 留言板
一行代码一世浮生
  1. 首页
  2. Python
  3. 正文

利用 github 的 webhooks 自动部署博客

2019年10月29日 2791点热度 4人点赞 0条评论

一、背景

博客原是 WordPress 搭建的,由于某些个人无法接受的原因,准备转成静态博客,之前转过,使用的是 HEXO,基本成功了,但是是部署在 github pages 上面的,如今准备部署在国内的阿里云服务器上。

二、问题

使用 HEXO 搭建的博客平台,进行写博客的流程是:

1、本地使用 Markdown 编写博客,
2、本地编译成 html 文件,
3、将 html 文件上传至服务器,一般免费的有 github page,gitee 等

所以此处需要改造的点其实很简单,就是把 github 仓库中的 html 文件全部下载至服务器上,然后利用 web 服务器做个反向代理即可,比如 nginx。

后续的部署流程:

1、本地写完博客,编译完成后上传至 github 仓库
2、登陆到服务器上面进行 git pull 操作

问题就此暴露出来了,每次写完博客都要登陆下服务器去更新下 html 文件,我的天,这谁顶得住。

三、解决

于是自然而然想到了 git 仓库的 web 钩子,即当 git 仓库收到 push 或者其他命令时,会自动调我们的钩子程序(其实就是向我们指定的地址发送一个 post 请求),而我们只需要让我们的这个程序去跟新下服务器上面的代码(html 文件)即可。

流程示例图见下图:

流程示例图

从上面可以出,我们只剩 2 件事需要做,一是配置下 github 的 webhook,二是在我们的服务器上写一个 web 程序来处理 github 发送过来的请求。

1、webhook 配置

webhook 配置

配置比较简单,需要注意的是,秘钥虽然是非必填的,但是最好还是加上,为了安全。

webhook 请求示例图

请求的数据,每个平台都不一样,在此以 github 为例,数据内容见下图:
注:请求头中有一个很重要的签名参数,该参数前部分为加密方式,后部分为的签名,而明文就是我们在 webhook 中配置的秘钥。这点很重要哦。

2、程序编写

写一个简单是 web 程序。

本人主要是编写 java 代码的,如果要用 java 来写的话,比较麻烦,所以考虑选择一款解释性语言来编写,其实用啥语言都无所谓啦,毕竟代码处理逻辑很简单,选用自己熟悉的就行,例如 Python、PHP、nodejs 等都行。

此处选择的是使用 Python 来编写,web 框架是比较轻量的 Flask,操作 git 使用的是 gitPython,所以需要安装下:

pip install flask
pip install gitpython

代码比较简单,不多赘述,主要就是两点:

1、签名校验
2、git pull

详细代码如下:


from flask import Flask, request, Blueprint, jsonify, current_app
from git import Repo
import hmac

app = Flask(__name__)

@app.route("/api/github_hook", methods=['POST'])
def github_web_hook():

    header_signature_origin = request.headers.get('X-Hub-Signature')
    if header_signature_origin is None:
        return '你没有权限访问!'
        
    hash_type, header_signature = header_signature_origin.split('=')
    if hash_type != 'sha1':
        return '不支持的加密方式!'
        
    secret = str.encode("http://www.jetchen.cn")
    
    hashhex = hmac.new(secret, request.data, digestmod='sha1').hexdigest()
    if hmac.compare_digest(hashhex, header_signature):
        repo = Repo('/data/blog-test/blog.github.io/') # 获取本地git仓库
        # repo = Repo('D:\project\mixed\\blog.github.io\\') # 获取本地git仓库
        # origin = repo.remotes.origin # 获取远程库 & 远程分支
        # origin.pull('--rebase') # 拉代码
        remote = repo.remote()
        remote.pull('master')
        
        if 'after' in request.json:
            commit = request.json['after'][0:6] # pull 的最新的commit
            print('Repository updated with commit {}'.format(commit))
            
    else:
        return '签名校验失败!'
        
    return jsonify({}), 200
    
if __name__ == "__main__":
    app.run(port=8001)
image
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: flask GitHub gitpython HEXO webhook
最后更新:2019年10月29日

GoldenJet

爱折腾技术的90后漫威小死忠程序员一枚

点赞
< 上一篇

文章评论

取消回复

通过电子邮件订阅博客

分类目录
  • BootStrap (2)
  • Bug集中营 (6)
  • Java web (3)
  • JavaScript (7)
  • Java基础 (17)
  • Java工具 (5)
  • Linux (3)
  • Python (3)
  • SpringBoot (14)
  • Spring基础 (8)
  • thymeleaf (1)
  • 娱乐 (3)
  • 小谈 (2)
  • 常用工具 (7)
  • 技术分析集 (5)
  • 技能 (10)
  • 源码 (4)
  • 科普类 (1)
  • 算法 (9)
  • 踩坑记 (5)
文章归档
  • 2020年11月 (1)
  • 2020年7月 (1)
  • 2020年4月 (2)
  • 2020年3月 (1)
  • 2020年1月 (1)
  • 2019年11月 (1)
  • 2019年10月 (1)
  • 2019年9月 (1)
  • 2019年8月 (1)
  • 2019年7月 (2)
  • 2019年5月 (2)
  • 2019年4月 (2)
  • 2019年3月 (3)
  • 2019年2月 (2)
  • 2019年1月 (2)
  • 2018年12月 (2)
  • 2018年11月 (3)
  • 2018年10月 (3)
  • 2018年9月 (2)
  • 2018年8月 (3)
  • 2018年7月 (2)
  • 2018年5月 (1)
  • 2018年4月 (3)
  • 2018年3月 (2)
  • 2018年2月 (3)
  • 2018年1月 (5)
  • 2017年12月 (2)
  • 2017年11月 (3)
  • 2017年10月 (1)
  • 2017年9月 (1)
  • 2017年8月 (1)
  • 2017年7月 (7)
  • 2017年6月 (5)
  • 2017年5月 (1)
  • 2017年4月 (2)
  • 2017年3月 (4)
  • 2017年2月 (2)
小伙伴友链
  • 前端驿站

COPYRIGHT © 2017-2020 嘎里三分熟. ALL RIGHTS RESERVED.

浙ICP备17005575号-1

浙公网安备 33010802009043号