使用Github的webhooks进行代码的自动化同步


随着GitHub私有仓库的免费,我们可以使用GitHub做很多事情。
我们使用GitHub的webhooks功能,可以将本地的代码自动同步到我们服务器上,自动的更新我们的代码。

setting > webhooks

Webhooks allow external services to be notified when certain events happen. When the specified events happen, we’ll send a POST request to each of the URLs you provide. -来自GitHub

Webhooks允许在发生特定事件时通知外部服务。 当指定的事件发生时,我们将向您提供的每个URL发送POST请求。通过这个post请求,我们就能实现自动拉取仓库中的代码,更新到本地,最终实现自动化更新

使用Github的webhooks进行代码的自动化同步
在自动同步端,我们首先将仓库clone到本地,然后通过编写sh脚本实现自动拉取代码,同步。

WEB_PATH='../test'   //仓库位置
WEB_USER='root'
WEB_USERGROUP='root'
 
echo "Start deployment"
cd $WEB_PATH
echo "pulling source code..."
git reset --hard origin/master
git clean -f
git pull
git checkout master
echo "changing permissions..."
chown -R $WEB_USER:$WEB_USERGROUP $WEB_PATH
echo "Finished."

编写post接口,使用nodejs

var http = require('http');
var spawn = require('child_process').spawn;
var createHandler = require('github-webhook-handler');
// 下面填写的myscrect跟github webhooks配置一样,下一步会说;path是我们访问的路径
var handler = createHandler({ path: '/api', secret: 'secret' });
http.createServer(function (req, res) {
  handler(req, res, function (err) {
    res.statusCode = 404;
    res.end('no such location');
  })
}).listen(3002);
handler.on('error', function (err) {
  console.error('Error:', err.message)
});
// 监听到push事件的时候执行我们的自动化脚本
handler.on('push', function (event) {
  console.log('Received a push event for %s to %s',
    event.payload.repository.name,
    event.payload.ref);
  runCommand('sh', ['./deploy.sh'], function( txt ){
    console.log(txt);
  });
});
function runCommand( cmd, args, callback ){
    var child = spawn( cmd, args );
}

在GitHub中配置接口urlhttp://xxx.xxx/api,secret填写与代码中的secret一致

nodejs执行sh脚本的时候会出现spawn sh enoent错误,此时,我们需要将git中的sh.exe配置到系统的环境变量中,比如我的git安装目录为C:\Program Files\Git
此时,我们需要将包含sh.exe文件的路径配置到环境变量,如图C:\Program Files\Git\bin
使用Github的webhooks进行代码的自动化同步使用Github的webhooks进行代码的自动化同步
这样,我们在将代码推送到GitHub后,会自动同步到我们的服务器上。

相关文章: