GitHub 中的 Webhooks 多用于完成仓库的自动化更新和部署
在 GitHub
上,很早就提供了对应 Webhook
的支持,其主要的用途就是增加项目仓库的可玩性,比如自动化更新部署、推送消息提醒,等等。今天,我们就一起看看其的具体用途和配置方式。咳咳咳,那就开始吧!
1. 功能介绍
主要介绍 Webhook 到底是个啥,有什么用处!
Webhook
就是用户通过自定义回调函数(callback
)的方式来改变 Web
应用的一种行为,这些回调函数可以由不是该 Web
应用官方的第三方用户或者开发人员来维护,修改。通过 Webhook
,你可以自定义一些行为通知到指定的 URL
去。Webhook
的 “自定义回调函数” 通常是由一些事件触发的,比如推送代码到代码库或者博客下新增一个评论,源站点会为 Webhook
进行 HTTP
请求的 URI
配置。用户通过配置,就可以使一个网站上的事件调用在另一个网站上表现出来,这些事件调用可以是任何事件,但通常应用的是系统集成和消息通知。
2. 操作实现
主要介绍的是 Github 中,使用 Webhook 完成自动化更新
- [1] Github 仓库设置
在 GitHub
上需要更新的代码仓库添加 Webhooks
,在对应界面上面添加回调的推送服务器地址等。
- [2] 编写回调的脚本 - Python
这里需要注意的是,GitHub
加密是将 post
提交的 data
和 WebHooks
的 secret
通过 hmac
的 sha1
进行加密,然后放到 HTTP headers
的 X-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
这里需要配置 Supervisor
和 Nginx
服务主要是为了方便管理而已,如果你不配置的话,也是可以的,直接使用 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;
}
}