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

博主的公众号:Java4y
《《《《《《《《《
一个努力提高工作效率(增加摸鱼时间)的小白博主
》》》》》》》》》》
关注有惊喜哦
《《《《《《《《《
2021一起好好加油! (ง •_•)ง

wechat

内容概览
在阿里云服务器上使用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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答这个问题。 首先,我需要解释一下什么是 Grunt。Grunt 是一个 JavaScript 任务运行器,用于自动化前端开发工作流程。它可以帮助我们完成许多重复且繁琐的任务,例如压缩 JavaScript 和 CSS、编译 LESS、Sass 等,以及自动化测试等。 接下来,我将为您提供一个 Grunt 搭建项目实例和 grunt.initConfig 配置详解: 1. 安装 Grunt 在开始之前,您需要安装 Grunt。您可以通过 npm 安装它,命令如下: ``` npm install -g grunt-cli ``` 2. 创建项目文件夹 ``` mkdir myproject cd myproject ``` 3. 初始化项目 ``` npm init ``` 4. 安装 Grunt 和 Grunt 插件 在项目文件夹中运行以下命令: ``` npm install grunt --save-dev npm install grunt-contrib-jshint --save-dev npm install grunt-contrib-uglify --save-dev ``` 以上命令会安装 Grunt 和两个 Grunt 插件:jshint 和 uglify。 5. 创建 Gruntfile.js 文件 在项目文件夹中创建一个名为 Gruntfile.js 的文件,并添加以下内容: ``` module.exports = function(grunt) { // 项目配置 grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), jshint: { files: ['Gruntfile.js', 'src/**/*.js', 'test/**/*.js'], options: { globals: { jQuery: true } } }, uglify: { options: { banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n' }, build: { src: 'src/<%= pkg.name %>.js', dest: 'build/<%= pkg.name %>.min.js' } } }); // 加载插件 grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-uglify'); // 默认任务 grunt.registerTask('default', ['jshint', 'uglify']); }; ``` 上述代码中,我们首先定义了一个 initConfig 对象,它包含了两个任务:jshint 和 uglify。其中,jshint 任务用于检查 JavaScript 代码的语法错误,uglify 任务用于压缩 JavaScript 代码。 接下来,我们通过 grunt.loadNpmTasks() 方法加载了两个 Grunt 插件。最后,我们通过 grunt.registerTask() 方法注册了一个默认任务,它会依次执行 jshint 和 uglify 任务。 6. 运行 Grunt 在项目文件夹中运行以下命令: ``` grunt ``` 以上命令会自动执行 Gruntfile.js 中定义的默认任务。 这就是使用 Grunt 搭建项目实例和 grunt.initConfig 配置详解的全部内容。如果您有任何疑问,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值