当本地有代码通过git上传后,服务器收到github代码变更的通知,然后调用脚本拉取(git pull)最新的代码,最后重启程序(如:pm2 restart myproject)。所以只要通过git push完成后部署的程序就会自动热更新。
在github中对项目进行设置
- 打开项目,如:nodeblog
- 点击Settings->Webhooks->Add webhook
Palyload URL: http://123.57.244.171:3333/nodeblog
Content type: application/json
Secret: 自定义(如:123456)
选Just the push event就可以了
- 点击Update webhook
接收github变更通知
nodejs服务代码
var http = require('http')
var createHandler = require('github-webhook-handler')
var handler = createHandler({ path: '/nodeblog', secret: '123456' })
function RunCmd(cmd, args, cb) {
var spawn = require('child_process').spawn;
var child = spawn(cmd, args);
var result = '';
child.stdout.on('data', function(data) {
result += data.toString();
});
child.stdout.on('end', function() {
cb(result)
});
}
http.createServer(function (req, res) {
handler(req, res, function (err) {
res.statusCode = 404;
res.end('no such location');
})
}).listen(3333)
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);
var shpath = './' + event.payload.repository.name + '.sh';
RunCmd('sh', [shpath], function(result) {
console.log(result);
})
})
handler.on('issues', function (event) {
console.log('Received an issue event for %s action=%s: #%d %s',
event.payload.repository.name,
event.payload.action,
event.payload.issue.number,
event.payload.issue.title);
})
脚本代码
PRO_DIR="/root/nodeblog"
echo "start--------------------"
cd $PRO_DIR
echo "pull git code"
git pull
echo "restart nodeblog"
pm2 restart nodeblog
echo "finished-----------------"
安装组件:npm install github-webhook-handler —save
注意监听端口,项目名,path以及secret要与github Settings中的设置一致