这篇博文可以让你明白,什么是Webhook,Webhook有哪些事件,设置Webhook的条件和流程。特别是自动部署线上服务器。和一些简单的linux操作。今年五月份的时候,因为毕业设计是做一个app,所以需要写后端,那个时候只懂用 Java EE 做后端。所以就用Java EE,因为Java是静态语言,你所有东西写完后,需要编译后才能生效。每次有更改后部署最烦人。特别花时间。那个时候就想,一定要学习Github Webhook。那时候就觉得这玩样好高端。近段时间在学习 Python ,然后通过 Python 写一个Webhook,回过来看,其实就是通过在github有事件的时候发一个Post请求给你服务器。服务器接到发过来的信息后,进行一些操作就完了。Java也可以写,只是多一条编译命令就好了。
设置Webhook的条件
- 一台外网可访问的主机。
- 一台能够响应Webhook的服务器。
什么是Webhook
什么是Webhook?用中文来说就是 钩子 , 在你的仓库有更改时,有事件发生时,及时的检测到。通过配置webhook,你可以在仓库发生变化时候,立即部署你的线上服务器。还可以将博客部署到服务器,因为我的博客是hexo的,每次换电脑写博客是件特别麻烦的事。
Webhook事件
使用Git的Webhooks进行服务器自动部署代码 ,你可以根据以下事件,设置每个事件的webhook,默认是push事件。
名称 | 描述 |
---|---|
* | 触发的任何情况,通配符 |
commit_comment | 提交完成了一个 Commit |
create | 创建了一个Branch或者Tag |
delete | 删除了一个Branch或者Tag |
deployment | 一个Repository通过API有个一个新的部署 |
deployment_status | 一个Repository的部署的状态通过API改变 |
fork | 一个Repository被fork了 |
gollum | Wiki页面被更新 |
issue_comment | 一个issue的评论被创建,修改,删除 |
issues | 一个issues的全部状态 |
member | 一个用户添加了一个collaborator到项目中 |
membership | 一个用户添加或者移除了一个从一个组织,区别去上一个的是,上一个针对于项目,这个针对于组织. |
page_build | GitHub page 创建或者失败 |
public | 私有项目转换成公开项目 |
pull_request_review_comment | 一个pull_request的评论的状态变化 |
pull_request | 一个pull_request的所有状态变化 |
push | push一次代码,操作对象包括修改分支,标签.调用API的也会被算进去.默认的事件. |
repository | 一个项目被创建,删除,转换公开,转换私有. |
release | 在一个项目上创建一个release |
status | 一个项目的status通过API进行改变 |
team_add | 项目添加或者修改一个team |
watch | 一个项目被用户star |
用 Python编写Webhook响应服务器
响应代码
# webhook.py import os def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) os.system('git add .') os.system('git commit -m "merge"') os.system('git pull origin master') print('git pull finish') return [b'
Hello, webhook!
']开启服务
# start_webkook.py
#!/usr/bin/env python
# coding=utf-8
from wsgiref.simple_server import make_server
# 导入我们自己编写的application函数:
from webhook import application
# 创建一个服务器,IP地址为空,端口是8000,处理函数是application:
httpd = make_server('', 8000, application)
print('Serving HTTP on port 8000...')
# 开始监听HTTP请求:
httpd.serve_forever()
部署
- 运行脚本
nohup python start_webkook.py &
Note:必须要加上nohup,不然在父进程被杀掉后,子进程也完蛋了。具体可以查看解决Linux关闭终端(关闭SSH等)后运行的程序自动停止
设置Webhook
剩下最后一步,设置Webhook
- 进入github->repository->settings->webhook
- 填写 webhook,如下:
- 更改下仓库,push一下。可以在webhook下查看每次你push之后,webhook给你的服务器发送的数据。如下: