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

我的个人网站 RyzeYang

内容概览
在阿里云服务器上使用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: '[email protected]',
        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

猜你喜欢

转载自blog.csdn.net/weixin_40251892/article/details/106985608