通过配置 Git Hooks 实现自动部署 Hexo

Hexo 是一款快速、简洁且高效的博客框架[1],搭配 Github Pages 可以非常容易的构建出一套博客系统。

搭建服务

一定有很多人像我这样打算部署在自己的服务器上而非 Github Pages,按照一般做法如下:

1
2
3
4
5
# npm install -g hexo-cli
# hexo init blog
# cd blog
# npm install
# hexo g

之后在 nginx 中新建一个 server, location 指向 blog/public,可以说非常简单了。

多终端同步文章

但是问题来了,如此一来要在服务器上发布文章,或者本地写好文章后上传到服务器中,再登录服务器执行 hexo g 生成页面,从各种意义上来说都不够方便。

能不能在本地写好文章后上传到服务器,之后让服务器自动生成页面呢?答案肯定是可以的,这里使用 Git Hooks 来实现这样的效果。

在服务器上创建 Git 仓库

  • 安装 Git

    1
    # apt install git
  • 创建 git 用户,隔离权限

    1
    2
    # groupadd git
    # useradd git -g git -m
  • 创建用于 git 用户登录的证书

    1
    2
    3
    4
    5
    6
    # su git
    $ ssh-keygen -t rsa
    $ mkdir ~/.ssh
    $ mv id_rsa ~/.ssh/
    $ cat id_rsa.pub >> ~/.ssh/authorized_keys
    $ chmod 600 ~/.ssh/*
  • 创建一个用于存放 hexo 系统的裸仓库

    1
    2
    $ git init --bare hexo.git
    $ git clone git@127.0.0.1:/home/git/hexo.git

安装 hexo 环境

  • 安装 hexo-cli

    1
    2
    3
    4
    $ cd ~/hexo
    $ sudo npm install -g hexo-cli
    $ hexo init
    $ npm install
  • 初始化 git 仓库

    1
    2
    3
    $ git add .
    $ git commit -m "initial blog"
    $ git push

添加 Git Hooks

Git Hooks 存放在 <repo>/hooks 目录下

1
2
3
$ cd ~/hexo.git/hooks
$ mv post-update.sample post-update
$ vim post-update

post-update 文件中加入以下内容[2]

1
2
3
4
5
unset $(git rev-parse --local-env-vars)
export LOG_FILE="/home/git/hexo.log"

cd /home/git/hexo
( git pull origin master && hexo g ) >$LOG_FILE 2>&1

这样在我们每次提交到这个 repo 的时候,服务器会自动执行 post-update 定义的脚本,在这里就是 git pullhexo g 生成页面。

修改 git 用户的 shell

上述环境下创建的 git 用户默认可以通过 ssh 登录 bash,这不是我们希望看到的,打开 /etc/passwd 文件,把 git 用户的 /bin/bash 修改为 /usr/bin/git-shell 即可。[3]

本地环境

服务器上的设置已经全部完成了,接下来是本地的一些配置