Travis CI/CD自动化部署Hexo

Travis CI/CD自动化部署Hexo

由于博客的源码和生成站点位于不同的代码仓库中(源码位于 lingme.github.io.repository,生成的静态站点位于 lingme.github.io,即个人 GitHub Pages 的仓库),文章的发布过程需要提交两次。作为懒人之道,自然会开始折腾只需要提交一次、博客就自动部署到 GitHub Pages 上的方法——这里就轮到 Travis 登场了。

原理

Travis 为 GitHub 上的开源项目提供免费的持续集成(CI)服务,只要你向指定仓库提交了代码,Travis 就会根据配置自动运行 CI 任务。利用这个特性,我们可以做到在一次提交过程中触发如下流程:

内容编辑完成,向博客的源码仓库 push 代码
GitHub 通过 hook 告诉 Travis 有新的提交,Travis 启动新的 CI 任务
在 CI 任务中,代码被 clone 到 Travis 的构建服务器上
构建服务器准备好 Node.js 的运行环境,运行 Hexo 的生成命令,并将生成的静态站点 push 到 GitHub Pages 的仓库中,博客部署完成
这个过程中的难点在于如何给予 Travis push 你的 GitHub Pages 仓库的权限。有两种方法可以获得 push 权限:

SSH 私钥:只要在 GitHub 上配了相应公钥,就可以通过 SSH 进行 push
Personal access token:只要在 GitHub 上生成了 personal access token,就可以通过 HTTPS 进行 push
但是,无论是使用上述的哪种方法,SSH 私钥 / personal access token 都不能出现在 Travis 的配置文件里,因为 Travis 的配置文件(即 .travis.yml)会出现在博客的源码仓库里,这意味着任何能访问你提交历史的路人(对于 GitHub 的公开项目来说,意味着任何人)都能获取到它们并用来向你的仓库进行任意提交——这是灾难性的(顺带一提,GitHub 如果发现你的代码仓库中含有 personal access token,会自动删除相应 token,因此向仓库提交 personal access token 的行为并不会带来风险,只是没有意义而已,因为 token 会直接失效)。因此,我们需要使用 Travis 客户端对 SSH 私钥 / personal access token 进行加密,然后在 CI 任务中解密并使用它们。

部署密钥生成

hexo 编译后需要 push 到 lingme.github.io 上,需要用 ssh-keygen 命令生成一组私钥(没有后缀名)和公钥(.pub 结尾)

  1. 我们打开终端,输入 ssh 命令生成一组密钥

ssh-keygen -f github-deploy-key

  1. 打开 lingme.github.io 仓库,点击 setting / deploy key ,然后点击 add new key,使用

pbcopy < github-deploy-key.pub

命令将 key value 拷贝到剪切板,然后复制到 add new key 的输入框中,名称可以填写 HEXO_DEPLOY_PUB ,记住一定要勾选 allow write

  1. 打开 lingme.github.io.repository 仓库,点击 setting / secrets / add new key,使用

pbcopy < github-deploy-key

命令将 key value 拷贝到剪切板,然后复制到输入框中,名称可以取名为 HEXO_DEPLOY_PRI

准备工作

注册 Travis 并将 Github Pages 的源码项目加入 Travis

准备一个 Github 的 personal access token

安装 Travis 客户端(考虑到很多小伙伴的 VPN 比较慢,所以替换成国内缘):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# install rvm
gpg --keyserver hkp://keys.gnupg.net:80 --recv-keys D39DC0E3
\curl -sSL https://get.rvm.io | bash -s stable
source /home/uchuhimo/.rvm/scripts/rvm
echo "ruby_url=https://cache.ruby-china.org/pub/ruby" > ~/.rvm/user/db

# install ruby
rvm install 2.4.0
rvm use 2.4.0 --default

# configure gem
gem sources --add https://gems.ruby-china.org/ --remove http://rubygems.org/

# install travis
gem install travis

配置 Travis

在博客的源码项目下新建 .travis.yml:touch .travis.yml

加密上文生成的 personal access token:travis encrypt GITHUB_TOKEN=”“ –add

在 .travis.yml 中添加如下内容(记得替换变量):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
language: node_js
node_js:
- "7"

before_deploy:
- hexo generate
deploy:
provider: pages
skip_cleanup: true
github_token: $GITHUB_TOKEN
on:
branch: master
repo: <username>/<github-pages-repo-name>
local_dir: public
target_branch: master
fqdn: <custom-domain-url>
project_name: <project-name>
email: <committer-email>
name: <committer-name>

参考文献

评论