使用git hook 部署 hexo 静态博客

虽然hexo生成的静态博客很安全,也不需要像Wordpress 那样运维服务器,但是基于本地的静态文件生成和发布还是比较麻烦的,尤其是多个电脑的切换,你每台电脑都需要安装一整套的nodejs 环境和hexo执行环境,通过git服务的hook进行hexo博客生成与部署,就是为了解决这个问题。

创建git服务

安装git

我使用的 CentOS 执行 yum install git 即可安装git

为git创建用户和群组

添加组 groupadd git

添加用户并将用户加入组 useradd git -g git

创建证书登录

cd /home/git

mkdir .ssh

chmod 700 .ssh

touch .ssh/authorized_keys

chmod 600 .ssh/authorized_keys

收集所有需要登录的用户的公钥,公钥位于id_rsa.pub文件中,把我们的公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。

这里有一个坑就是在CentOS里ssh生效必须满足两个条件

  1. .ssh目录的权限必须是700
  2. .ssh/authorized_keys文件权限必须是600

创建git用户的密钥 ssh-keygen -t rsa -C "willard_liu@XXXX.com",同样的把刚创建的公钥id_rsa.pub加入到 authorized_keys 中

配置一下 git 用户下的git 信息

$ git config --global user.name author #将用户名设为author
$ git config --global user.email author@corpmail.com #将用户邮箱设为author@corpmail.com

初始化Git仓库

首先我们选定一个目录作为Git仓库,假定是/data/gitrepo/test.git,在/data/gitrepo目录下输入命令:

cd /data

mkdir gitrepo

chown git:git gitrepo/

cd gitrepo

git init --bare test.git

以上命令Git创建一个空仓库,服务器上的Git仓库通常都以.git结尾。然后,把仓库所属用户改为git:

chown -R git:git test.git

测试一下仓库是否有问题

$ git clone git@xxx.xxx.xxx.xxx:/data/gitrepo/test.git
Cloning into 'test'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.

到这我们的git仓库就搭建完成了

然后我们把 hexo 项目下的source 里面的内容全丢到这个git项目下就行了

hexo 项目部署

  1. 安装 nodejs这个不再这里展开

  2. 安装 hexo 执行npm install hexo-cli -g

  3. 软链 hexo 到 /usr/bin 下方便等下在 git 用户下使用

    sudo ln -s /usr/local/lib/nodejs/node-v**.**.**-linux-x64/bin/hexo /usr/bin/hexo

  4. 我们在 data 下再创建一个 hexo 项目目录 mkdir blog

  5. 然后我们把本地完整的hexo项目除了node_modules 和 source 目录外的所有文件和文件夹都上传到 /data/blog

  6. 切换用户到git su git,然后克隆刚才我们的仓库 到 source 目录

    git clone git@xxx.xxx.xxx.xxx:/data/gitrepo/test.git /data/blog/source

  7. 进入/data/blog安装项目组件npm install

  8. 执行hexo ghexo d,看与本地执行的是否一致

  9. 如果上述步骤都没问题我们就需要把上面的步骤配置到仓库的hook上了

    进入 cd /data/gitrepo/test.git/hooks/,如果没有post-receive这个文件,就创建一个 touch post-receive,再 配置一下权限 chmod 755 post-receive,具体各个hook的含义参考git的文档

  10. 配置 post-receive

# 进入source 目录
cd /data/blog/source
pwd
echo "==========拉取最新的文章=========="
unset GIT_DIR
# 强制拉取覆盖本地内容
git fetch --all
git reset --hard origin/master
git pull
echo "==========拉取结束=========="
# 进入blog 目录
cd /data/blog
pwd
echo "==========清除html=========="
hexo clean
echo "==========开始生成html=========="
hexo g
echo "==========生成html完成=========="
echo "==========开始部署=========="
hexo d
echo "==========部署完毕=========="
  1. 在本地 push 看一下是否有以上远程执行的操作输出

  2. 如果上述步骤都ok了,那么我们出于安全考虑需要禁用git的远程登录

    通过编辑/etc/passwd文件完成。找到类似下面的一行:

    git❌1001:1001:,,,:/home/git:/bin/bash
    

    改为:

    git❌1001:1001:,,,:/home/git:/usr/bin/git-shell
    

    这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

至此我们就完成了所有步骤,以后我们需要写博客只需要在本地安装git,如果是首次还需将公钥 id_rsa.pub的内容配置到服务器git用户下的 .ssh/authorized_keys文件中,然后拉取发布 source 也就是我们的markdown的git仓库地址就可以完成整个博客发布流程了。