美文网首页
程序日记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年5月7号开心学习一天

    2018-05-07 ty活出真善美 2018-05-05 22:11 · 字数 671 · 阅读 5 · 日记本...

  • 程序日记2018-05-05

    github webhook自动部署nodejs项目 1.服务器环境: centos 7 nodejs 8 ngi...

  • 2018-05-05

    ZFQ_dacf 2018-05-05· 字数 543· 阅读 65· 日记本 姓名:周富强 公司:厦门大科机械有...

  • 5月5日觉查日记

    祉祤有梦 2018-05-05 21:52 · 字数 2330 · 阅读 27 · 日记本 晚上翻看了下51job...

  • 酷酷的医证(69)

    一牙一故事 2018-05-05 05:52 · 字数 691 · 阅读 0 · 日记本 逆行性牙髓炎 见: 1....

  • MATLAB分布式并行计算中函数的使用

    2018-05-05 MATLAB分布式并行计算中函数的使用 1、parfor 函数 Execute for-lo...

  • 2018-05-05盗用日记

    一、读经养生汇报 1. [早起早课]:04:50 《茶话会》场记 2. [父母读经]:通读《易经》三十一至大易诗 ...

  • 日精进打卡(第302天)

    2018-05-05 姓名:李义 公司:........ 组别:259期利他二组 【知~学习】 背诵 六项精进大纲...

  • 云南旅游攻略

    1.时间2018-04-30 ~ 2018-05-05 2018-04-30 去 2018-05-06 返 04-...

  • 非己勿贪

    2018-05-05 星期六 小雨 今天,我们去市场买菜,孩子想喝奶,我们就去买,有鲜奶、有酸...

网友评论

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

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