使用Github的webhooks进行网站自动化部署

相信很多码农都玩过了Git,如果对Git只是一知半解,可以移步LV写的 GIT常用操作总结,下面介绍到的一些关于 Git 的概念就不再赘述。
为啥想写这篇文章?主要是因为部门服务器因为安全性原因不允许SCP上传文件进行应用部署,然后有一些应用是放在Github上的,然后部署应用的步骤就变成:
1.git clone github项目 本地目录
2.配置一下应用的pm2.json并reload
3.Nginx配置一下反向代理并restart
当然如果只是一次性部署上去就不再修改的话并没啥问题,但是要是项目持续性修改迭代的话,就比较麻烦了,我们就在不断的重复着上面的步骤。作为一个码农,怎么允许不断的重复同样的工作,于是Github webhooks闪亮登场。
关于Github webhooks
让我们看看 官方 关于Github webhooks的解释:
Webhooks allow you to build or set up integrations which subscribe to certain events on GitHub.com.
提炼出来几个点:
- 必须是Github上面的项目
- 订阅了确定的事件(包括push/pull等命令)
- 自动触发
刚好符合了这几个条件,那接下来就看看如何进行网站自动化部署,主要会从下面几点来讲解:
1.自动化shell脚本
2.服务端实现
3.配置github webhooks
自动化脚本
我之前翻译过一篇文章 使用Node.JS创建命令行脚本工具,但是我们现在的自动化脚本直接用 shell 来实现,假设名称为auto_build.sh:
| 
 | 
 | 
Note: 在执行上面shell脚本之前我们必须第一次手动git clone项目进去,例如:
| 
 | 
 | 
shell脚本其实就跟直接在终端运行命令一样,类似于windows下面的BAT批处理命令,更多详细可以查阅资料。
服务端实现
Github webhooks需要跟我们的服务器进行通信,确保是可以推送到我们的服务器,所以会发送一个带有X-Hub-Signature的POST请求,为了方便我们直接用第三方的库github-webhook-handler来接收参数并且做监听事件的处理等工作。
现在我们可以在shell脚本的同级目录下面执行下面命令初始化一个package.json:
| 
 | 
 | 
然后执行下面命令安装上面提到的第三方库:
| 
 | 
 | 
接下来创建我们的服务主入口文件index.js:
| 
 | 
 | 
紧接着参考github-webhook-handler的demo编辑我们的index.js:
| 
 | 
 | 
然后利用node管理工具跑起来服务,这里使用了pm2:
| 
 | 
 | 
到这一步服务已经跑起来了,但是对外网并不能直接访问到,所以还需要配置一下Nginx做一下反向代理:
| 
 | 
 | 
OK,到这里整个服务已经搭建完成,下一步就只需要配置Github webhooks。
配置github webhooks
我们可以在我们的Github上面最右边有一个Settings的Tab,找到Webhooks & services,如下图:

然后点击新建,输入Payload URL跟Secret,确定即可。
验证
绑定成功之后,我们可以试试提交一下代码,然后来到Github看看是否自动触发了接口,如下图:

然后随便选择一个点击一下,可以看到200的响应:

小结
上面就是利用Github webhooks进行网站自动化部署的全部内容了,不难发现其实这项技术还是有局限性的,那就是依赖于github,一般我们选择的都是免费github账号,所有项目都对外,一些敏感项目是不适合放置上去的。
这个时候就考虑这个组里同事推荐的 backup,自己还没试用,有兴趣可以了解了解。