使用GitHub的Webhooks功能


GitHub 中的 Webhooks 多用于完成仓库的自动化更新和部署

GitHub 上,很早就提供了对应 Webhook 的支持,其主要的用途就是增加项目仓库的可玩性,比如自动化更新部署、推送消息提醒,等等。今天,我们就一起看看其的具体用途和配置方式。咳咳咳,那就开始吧!

使用GitHub的Webhooks功能


1. 功能介绍

主要介绍 Webhook 到底是个啥,有什么用处!

Webhook 就是用户通过自定义回调函数(callback)的方式来改变 Web 应用的一种行为,这些回调函数可以由不是该 Web 应用官方的第三方用户或者开发人员来维护,修改。通过 Webhook,你可以自定义一些行为通知到指定的 URL 去。Webhook“自定义回调函数” 通常是由一些事件触发的,比如推送代码到代码库或者博客下新增一个评论,源站点会为 Webhook 进行 HTTP 请求的 URI 配置。用户通过配置,就可以使一个网站上的事件调用在另一个网站上表现出来,这些事件调用可以是任何事件,但通常应用的是系统集成和消息通知。

使用GitHub的Webhooks功能 - 工作交互方式


2. 操作实现

主要介绍的是 Github 中,使用 Webhook 完成自动化更新

  • [1] Github 仓库设置

GitHub 上需要更新的代码仓库添加 Webhooks,在对应界面上面添加回调的推送服务器地址等。

使用GitHub的Webhooks功能 - Github仓库设置

  • [2] 编写回调的脚本 - Python

这里需要注意的是,GitHub 加密是将 post 提交的 dataWebHookssecret 通过 hmacsha1 进行加密,然后放到 HTTP headersX-Hub-Signature 参数中,所以我们验证认证签名是否,可以通过判断对应的字段进行确定。

import hmac
import sh
from flask import Flask, request, jsonify

GITHUB_SECRET = 'GitHub Secret'

app = Flask(__name__)

def encryption(data):
    key = GITHUB_SECRET.encode('utf-8')
    obj = hmac.new(key, msg=data, digestmod='sha1')
    return obj.hexdigest()

@app.route('/webhook', methods=['POST'])
def post_data():
    post_data = request.data
    token = encryption(post_data)
    signature = request.headers.get('X-Hub-Signature', '').split('=')[-1]
    if signature != token:
        return "token认证无效", 401
    sh.bash('/data/github/test/deploy.sh')
    return jsonify({"status": 200})

if __name__ == '__main__':
    app.run(port=9000)
  • [3] 服务自动化配置 - Supervisor/Nginx

这里需要配置 SupervisorNginx 服务主要是为了方便管理而已,如果你不配置的话,也是可以的,直接使用 9000 端口。

# Supervisor
[program:github-webhook]
directory=/data/github/test
command=/data/github/test/venv/bin/python3 webhook.py
autostart=true
autorestart=false
startsecs=1
user=root
stderr_logfile=/etc/supervisor/logs/webhooks/stderr.log
stdout_logfile=/etc/supervisor/logs/webhooks/stdout.log
redirect_stderr=true
loginfo=info
server {
    listen 80;
    server_name _;

    client_max_body_size 80M;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:9000;
    }
}

文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !