webhooks 自动部署

原理

利用Github在仓库进行操作时,可以通过配置webhook向服务器发送请求,在服务器端接到请求后,使用脚本来自动进行git pull操作。即,当我在本地机器A进行一个push操作到github,github会在这个操作结束后,发起一个POST请求到机器B,机器B收到这个请求后,执行同步操作,git fetch等等,因为使用的web服务,交换的数据格式为json等,所以叫webhooks,web钩子。

准备工作

  1. VPS (独立IP),或者能请求到的http服务网址就行,服务受自己控制
  2. nodeJS

第一步 在机器B编写webhooks服务

webhooks服务可以使用Java Web,也可以使用Node,只要可以监听端口,并接收响应web请求就可以。

我这里使用的Node的简易的Web服务。

webhook.js

var http=require('http')
var createHandler = require('github-webhook-handler')
var handler = createHandler({ path: '/', secret: '****' })
// 上面的 secret 保持和 GitHub 后台设置的一致
function run_cmd(cmd, args, callback) {
  var spawn = require('child_process').spawn;
  var child = spawn(cmd, args);
  var resp = "";
  child.stdout.on('data', function(buffer) { resp += buffer.toString(); });
  child.stdout.on('end', function() { callback (resp) });
}
http.createServer(function (req, res) {
  handler(req, res, function (err) {
    res.statusCode = 404
    res.end('no such location')
  })
}).listen(7777)
handler.on('error', function (err) {
  console.error('Error:', err.message)
})
handler.on('push', function (event) {
  console.log('Received a push event for %s to %s',
    event.payload.repository.name,
    event.payload.ref);
    run_cmd('sh', ['./deploy.sh',event.payload.repository.name], function(text){ console.log(text) });
})

第二步 编写deploy.sh脚本

deploy.sh

WEB_PATH='/root/blog/linjinbao66'    ## 网站目录
echo "start deployment"
cd $WEB_PATH
echo "fetching from remote..."
# 为了避免冲突,强制更新本地文件
git fetch --all
git reset --hard origin/master
echo "done"

第三步 启动node服务

npm i -g github-webhook-handler
npm i pm2 -g
npm link github-webhook-handler
pm2 start webhook.js

第四步 创建本地仓库 并连接远程git仓库

mkdir linjinbao66
git init 
git remote add ***

第五步 在gitub网站申请webhooks secret

申请到的Secret,替换第一步的Secret的值,或者使用第一步的Secret作为申请的Secret,只要保证一致即可。

官方Guide

测试

在机器A上执行git push 试试,可以在WebHooks 的Recent Deliveries中看到记录。