基于Gitlab-ci实现Hexo持续部署

一、初衷

首先对于自建博客这种事情,相比CSDN和博客园这类现成的博客来说,都是非常繁琐的,从建站到运维,一堆坑需要填,所以想省事还是建议找现成的博客网站申请。

此前我使用的是Wordpress作为自建博客的首选,我一直认为Hexo,写一篇文章都要这么麻烦,所以非常不爽,但到后来越来越喜欢Hexo这种简约的风格,所以就尝试寻找一种简单、自动化的方式部署Hexo,最终选定使用Gitlab-ci。

二、先期准备

既然是要最大程度的自动化所以

首先,在本地初始化Hexo工程,在安装Hexo之前首先需要安装

  • Node.js
  • Git

安装完成后只需要执行一条命令就可以安装Hexo

1
$ npm install -g hexo-cli

注意:Mac系统可能会出现文件权限问题,命令前加上sudo即可解决。

安装 Hexo 完成后,执行init命令,Hexo将会在指定文件夹中新建所需要的文件。

1
2
3
$ hexo init folder
$ cd folder
$ npm install

至此,获取Hexo博客系统的代码的工作结束。

三、Hexo和GitLab-ci配置

先设置Gitlab-ci,Gitlab-ci主要是用来对Hexo进行持续集成的,主要配置文件是.gitlab-ci.yml文件,放在Hexo工程的根目录下,整个工程目录如下:

WX20180127-204702@2x

因为将构建好的Hexo工程远程部署到VPS或者ECS服务器中,需要用到rsync命令,通过SSH传输数据,所以需要配置使用私钥访问远程服务器,私钥可以通过Gitlab-ci中的Secret variables中配置,具体位置在Settings -> CI/CD,SSH_PRIVATE_KEY就是远程服务器的访问私钥,SSH_KNOWN_HOSTS配置是远程服务器的IP或者域名。

.gitlab-ci.yml的具体配置如下:

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
image: node:9.4.0 

before_script:
- apt-get update -y
- apt-get install openssh-client -y
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client git -y )'
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- apt-get install rsync -y #安装rsync
- /etc/init.d/rsync start #启动rsync

Hexo:
cache:
paths:
- node_modules/

script:
- npm install
- npm install rsync -g
- npm install hexo-cli -g
- npm install hexo-server --save
- npm install hexo-generator-sitemap --save
- npm install hexo-generator-baidu-sitemap --save
- npm install hexo-generator-feed --save
- npm install hexo-deployer-git --save
- npm install hexo-deployer-rsync --save
- npm install hexo-generator-index --save
- npm install hexo-generator-archive --save
- npm install hexo-generator-tag --save
- npm install hexo-generator-category --save
- npm install hexo-admin --save
- hexo deploy
artifacts:
paths:
- public
only:
- master

Hexo的配置文件为_config.yml,具体的配置可以在Hexo官网了解到各项配置的含义。

在配置持续集成中,Hexo只需要配置deploy模块,远程服务器必须安装rsync,具体配置如下:

1
2
3
4
5
6
7
8
9
10
11
# Deployment
## Docs: https://hexo.io/docs/deployment.html
deploy:
type: rsync
host: 127.0.0.1 #远程服务器地址
user: user001 #远程服务器用户名,必须可以远程访问
root: /home #构建好的hexo,远程发布的根目录,上一条user配置的用户user001,必须拥有这个目录
port: 22
delete: true
verbose: true
args: -e 'ssh -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no' #额外的参数,用来消除第一次SSH时,出现的yse/no,具体不知道有没有作用

接下来就是上传Hexo工程代码,就是用git将代码推送到gitlab,这里首先要有一个gitlab代码库,可以去gitlab.com上面注册,然后新建一个仓库,仓库名称无所谓,操作类似Github。仓库建完后将本地的Hexo工程代码,推送到Gitlab的代码库。

推送完成后,Gitlab-ci会自动执行.gitlab-ci.yml中配置的命令,构建完成后Hexo中配置的deploy命令,通过rsync命令传输到远程服务器,对于远程服务器的部署,我自己的服务器部署是使用Docker中启动一个Nginx容器,将Hexo的博客目录通过-v命令挂载到Docker容器中,然后由Nginx中配置root到Docker容器中的博客根目录。

四、Https

对于这种部署方式来说,做Https,只需要在nginx中配置Https即可,不需要其他配置。

五、结语

Hexo和Gitlab-ci集成后,平时写博客只需要在本地的Hexo目录将md文件编辑好,将文件推送到远程Gitlab仓库,Gitlab-ci自动执行job构建Hexo,并部署到远程服务器,博客就可以自动更新。

坚持原创技术分享,您的支持将鼓励我继续创作!