您的位置:首页 > Web前端 > Node.js

博客搭建详解(三)-Node.js+自动化部署+邮件提醒

2020-07-14 05:51 239 查看

我的个人网站 www.ryzeyang.top

内容概览
在阿里云服务器上使用node.js搭建webhook服务,实现自动部署和邮件提醒。

目录

  • 自动化部署的实现
  • Node.js

    简介

    Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine.
    Node.js
    Node.js中文网

    特点

    1. 事件驱动
        这个是Node.js设计的核心思想
      • 事件驱动就是 当某个事件发生时,才去执行这个回调函数,而注册的回调函数都是异步执行的,这样充分利用了计算机的资源。
    2. 异步,非阻塞IO
    3. 单线程
        我们写的代码都在一个主线程里面,其他的都在线程池里,这样保证了线程的安全。
    4. 实时性

    使用

    1. 安装
      下载地址 https://nodejs.org/zh-cn/download/
      博主的版本是node-v12.14.0-linux-x64,执行下面的代码解压文件,

      xz -d node-v12.14.0-linux-x64.tar.xz
      tar -xf node-v12.14.0-linux-x64.tar

      接着执行以下代码 创建软连接(根据自己Node.js文档的路径)

      ln -s ~/node-v12.14.0-linux-x64/bin/node /usr/bin/node
      ln -s ~/node-v12.14.0-linux-x64/bin/npm /usr/bin/npm
      ln -s ~/node-v12.14.0-linux-x64/bin/npm /usr/bin/npx

      在其他目录下输入

      node -v
      可以看到版本信息即安装成功。

    2. npm
      npm是Node.js的包管理工具,随着node.js一起安装的。
      使用淘宝镜像安装模块会更快(同步频率目前为10分钟一次以保证尽量与官方服务同步。)

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

    Node.js有很多框架可以使用,如Express,Koa,Socket Stream等等。

    自动化部署的实现

    资料准备

    可以看看上篇博文中关于gitee webhook这一块,还有下面两个文档
    WebHook 推送数据格式说明
    WebHook 密钥验证和验证算法

    加密算法
    不可逆 : MD5、SHA1、SHA256、SHA512
    可逆 :对称加密和非对称加密

    git 更新脚本

    在阿里云服务器上建个脚本 pull.sh
    内容如下

    # cd到博客目录
    #git fetch 指令是下载远程仓库最新内容,不做合并
    #git reset 指令把HEAD指向master最新版本
    cd ~/hexo_blog
    git fetch --all
    git reset --hard origin/master

    格式化时间脚本

    dateFormat.js

    function dateFormat(fmt, date) {
    let ret;
    const opt = {
    "Y+": date.getFullYear().toString(),        // 年
    "m+": (date.getMonth() + 1).toString(),     // 月
    "d+": date.getDate().toString(),            // 日
    "H+": date.getHours().toString(),           // 时
    "M+": date.getMinutes().toString(),         // 分
    "S+": date.getSeconds().toString()          // 秒
    // 有其他格式化字符需求可以继续添加,必须转化成字符串
    };
    for (let k in opt) {
    ret = new RegExp("(" + k + ")").exec(fmt);
    if (ret) {
    fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
    };
    };
    return fmt;
    }
    module.exports=dateFormat;

    自动化部署脚本

    webhook.js

    /**
    author: Ryzeyang
    description:  node.js实现自动化部署,同时使用qq邮箱通知博客更新情况
    */
    var http=require("http");
    var dateFormat=require("./dateFormat");
    var execSync = require('child_process').execSync; //同步
    var nodemailer = require('nodemailer');
    
    // npm install nodemailer --save
    
    var transporter = nodemailer.createTransport({
    //https://github.com/andris9/nodemailer-wellknown#supported-services 支持列表
    service: 'qq',
    port: 465, // SMTP 端口
    secureConnection: true, // 使用 SSL
    auth: {
    user: 'qq@qq.com',
    pass: 'smtp密码'  //不是qq密码,是你设置的smtp密码
    }
    });
    
    var status='failed';
    var message='';
    
    http.createServer(function(req,resp){
    var headers=req.headers; //获取请求头中的信息
    var agent=headers['user-agent'];  //拿到UA
    if(agent=='git-oschina-hook'){ //判断是不是来自gitee
    
    var timestamp=headers['x-gitee-timestamp'];
    var token=headers['x-gitee-token'];
    
    /**
    *  加密算法的实现  HmacSHA256算法(不可逆的)
    */
    const crypto = require('crypto');
    const secret="webhook上的秘钥";
    var hmac=crypto.createHmac("sha256",secret);
    var content=hmac.update(timestamp+"\n"+secret);
    var cryptoContent=content.digest("base64");
    
    //console.log("sha256(Hmac方式)加密后结果:%s",cryptoContent);
    var s ='';
    if(token==cryptoContent){
    
    s=execSync('./pull.sh').toString(); //执行更新仓库的脚本
    console.log(s.toString());
    status='successfully';
    }
    
    message="call webhook  at "+dateFormat("YYYY-mm-dd HH:MM", new Date()) ;
    console.log(message);
    
    var mailOptions = {
    from: '@qq.com', // 发件地址
    to: '@qq.com', // 收件列表
    subject: 'Update blog '+status, // 标题
    //text和html两者只支持一种
    //  text: 'Hello world ?', // 标题
    html: '<b>'+message+'</b> <br> <b>'+s+'</b>' // html 内容
    };
    
    transporter.sendMail(mailOptions, function(error, info){
    if(error){
    return console.log(error);
    }
    console.log('Message sent: ' + info.response);
    });
    }
    resp.writeHead(200,{"Content-Type":"text/plain"});
    resp.end("ok\n");
    }).listen(8080);
    console.log("Server run at 8080 at %s",dateFormat("YYYY-mm-dd HH:MM", new Date()) );

    启动命令

    将三个脚本放在同个文件夹下,执行以下命令即可。

    nohup node webhook.js & //后台运行 log会记录在当前文件夹中的nohup.out

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: