原文
http://bit.ly/1PqYEJT
JS 很有吸引力、Hexo 是台湾人写的、速度比 Octopress 快、default 支援 GitHub Flavored Markdown,所以选 Hexo。
Hexo 是一个 static site generator,static site 是指 website 由 static web page 所组成。获取 static web page 的 client 端得到的 web page,和储存于 server 端的 web page 一模一样。与 dynamic website 的 server 端即时产生 web page 传送给 client 端不同,static site 的 server 端不需要具备即时生成不同 web page 的能力。
Travis-CI 提供了 hook GitHub repository event 的功能。开启 hook 后,便会依照 repository 里 .travis.yml 内的设定来执行。
GitHub repository 特定的 branch 会被 GitHub 当作 static web site 的内容来 render,render 的引擎是 Jekyll,因此可以放纯 HTML 档案也可以放 Jekyll 会 parse 的档案。
本来 Hexo 的运作流程是,在 local 用 markup 撰写文章,完成后执行 Hexo 的命令来 parse 并 render 原始档案,生成由 HTML 构成的 static web site,再将生成出来的内容 push 到 GitHub repository 的特定 branch。
但是依赖 local Hexo 指令有个缺点:在没有装 Hexo 环境的装置就没办法更新 web site 了。Hexo 环境虽然也不是很难安装,但是要装东西就是麻烦,尤其是突然有点灵感想要用手机或平板来写点东西时特别困扰。
所以我们应该妥善运用网络上佛心来着的服务,像是 Travis CI。我们可以把透过 Hexo 产生 HTML 并 push 到 GitHub 这个流程,丢到 Travis CI 上,让它来代理。Hook Travis CI 很简单,其他地方也有专门针对 Hexo 的教学了。这篇文章的重点是在于,介绍一个 tricky 的方法来 push。
GitHub 支援 token 认证,token 就像是另一把随时可以被回收钥匙,透过 token 就可以有 write repository 的权限。可是很可惜的,目前 GitHub 没有提供为个别的 repository 产生 token 的服务,每一个 token 都能 write GitHub 帐号下的所有 repository。这实在有点恐怖。还好 GitHub 支援每一个 repository 单独设定 SSH public key 认证。所以重点来了,我们该怎么让 Travis CI 拥有 SSH key pair 呢?总不能大剌剌的把 key pair 放在 repository 里吧?免费的 repository 都是公开的,这样做也太搞笑了。另一种方法是,先把 SSH key 加密再放上
Travis CI,把密码写在 Travis CI 的环境变量里,让 Travis CI runtime 再把 key 解出来。目前网络上只看到这二种做法。
不过上面这二种方法都有用到 Travis CI 的环境变量,我实在很纳闷,何不直接把 SSH key pair 当成变量就好了?也许是因为 public key 的内容含有空白和换行及其他特殊字符,这些字符在 runtime 直接 assign 给 shell 的 variable 会发生与期待不符的结果吧。这边要说的 tricky 方法就是,把那二把 key 先用 Base64 encode,这样就可以正确 assign 给 shell 的 variable,runtime 再把 variable decode 回 key file。这样这个流程就能顺利走完了!
以后我们就可以直接在 GitHub 网页上编辑 Markdown 档案,让 GitHub 网页来帮我们 push、Travis CI 帮我们 render 和 push。也可以搭配其他线上的所见即所得编辑器,有些编辑器还可以连结 GitHub 帐号。总之这样以后就可以只管专心写文章,不必做 routine 的事。
接着,因为刚好有闲置的树莓派,我索性把 static site 放在树莓派上。所以上面这个自动化流程还必须涵盖到更新树莓派上面的内容。刚好 GitHub 有提供 webhook 服务,当 repository 更新时,GitHub webhook 会发 http request 出来。GitHub 上有网友写好现成的 webhook handler,抓下来设定一下,放在树莓派上面跑,这样就可以透过 GitHub 的 request 来 trigger 自动更新 website 了。