我的个人网站 www.ryzeyang.top
内容概览
在阿里云服务器上使用node.js搭建webhook服务,实现自动部署和邮件提醒。
Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine.
Node.js
Node.js中文网
安装
下载地址 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
可逆 :对称加密和非对称加密
在阿里云服务器上建个脚本 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: ''+message+'
'+s+'' // 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