摘要:好不容易搭建了hexo,还不满足。想要实现在小程序上也能访问博客,又不想再写一个后台。每次更新文章到服务器之后,希望能自动同步到网站上面。如果你有这样的需求,那么希望这篇文章能帮助到你。

我的配置:
1.阿里云服务器 centos7.2
2.gitee || github仓库
3.hexo
4.nginx

backlog:
1.部署hexo && 能够完美运行
2.配置webhook && 能正常连接
3.编写.sh文件,实现push之后自动pull
4.利用hexo服务提供接口
5.完成部署

第一步部署hexo很简单,按照hexo官网一步一步走就行,所以直接跳过到配置webhook。

搭建本地webhook服务

我是用的gitee,所以用gitee作为例子,github原理其实也差不多。

  1. 首先在本地搭建一个webhook本地的服务,主要用到的模块gitee-webhook-handler(如果是github使用github-webhook-handler),和child_process模块(nodejs调用系统命令)代码如下:
// webhook.js

var http = require('http')
var createHandler = require('gitee-webhook-handler')
var handler = createHandler({ path: '/webhook', secret: '123456' }) // 配置webhook的时候需要用到

http.createServer(function (req, res) {
  handler(req, res, function (err) {
    res.statusCode = 404
    res.end('no such location')
  })
}).listen(7777)

handler.on('error', function (err) {
  console.error('Error:', err.message)
})

// 监听push
handler.on('Push Hook', function (event) {
  console.log('Received a push event for %s to %s',
    event.payload.repository.name,
    event.payload.ref)

  run_cmd('sh', ['./deploy.sh',event.payload.repository.name], function(text){ console.log(text) });
})

// 监听issue
handler.on('Issue Hook', function (event) {
  console.log('Received an issue event for %s action=%s: #%d %s',
    event.payload.repository.name,
    event.payload.action,
    event.payload.issue.number,
    event.payload.issue.title)
})

function run_cmd(cmd, args, callback) {
  var spawn = require('child_process').spawn;
  var child = spawn(cmd, args);
  var resp = "";
  child.stdout.on('data', function(buffer) { resp += buffer.toString(); });
  child.stdout.on('end', function() { callback (resp) });
}
  1. 创建.sh文件,作用:当webhook服务监听到有push操作的时候,就执行.sh文件里面的命令
# deploy.sh
# 网站的根目录,hexo博客的根目录
WEB_PATH='~/web/'
echo "start deployment"
cd $WEB_PATH
echo "fetching from remote..."
git pull
echo "done"

启动服务: node webhook.js

配置webhook

打开gitee的项目目录找到webhook配置,如下图:
hexo博客实现多终端共享&webhook自动化部署-LMLPHP

测试配置是否成功
hexo博客实现多终端共享&webhook自动化部署-LMLPHP

最后新增一篇文章,push之后就能刷新网站就能看见更新咯,大功告成!!!

为其他终端提供api接口

使用到的hexo插件hexo-generator-restful
安装之后重启hexo服务,请求一下 /api/site.json 接口。就能看见博客相关的信息了。

源代码:gitee
网站地址:yishiyici
小程序二维码:hexo博客实现多终端共享&webhook自动化部署-LMLPHP

05-24 19:13