这两天重新捣鼓了一下 Hexo 博客, 用 Travis CI 做了自动部署。

做的过程中查看了很多资料,基本上都是用在 CI 中用 Git、Hexo deploy 做的部署,还要加密 ssh-key 什么的。我基于这做了一遍,对于 Travis CI 的文件加密等等,有了更深的理解。这中间的配置,我觉得相当的麻烦。但是当我重新翻阅 Travis CI 的文档的时候,我发现其实 Travis CI 可以自动静态文件部署到 GitHub Pages。只需要非常简单的配置,就可以了。

1
2
3
4
5
6
deploy:
provider: pages
skip_cleanup: true
github_token: $GITHUB_TOKEN # travis-ci.org 控制面板上设置
on:
branch: master

这是最基本的配置。

skip_cleanup 的值必须为 true 不然会把你在构建时生成的文件给删除掉。

on: branch: master的意思是当 master 分支有变化时,才执行这个部署。更多条件设置请参考 Deployment

GITHUB_TOKEN 的生成请参考 Creating a personal access token for the command line。 如果你的仓库是公开的,那么在给权限的时候只需要给 public_repo, 如果你的仓库是私有的那就要给 repo 权限,尽量给更少的权限。然后在控制台设置环境变量 GITHUB_TOKEN 值为刚才生成的 token。在添加环境变量的时候有个开关 Display value in build log 千万不要打开,不然别人就可以在 CI 的 log 里面看到你的 token 了,就可以对你的公开仓库进行任意修改。

接下来我们就要对这个基本配置做个修改,添加更多的设置来符合我们的需求。

local_dir 指的是是将要推送到 GitHub Pages 的目录,默认的值为当前目录。我们都知道 hexo generate 生成的目录是 public ,所以我们要将 local_dir 的值设置为 public

repo 指的是 GitHub Pages 所在的代码仓库,默认值为当前仓库。

target_branch 指的是 GitHub Pages 所使用的分支,默认为 gh-pages

这里有个问题,就是 Travis CI 使用 git push --force 来进行推送的,所以会清空历史,所以一定要保证你的 repotarget_branch 设置的正确。原本我是做了保留历史的配置的,改成这样用 Travis CI deploy 来做的话,就没有办法保留历史了。但是转念一想,我只要保留 blog 仓库的历史就好啦,这些只是生成的代码,所以我认为使用 Travis CI 这样的设置是合理的。

一般来说添加这三个配置就可以了。更多配置请参考 GitHub Pages Deployment

下面是我的配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
language: node_js #指定环境为 Node.js
node_js:
- '7' #指定 Node.js 的版本为 7
before_install:
- export TZ='Asia/Shanghai' #设置时区 非必须
script:
- hexo generate #生成博客
deploy:
provider: pages
skip_cleanup: true
github_token: $GITHUB_TOKEN
local_dir: public
repo: zhangweijie-cn/zhangweijie-cn.github.io
target_branch: master
on:
branch: master

Travis CI 会自动帮我们安装依赖,所以这些我们都不需要考虑。

当我们给 blog 所在仓库 master 分支推送文章以后,GitHub Pages 就会自动构建和部署了。