github webhook自动部署nodejs项目
1.服务器环境:
- centos 7
- nodejs 8
- nginx
2.生成sshkey
# ssh-keygen -t rsa -C "youremail@example.com"
默认生成在用户根目录,注意不要设置phrase,不然自动部署比较麻烦。
3.github添加webhook
项目添加webhook比如我要在本地A项目push之后,服务器自动pull A项目部署。我就在A项目上面找到Settings ,选择Webhooks。
其中 payload URL就是服务器需要监听github推送的消息地址,就是等下需要使用nodejs编写的webhook服务器地址。我这里是:http://yourserver/deploy,不过需要用到nginx配置端口映射,其实也可以简单地使用http://yourserver:6666的形式,就不需要配置nginx,随您喜欢。
Content Type 选择json,方便解析。
Secret 随便填写一个,用于防止其他恶意部署指令。
最后保存就OK了。
3.服务器编写监听脚本
这里直接贴代码了,其中比较重要的是Secret的校验
const http = require('http');
const url = require('url');
const qs = require('querystring');
const exec = require('child_process').exec;
const crypto = require('crypto');
//github 的secret
const GITHUB_WEBHOOK_SECRET = 'vo87lf78LGYJFVu6D';
http.createServer(function (req, res) {
req.setEncoding('utf-8');
var postData = '';
req.addListener('data', function (postDataChunk) {
postData += postDataChunk;
});
req.addListener('end', function () {
const params = Object.assign({}, JSON.parse(postData), qs.parse(url.parse(req.url).query));
//验证secret
const hmac = crypto.createHmac('sha1', GITHUB_WEBHOOK_SECRET);
const ourSignature = `sha1=${hmac.update(postData).digest('hex')}`;
const theirSignature = req.headers['x-hub-signature'];
const bufferA = Buffer.from(ourSignature, 'utf8');
const bufferB = Buffer.from(theirSignature, 'utf8');
const safe = crypto.timingSafeEqual(bufferA, bufferB);
if(!safe)
{
console.log('secret not match!')
return ;
}
//自动部署
const project = params.repository.name.toString().trim();
const author = params.repository.owner.login.toString().trim();
console.log(`项目${project}的有代码push,提交人:${author}`);
//这里是运行shell的地方
let cmd = `cd /srv/${project} && git pull &&`;
cmd += ' pm2 startOrReload pm2.json';
console.log('cmd: ', cmd);
exec(cmd, function (error, stdout, stderr) {
console.log('error =>', error);
console.log('stdout =>', stdout);
console.log('stderr =>', stderr);
});
res.writeHead(200, {'Content-Type': 'text-plain'});
res.end('ok');
});
//如果上面webhook payload地址使用http://yourserver:6666的形式,这里的'127.0.0.1'参数可以删掉
}).listen(6666, '127.0.0.1');
console.log('start server');
4. 配置nginx (optional)
如果上面webhook payload地址使用http://yourserver/deploy的形式,需要nginx做配置
# vim /etc/nginx/conf.d/default.conf
添加以下配置
location /deploy {
proxy_pass http://127.0.0.1:6666;
}
5. 测试是否成功
github webhooks 点击Redeliver测试如果Response 是200就是成功了!
网友评论