使用GitHub Webhook实现Hexo博客自动化更新
1. 前言
最近又把博客从Wordpress迁移到了Hexo,博客倒是不怎么想写,就是想久不久折腾一下,感觉是作为程序员的一种不良心理。去年我打算自己做一个Wordpress主题,要有说说功能,但是只做了开头,就拖了一年,一直没继续做完,就放弃了,干脆换回Hexo。Hexo和Wordpress相比的弱点就是,博客放自己VPS上,每次要到服务器git pull新文章,这太麻烦了,就找了一些方案,实现每次push本地文章到GitHub时,服务器上的内容会自动执行git pull,更新网站内容。
2. 前提
我的Hexo博客是部署在自己VPS上,Web服务器用的是Caddy 2.0。Caddy 2.0比Nginx更简洁,自动申请SSL证书,个人网站用起来挺爽的,省了很多事。
3. 可选方案
网上搜Caddy 2.0实现自动从GitHub更新Hexo博客的内容,能找到的资料并不多。
3.1 方案一
有个很简单的解决方案,通过Caddy的git.http插件实现,但是插件只支持Caddy 1.0,不支持Caddy 2.0,只能放弃。
3.2 方案二
另一个方案是通过设置定时任何,每隔一段时间定期自动执行git pull,拉取最新的文章。
1 | # 服务器创建一个任何:crontab -e |
3.3 方案三
设置定时任务,需要久不久主动从GitHub拉取一次内容,这并不够完美。最好的方案还是GitHub Webhook实现,每次往项目push内容,GitHub会自动通知服务器更新内容。这个方案我是通过自己写的Node服务实现的。
在服务器用Express写一个服务,直接在博客的项目文件里加个webhook.js文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52const express = require('express')
const GithubWebHook = require('express-github-webhook')
const webhookHandler = GithubWebHook({ path: '/webhook', secret: '自己设置个密钥' })
let child_process = require('child_process')
const app = express()
const bodyParser = require('body-parser')
app.use(bodyParser.json())
app.use(webhookHandler)
webhookHandler.on('push', function (repo, data) {
if (repo === '你博客的Repo名称') {
child_process.exec('git pull', {}, function (error, stdout, stderr) {
if (error !== null) {
console.log('exec error: ' + error)
} else {
console.log(stdout)
}
})
}
})
app.all('*',function (req, res, next) {
res.header('Access-Control-Allow-Origin', '*')
res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild')
res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS')
if (req.method == 'OPTIONS') {
res.sendStatus(200); /*让options请求快速返回*/
}
else {
next()
}
})
app.get('*', (req, res) => {
res.send('hello')
})
let port = 8000
app.listen(port, (err) => {
if (err) {
console.log(err)
}
console.log('app had listening on port:' + port)
})安装相关依赖包
1
npm install express express-github-webhook body-parser
用pm2启动
pm2 start webhook.js --name webhook
在GitHub项目的Settings—Webhooks—Add webhook那里添加一个webhook配置,URL填写http://ip:8000/webhook,Content type选择application/json,secret填写第1步代码里设置的secret。填完保存。
配置好,每次更新文章push到GitHub,服务器上的静态文件就会自动更新,不再需要每次都上服务器git pull了。3种方法中,第1种无效,第2种设置定时任务最简单。第3种使用我个人的那个github webhook方案需要有Node的知识。如果是自己部署Hexo在VPS,应该都可以折腾,没啥难度。