UDN-企业互联网技术人气社区

板块导航

浏览  : 397
回复  : 2

[原生js] 创建一个基于webhook的简易部署系统

[复制链接]
htmlman的头像 楼主
发表于 2017-1-2 16:11:12 | 显示全部楼层 |阅读模式
  安装nodejs 

  安装nodejs建议直接下载二进制包,把官网上的64位二进制版本下载地址复制下来,执行

  wget https://nodejs.org/dist/v6.9.2/node-v6.9.2-linux-x64.tar.xz

  xz 格式的文件按照以下命令解压:
  1. xz -d xxx.tar.xz
  2. tar xvf xxx.tar
复制代码

  解压之后把目录拷贝到 /usr/local/node 目录下
  1. cp ~/node_v**** /usr/local/node
复制代码

  为了方便全局启动需要在 /usr/local/bin 下创建文件软连接
  1. ln -s /usr/local/node/bin/npm /usr/local/bin

  2. ln -s /usr/local/node/bin/node /usr/local/bin
复制代码

  执行完毕之后就可以全局使用 npm 和 node 命令了。

  由于网络问题,国内可以使用阿里NPM镜像 cnpm
  1. npm install -g cnpm --registry=https://registry.npm.taobao.org
复制代码

  然后通常 /usr/bin 下面的都是系统预装的可执行程序,会随着系统升级而改变 /usr/local/bin 目录是给用户放置自己的可执行程序的地方,推荐放在这里,不会被系统升级而覆盖同名文件.如果两个目录下有相同的可执行程序,谁优先执行受到 PATH 环境变量的影响.

  编写webhook代码

  部署脚本

  这里我们要实现远程http调用之后可以启动shell脚本,所以我们先编写部署脚本,由于这个项目我的开发环境和测试环境的配置文件不一样,所以将git目录和部署目录分开了。这样就需要两个目录之间的 单向同步 ,这里我采用的方案是 rsync ,虽然 diff 也能实现文件夹比对,但是同步过程复杂,需要手动分析目录变动。

  这个项目的框架是 laravel , xxx_git 是源码目录, xxx 是部署目录,具体情况可以调整。

  这里我们对于目录采用 rsync 单向同步,对单文件采用 cp 直接覆盖方式。
  1. #!/bin/bash
  2. cd /home/wwwroot/xxx_git
  3. git pull origin master
  4. cp /home/wwwroot/xxx_git/composer.json /home/wwwroot/xxx/composer.json
  5. cp /home/wwwroot/xxx_git/composer.lock /home/wwwroot/xxx/composer.lock
  6. cp /home/wwwroot/xxx_git/_ide_helper.php /home/wwwroot/xxx/_ide_helper.php
  7. rsync --delete -avzp /home/wwwroot/xxx_git/app /home/wwwroot/xxx/
  8. rsync --delete -avzp /home/wwwroot/xxx_git/public /home/wwwroot/xxx/
  9. rsync --delete -avzp /home/wwwroot/xxx_git/resources/lang /home/wwwroot/xxx/resources
  10. rsync --delete -avzp /home/wwwroot/xxx_git/resources/views /home/wwwroot/xxx/resources
复制代码

  脚本编写完毕之后执行下面的命令赋予执行能力

  chmod +x ./my_sync.sh.sh

  rsync参数:

  • -a :表示归档模式,用递归方式传输文件
  • -v :详细输出
  • -z :传输时对文件进行压缩处理
  • -r :对子目录进行递归
  • -t :保持文件的时间信息
  • -p :保持文件的权限
  • -o :保持文件的属主信息
  • -g :保持文件的属组信息
  • --delete :表示以服务端为基准进行同步,保持服务端的目录文件和客户端的完全一致
  • --progress :用于显示数据同步的过程
  • --exclude :排除不需要同步的目录或者文件

  webhook接口编写

  这里我采用了gitos上面的webhoos,其他的gitlab、github大同小异。

  OSChina的webhook可见 这里

  这里我采用了 express + child_process 解决调用问题,这个过程就比较简单了,这里面需要注意的是检测提交 push 操作的是不是 master 分之,其他分之的提交使不处理的。

  这里 exec 和 req.send() 是没有回调关系的,所以服务器webhook时候不会超时。另外这里还实现了脚本运行的日志记录,可以针对每次部署来查看具体文件变更情况。
  1. var express = require('express');
  2. var app = express();
  3. var cp = require('child_process');
  4. var bodyParser = require('body-parser');
  5. var jsonParser = bodyParser.json();
  6. var moment = require('moment');

  7. app.post('/git' , jsonParser ,function(req , res){
  8.     var json = req.body;
  9.     if(json.password == 'xxxx'){
  10.         if (json.ref == 'refs/heads/master'){
  11.             var logName = (moment().format('YYYY-MM-DD_HH:m:s'))+'.log';
  12.             var command = '/home/nodejs/git_puber/my_sync.sh >> /home/nodejs/git_puber/' + logName;
  13.             cp.exec(command, function(err, out, code) {
  14.               if (err instanceof Error) {
  15.                 // res.writeHead(500)
  16.                 // res.end('Server Internal Error.')
  17.                 // throw err
  18.                 console.log(err + new Date());
  19.               }else{
  20.                 console.log(out + new Date());
  21.               }
  22.             });
  23.         }else{
  24.             console.log('not master branch');
  25.         }
  26.     }else{
  27.         console.log('no auth pass');
  28.     }
  29.     res.statusCode = 200;
  30.     res.setHeader('Content-Type', 'text/plain');
  31.     res.send({result:('ok' + new Date()) , msg: 'your message has been delievered'});
  32.     // res.send();
  33. });

  34. app.listen(3000 , function(){
  35.     console.log('Server Is Running' + new Date());
  36. });
复制代码

  运行监控程序

  nodejs是异步单线程,在一些情况下会出现异常退出的情况,为了保证服务常可用,我们需要一个 pm2 来保证程序的运行。
  1. npm install pm2 -g
复制代码

  这里如果安装速度慢的话可以使用 cnpm 安装。

  执行 pm2 start node app.js 即可以后台维护运行node程序。

  pm2一些命令
  1. pm2 list

  2. pm2 stop all/[name]

  3. pm2 start all/[name]
复制代码

  自动部署
  1. git checkout dev
复制代码

  切换到dev分支后修改文件
  1. git commit
复制代码

  切换到主分支然后将dev分之合并过来
  1. git checkout dev && git merge dev
复制代码

  提交之后服务器自动部署
  1. git push
复制代码

相关帖子

发表于 2017-1-2 16:11:41 | 显示全部楼层
路过 帮顶 嘿嘿
使用道具 举报

回复

发表于 2017-1-2 21:06:30 | 显示全部楼层
个人觉得js是一种解释性语言,它提供了一个非常方便的开发过程,不需要编译,js与HTML标识结合在一起,从而方便用户的使用操作。
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部