天天看点

利用github的webhooks实现自动部署

github的webhooks是什么?

github的webhooks允许用户声明在哪些事件触发时向用户指定的URL发送一个POST请求。比如说我在A仓库设置了一个这样的webhook: payload URL 为http://example.com/github/webhook, 触发事件为push; 那么当我向A仓库进行push后,github就会向https://example.com/github/webhook 发送一个POST请求。事件的定义请参阅 https://developer.github.com/webhooks/#events

如何实现?

看完上面的描述,我们首先需要一个http服务器,这是我写的一个专门用于github的webhooks的http服务器,建议配合nginx/caddy的反向代理,当然也可以单独使用。

首先在/etc目录下创建一个github-webhooks目录,再在github-webhooks目录下创建一个config文件(也可以通过-c指定其他的文件),该文件每一行都是一个webhook,一行里有三个参数,参数之间用空格分开。第一个参数是URL的相对路径,第二个参数是Secrect Key(与webhooks设置的一致),第三个参数是可执行文件的路径。当webhook发生时,程序会根据Secrect Key对请求进行校验,检验通过后会根据第三个参数执行对应的程序,并向该程序传入两个参数,第一个参数是事件类型,如"push",和二个参数是request body。下面看一个例子:

可执行文件路径: /usr/local/bin/push.sh,代码如下:

#!/bin/sh
# 打开对应的目录
cd /path/to/example
# 拉取代码
git pull origin master
# 删除之前的部署的代码文件
rm -rf /var/www/example/*
# 重新部署,hugo是一个生成静态网站的工具
hugo -d /var/www/example/
exit 0
           

/etc/github-webhooks/config的配置如下,其中/gihub/webhook对应着上面的http://example.com/github/webhook。

/github/webhook aabbcc123 /usr/local/bin/push.sh
           

然后在需要进行webhook的仓库设置webhook即可

继续阅读