美文网首页
程序日记2018-05-05

程序日记2018-05-05

作者: Purson | 来源:发表于2018-05-05 03:58 被阅读0次

    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就是成功了!

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

    相关文章

      网友评论

          本文标题:程序日记2018-05-05

          本文链接:https://www.haomeiwen.com/subject/ggfsrftx.html