zoukankan      html  css  js  c++  java
  • Webhook 实践 —— 自动部署

    https://segmentfault.com/a/1190000007892407

    安装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 将 xxx.tar.xz解压成 xxx.tar

    2. tar xvf xxx.tar来解包

    解压之后把目录拷贝到/usr/local/node目录下

    cp ~/node_v**** /usr/local/node

    为了方便全局启动需要在/usr/local/bin下创建文件软连接

    ln -s /usr/local/node/bin/npm /usr/local/bin

    ln -s /usr/local/node/bin/node /usr/local/bin

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

    由于网络问题,国内可以使用阿里NPM镜像cnpm

    npm install -g cnpm --registry=https://registry.npm.taobao.org

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

    编写webhook代码

    部署脚本

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

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

    这里我们对于目录采用rsync单向同步,对单文件采用cp直接覆盖方式。

    #!/bin/bash
    cd /home/wwwroot/xxx_git
    git pull origin master
    cp /home/wwwroot/xxx_git/composer.json /home/wwwroot/xxx/composer.json
    cp /home/wwwroot/xxx_git/composer.lock /home/wwwroot/xxx/composer.lock
    cp /home/wwwroot/xxx_git/_ide_helper.php /home/wwwroot/xxx/_ide_helper.php
    rsync --delete -avzp /home/wwwroot/xxx_git/app /home/wwwroot/xxx/
    rsync --delete -avzp /home/wwwroot/xxx_git/public /home/wwwroot/xxx/
    rsync --delete -avzp /home/wwwroot/xxx_git/resources/lang /home/wwwroot/xxx/resources
    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分之,其他分之的提交使不处理的。

    这里execreq.send()是没有回调关系的,所以服务器webhook时候不会超时。另外这里还实现了脚本运行的日志记录,可以针对每次部署来查看具体文件变更情况。

    var express = require('express');
    var app = express();
    var cp = require('child_process');
    var bodyParser = require('body-parser');
    var jsonParser = bodyParser.json();
    var moment = require('moment');
    
    app.post('/git' , jsonParser ,function(req , res){
        var json = req.body;
        if(json.password == 'xxxx'){
            if (json.ref == 'refs/heads/master'){
                var logName = (moment().format('YYYY-MM-DD_HH:m:s'))+'.log';
                var command = '/home/nodejs/git_puber/my_sync.sh >> /home/nodejs/git_puber/' + logName;
                cp.exec(command, function(err, out, code) {
                  if (err instanceof Error) {
                    // res.writeHead(500)
                    // res.end('Server Internal Error.')
                    // throw err
                    console.log(err + new Date());
                  }else{
                    console.log(out + new Date());
                  }
                });
            }else{
                console.log('not master branch');
            }
        }else{
            console.log('no auth pass');
        }
        res.statusCode = 200;
        res.setHeader('Content-Type', 'text/plain');
        res.send({result:('ok' + new Date()) , msg: 'your message has been delievered'});
        // res.send();
    });
    
    app.listen(3000 , function(){
        console.log('Server Is Running' + new Date());
    });

    参考延伸
    《exec与spawn方法的区别与陷阱》

    运行监控程序

    nodejs是异步单线程,在一些情况下会出现异常退出的情况,为了保证服务常可用,我们需要一个pm2来保证程序的运行。

    npm install pm2 -g

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

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

    pm2一些命令
    pm2 list
    pm2 stop all/[name]
    pm2 start all/[name]

    自动部署

    git checkout dev

    切换到dev分支后修改文件

    git commit

    切换到主分支然后将dev分之合并过来

    git checkout dev && git merge dev

    提交之后服务器自动部署

    git push

  • 相关阅读:
    Python3中最常用的5种线程锁你会用吗
    学会使用Python的threading模块、掌握并发编程基础
    数据结构与算法Python版 熟悉哈希表,了解Python字典底层实现
    博客导读
    分享canvas的一个小案例
    Php中的魔术方法
    进制简介
    Gojs学习史(一):基本定义
    Vue读书笔记:关于$ref、props和$emit
    Leaflet学习笔记(一)
  • 原文地址:https://www.cnblogs.com/shiningrise/p/8848129.html
Copyright © 2011-2022 走看看