webhook
最后更新于:2022-04-02 05:41:31
## 前言
如果你不想人肉的去操作命令行,可以设置下webhook,目前的github以及gitlab都支持这项设置。原理就是获取github的源码事件类型,然后基于服务器的服务通讯执行shell命令。
## 教程
### 准备一个github or gitlab的项目
* 将项目在linux服务器上通过git下载下来
* 设置webhook,需要设置的有:
请求的url,令牌(token),
触发的类型:push,delete等等,为了及时的更新,我设置的是commit提交便触发
应用类型:application/json类型
做相关的记录和提醒。
### 准备一个可以外网访问的服务器(linux系统)
我们以node作为服务器,来实现shell脚本以及命令。参考源码如下:需要同步的项目和同步相关的命令可以自己执行,目前参考代码里仅有切换到项目目录,做更新的操作,如果需要的话,可以加上构建的过程,比如npm build,这样就可以做到实时构建发布。
~~~
var http = require('http')
, exec = require('exec')
const PORT = 9001
, PATH = '/home/ucmed/wwwroot/webhookDemo'
var deployServer = http.createServer(function(request, response) {
if (request.url.search(/deploy\/?$/i) > 0) {
var commands = [
'cd ' + PATH,
'git pull'
].join(' && ')
exec(commands, function(err, out, code) {
if (err instanceof Error) {
response.writeHead(500)
response.end('Server Internal Error.')
throw err
}
process.stderr.write(err)
process.stdout.write(out)
response.writeHead(200)
response.end('Deploy Done.')
})
} else {
response.writeHead(404)
response.end('Not Found.')
}
})
deployServer.listen(PORT)
~~~
备注:使用secret,那么需要设置安装 `github-webhook-handler`,操作比较复杂,建议使用上面的方法即可。
* [参考使用github-webhook-handler链接](http://www.jianshu.com/p/e4cacd775e5b)
### 启动服务
* 简单调试启动,开发状态启动(窗口关闭之后,服务失效)
`node server.js`
* 热启动,一直进行
~~~
// 设置后台执行,简单用法
nohup node server.js
~~~
* forever 模块,永久启动模块
~~~
$ cnpm install -g forever
//永久启动模块 会提示没有设置时间,不影响实际运行
$ forever start deploy.js
$ forever list
//关闭某个具体进程
$ forever stop 1
//关闭后的日志(其中14039 为进程的id)
info: Forever stopped process:
uid command script forever pid id logfile uptime
[0] jxSu /home/soft/nvm/versions/node/v7.4.0/bin/node /home/ucmed/wwwroot/server/server.js 14033 14039 /home/ucmed/.forever/jxSu.log 0:0:5:1.993
$ forever restartall
// 查看所有的日志
forever logs
//查看日志实时打印
tail -f xxx.log
~~~
* [参考forever模块介绍](https://npm.taobao.org/package/forever)
';