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
2
3
4
5
6
# 服务器创建一个任何:crontab -e

*/30 * * * * /bin/sh -c 'cd /你的项目路径 && /usr/bin/git pull'
#每隔30分钟git pull一次
#不生效的话这样刷新一下:
#/etc/init.d/cron restart
3.3 方案三

设置定时任务,需要久不久主动从GitHub拉取一次内容,这并不够完美。最好的方案还是GitHub Webhook实现,每次往项目push内容,GitHub会自动通知服务器更新内容。这个方案我是通过自己写的Node服务实现的。

  1. 在服务器用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
    52
    const 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)
    })
  2. 安装相关依赖包

    1
    npm install express express-github-webhook body-parser
  3. 用pm2启动

    pm2 start webhook.js --name webhook
    
  4. 在GitHub项目的Settings—Webhooks—Add webhook那里添加一个webhook配置,URL填写http://ip:8000/webhook,Content type选择application/json,secret填写第1步代码里设置的secret。填完保存。

新增 webhook

配置好,每次更新文章push到GitHub,服务器上的静态文件就会自动更新,不再需要每次都上服务器git pull了。3种方法中,第1种无效,第2种设置定时任务最简单。第3种使用我个人的那个github webhook方案需要有Node的知识。如果是自己部署Hexo在VPS,应该都可以折腾,没啥难度。