程序日记2018-05-05

github webhook自动部署nodejs项目

1.服务器环境:

  • centos 7
  • nodejs 8
  • nginx

2.生成sshkey

# ssh-keygen -t rsa -C "[email protected]"

默认生成在用户根目录,注意不要设置phrase,不然自动部署比较麻烦。

>>点击跳转详细指引

3.github添加webhook

程序日记2018-05-05_第1张图片
项目添加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. 测试是否成功

程序日记2018-05-05_第2张图片
github webhooks
程序日记2018-05-05_第3张图片
点击Redeliver测试

如果Response 是200就是成功了!

>>让你的网站秒配 HTTPS 证书

你可能感兴趣的:(程序日记2018-05-05)