博客搭建详解(三)-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中文网
特点
- 事件驱动:
-
这个是Node.js设计的核心思想
- 事件驱动就是 当某个事件发生时,才去执行这个回调函数,而注册的回调函数都是异步执行的,这样充分利用了计算机的资源。
- 异步,非阻塞IO
- 单线程
-
我们写的代码都在一个主线程里面,其他的都在线程池里,这样保证了线程的安全。
- 实时性
使用
-
安装
下载地址 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
可以看到版本信息即安装成功。 -
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
相关文章推荐
- Linux系统下为Gitlab配置邮件提醒的方法详解
- PHP实现好友生日邮件提醒
- AD 邮件账号到期提醒
- JavaMail(JAVA邮件服务) API详解
- python-邮件提醒功能
- c#socket发送邮件详解
- 第三章:nagios邮件提醒
- 怎么用java发送带附件的邮件代码详解
- 监控硬盘并发送提醒邮件的shell
- .net 邮件发送原理及实例以及smtp详解
- magento修改发送邮件内容和订单邮件提醒设置
- 详解java mail 发送邮件
- spark streaming 应用程序 监控 邮件提醒
- Gitlabr如何设置邮件提醒?
- TurboMail邮件系统工程师重要提醒:谨防邮件钓鲸诈骗
- ZenCart recover_cart_sales未付款客户邮件提醒插件
- 一步一步从原理跟我学邮件收取及发送 8.EHLO 命令详解
- PHP邮件发送类PHPMailer用法实例详解
- JavaMail(JAVA邮件服务) API详解 (4)