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 结尾)
- 我们打开终端,输入 ssh 命令生成一组密钥
ssh-keygen -f github-deploy-key
- 打开 lingme.github.io 仓库,点击 setting / deploy key ,然后点击 add new key,使用
pbcopy < github-deploy-key.pub
命令将 key value 拷贝到剪切板,然后复制到 add new key 的输入框中,名称可以填写 HEXO_DEPLOY_PUB ,记住一定要勾选 allow write
- 打开 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 | install rvm |
配置 Travis
在博客的源码项目下新建 .travis.yml:touch .travis.yml
加密上文生成的 personal access token:travis encrypt GITHUB_TOKEN=”
在 .travis.yml 中添加如下内容(记得替换变量):
1 | language: node_js |