Farseerfc的小窝 - pages//farseerfc.me/zhs/2016-08-07T16:28:00+09:00启用 GitHub Issue 作为博客留言系统2016-08-07T16:28:00+09:002016-08-07T16:28:00+09:00farseerfctag:farseerfc.me,2016-08-07:/zhs/github-issues-as-comments.html<p>从今天起本博客将启用 GitHub Issue 作为留言系统。
原本使用的 Disqus 将继续保留一段时间,目前没有关闭的计划。</p>
<p>换用 GitHub Issue 是计划了好久的事情了,最初重做这个主题的时候就有考虑过。
这个想法的契机是看到了这篇
<a class="reference external" href="http://ivanzuzak.info/2011/02/18/github-hosted-comments-for-github-hosted-blogs.html">GitHub hosted comments for GitHub hosted blogs</a>
,然后立马觉得这个想法很符合寄宿在 GitHub Pages 上的博客。
一个限制是要求评论者必须有 GitHub
账户,考虑到我的博客的受众这个要求估计不算太过分。
使用 GitHub Issue 的好处么,比如自带的 GFMD
富文本格式,邮件通知,还有订阅和取消订阅通知,邮件回复,
这些方面都不比第三方留言系统逊色。</p>
<p>换用 GitHub Issue 另一方面原因是最近听说 Disqus
被部分墙了,想必以后墙也会越来越高。之前曾经试过在这个博客换上多说,
然而效果我并不喜欢,多说喜欢侵入页面加很多奇怪的东西 …</p><p>从今天起本博客将启用 GitHub Issue 作为留言系统。
原本使用的 Disqus 将继续保留一段时间,目前没有关闭的计划。</p>
<p>换用 GitHub Issue 是计划了好久的事情了,最初重做这个主题的时候就有考虑过。
这个想法的契机是看到了这篇
<a class="reference external" href="http://ivanzuzak.info/2011/02/18/github-hosted-comments-for-github-hosted-blogs.html">GitHub hosted comments for GitHub hosted blogs</a>
,然后立马觉得这个想法很符合寄宿在 GitHub Pages 上的博客。
一个限制是要求评论者必须有 GitHub
账户,考虑到我的博客的受众这个要求估计不算太过分。
使用 GitHub Issue 的好处么,比如自带的 GFMD
富文本格式,邮件通知,还有订阅和取消订阅通知,邮件回复,
这些方面都不比第三方留言系统逊色。</p>
<p>换用 GitHub Issue 另一方面原因是最近听说 Disqus
被部分墙了,想必以后墙也会越来越高。之前曾经试过在这个博客换上多说,
然而效果我并不喜欢,多说喜欢侵入页面加很多奇怪的东西,比如用户的头像通常是
http 的……也试过结合新浪微博的评论,而新浪微博越来越封闭,API 也越来越不靠谱。</p>
<p>使用 GitHub Issue 作为评论的方式比较简单,上面那篇博客里面提到了,代码量不比
加载 Disqus 多多少,而且没有了 iframe 的困扰,唯一麻烦的地方就是要稍微设计一下布局方式让它融入
现有的页面布局。
<a class="reference external" href="https://github.com/farseerfc/pelican-bootstrap3/blob/2ea6c9f3227275fe86ddaa75d8fc6496b3b03d8c/templates/includes/comments.html#L32">我参考上面的实现在这里</a> 。
这个加载代码使用两个变量加载 Issue Comments ,一个是在 pelicanconf.py 里的
<code class="code">
GITHUB_REPO</code>
,可以指向任何 Repo ,我指向 farseerfc/farseerfc.github.io
的这个 GitHub Page repo ,另一个变量是每篇文章里需要加上 <code class="code">
issueid</code>
的元数据,关连文章到每个 Issue 上。</p>
<p>还有一个稍微麻烦的事情是现在每写一篇文章之后都要新建一个 issue 了。
手动操作有点累人,于是我 <a class="reference external" href="https://github.com/farseerfc/farseerfc/blob/master/createissue.py">写了个脚本</a>
自动搜索 pelican 的 content 文件夹里面文章的 slug 并且对没有 issueid 关连的
文章创建 issue 。</p>
<p>好啦新的留言系统的外观样式还在测试中,希望大家多留言帮我测试一下!</p>
<div class="label label-warning">
<strong>2016年8月7日19:30更新</strong></div>
<p>新增了对 GitHub Issue comments 里面
<a class="reference external" href="https://developer.github.com/v3/issues/comments/#reactions-summary">reactions</a>
的支持,套用 font-awesome 的图标(似乎没 GitHub 上的图标好看)。这个还属于 GitHub API
的实验性功能,要加入 <code class="code">
Accept: application/vnd.github.squirrel-girl-preview</code>
HTTP 头才能拿到。</p>
<div class="label label-warning">
<strong>2016年8月7日23:16更新</strong></div>
<p>感谢 @iovxw 的测试让我发现 github 的高亮回复和邮件回复是需要特殊处理的。
高亮回复用上了 <a class="reference external" href="https://github.com/sindresorhus/github-markdown-css">这里的 CSS</a>
邮件引言的展开事件直接用 jQuery 做了:</p>
<div class="highlight"><pre><span class="code-line"><span></span> <span class="nx">$</span><span class="p">(</span><span class="s2">".email-hidden-toggle > a"</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s2">"click"</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">e</span><span class="p">){</span></span>
<span class="code-line"> <span class="nx">e</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span></span>
<span class="code-line"> <span class="nx">$</span><span class="p">(</span><span class="s2">".email-hidden-reply"</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">parent</span><span class="p">).</span><span class="nx">toggle</span><span class="p">();</span></span>
<span class="code-line"><span class="p">});</span></span>
</pre></div>
<p>还得注意邮件的回复需要 CSS 里面 <code class="code">
white-space: pre-wrap</code>
。</p>
用 Travis-CI 生成 Github Pages 博客2015-02-20T11:10:00+09:002015-02-20T11:10:00+09:00farseerfctag:farseerfc.me,2015-02-20:/zhs/travis-push-to-github-pages-blog.html
<div class="label label-warning">
<strong>2015年2月21日更新</strong></div>
<p>上次介绍过 <a class="reference external" href="//farseerfc.me/zhs/redesign-pelican-theme.html">这个博客改换了主题</a> ,
本以为这个话题可以告一段落了,没想到还能继续写呢。</p>
<p>寄宿在 Github Pages 上的静态博客通常有两种方案,其一是使用 <a class="reference external" href="http://jekyllrb.com/">Jekyll</a> 方式撰写,这可以利用
Github Pages 原本就有的
<a class="reference external" href="https://help.github.com/articles/using-jekyll-with-pages/">Jekyll支持</a>
生成静态网站。另一种是在 <strong>本地</strong> 也就是自己的电脑上生成好,然后把生成的 HTML 网站 push
到 Github Pages ,这种情况下 Github Pages 就完全只是一个静态页面宿主环境。</p>
<p>我用 <a class="reference external" href="http://getpelican.com/">Pelican</a> 生成博客,当然就只能选择后一种方式了。这带来一些不便,比如本地配置 pelican
还是有一点点复杂的,所以不能随便找台电脑就开始写博客。有的时候只是想修正一两个错别字,
这时候必须打开某台特定的电脑才能编辑博客就显得不太方便了。再比如 pelican 本身虽然是 python
写的所以跨平台,但是具体到博客的配置方面, Windows …</p>
<div class="label label-warning">
<strong>2015年2月21日更新</strong></div>
<p>上次介绍过 <a class="reference external" href="//farseerfc.me/zhs/redesign-pelican-theme.html">这个博客改换了主题</a> ,
本以为这个话题可以告一段落了,没想到还能继续写呢。</p>
<p>寄宿在 Github Pages 上的静态博客通常有两种方案,其一是使用 <a class="reference external" href="http://jekyllrb.com/">Jekyll</a> 方式撰写,这可以利用
Github Pages 原本就有的
<a class="reference external" href="https://help.github.com/articles/using-jekyll-with-pages/">Jekyll支持</a>
生成静态网站。另一种是在 <strong>本地</strong> 也就是自己的电脑上生成好,然后把生成的 HTML 网站 push
到 Github Pages ,这种情况下 Github Pages 就完全只是一个静态页面宿主环境。</p>
<p>我用 <a class="reference external" href="http://getpelican.com/">Pelican</a> 生成博客,当然就只能选择后一种方式了。这带来一些不便,比如本地配置 pelican
还是有一点点复杂的,所以不能随便找台电脑就开始写博客。有的时候只是想修正一两个错别字,
这时候必须打开某台特定的电脑才能编辑博客就显得不太方便了。再比如 pelican 本身虽然是 python
写的所以跨平台,但是具体到博客的配置方面, Windows 环境和 Linux/OSX/Unix-like
环境下还是有
<a class="reference external" href="http://pelican.readthedocs.org/en/latest/settings.html#date-format-and-locale">些许出入</a>
的。还有就是没有像 wordpress 那样的基于 web
的编辑环境,在手机上就不能随便写一篇博客发表出来(不知道有没有勇士尝试过在
Android 的 <a class="reference external" href="https://code.google.com/p/android-scripting/">SL4A</a> 环境下的 python 中跑 pelican ,还要配合一个
<a class="reference external" href="https://play.google.com/store/apps/details?id=com.romanenco.gitt">Android 上的 git 客户端</a> )。</p>
<p>当然并不是因此就束手无策了,感谢 <a class="reference external" href="https://travis-ci.org/">Travis-CI</a> 提供了免费的
<ruby><rb>持续整合</rb><rp>(</rp><rt>Continuous integration</rt><rp>)</rp></ruby> 虚拟机环境,
通过它全自动生成静态博客成为了可能。</p>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id10">关于 Travis-CI</a></h2>
<p><a class="reference external" href="http://zh.wikipedia.org/wiki/%E6%8C%81%E7%BA%8C%E6%95%B4%E5%90%88">持续整合</a>
原本是 <ruby><rb>敏捷开发</rb><rp>(</rp><rt>Agile Development</rt><rp>)</rp></ruby>
或者 <ruby><rb>极限编程</rb><rp>(</rp><rt>Extreme Programming</rt><rp>)</rp></ruby> 中提到的概念,大意就是说在开发的过程中,
一旦有微小的变更,就全自动地 <strong>持续</strong> 合并到主线中, <strong>整合</strong> 变更的内容到发布版本里。
这里的 <strong>整合</strong> 实际上可以理解为 <strong>全自动测试</strong> 加上 <strong>生成最终产品</strong> 。
可以看到 <strong>持续整合</strong> 实际强调 <strong>全自动</strong> ,于是需要有一个服务器不断地监听主线开发的变更内容,
一旦有任何变更(可以理解为 git commit )就自动调用测试和部署脚本。</p>
<p>于是要用持续整合就需要一个整合服务器,幸而 Travis-CI 对 github 上的公开 repo
提供了免费的整合服务器虚拟机服务,和 github 的整合非常自然。所以我们就可以用它提供的虚拟机
为博客生成静态网站。</p>
</div>
<div class="section" id="id6">
<h2><a class="toc-backref" href="#id11">启用 Travis-CI 自动编译</a></h2>
<p>这一步很简单,访问 <a class="reference external" href="https://travis-ci.org/">https://travis-ci.org/</a> 并用你的 Github 账户登录,
授权它访问你的账户信息就可以了。然后在 <a class="reference external" href="https://travis-ci.org/repositories">https://travis-ci.org/repositories</a> 里开启
需要编译的 repo ,这样 Travis-CI 就会监视对这个 repo 的所有 push 操作,并且对
每个 push 调用测试了。</p>
<div class="figure">
<img alt="在 Travis-CI 中开启对 Github Repo 的持续整合" class="img-responsive" src="//farseerfc.me/zhs/images/travis-repo-enable.png"/>
<p class="caption">在 Travis-CI 中开启对 Github Repo 的持续整合</p>
</div>
<p>然后在 repo 的根目录放一个 <code class="code">
.travis.yml</code>
文件描述编译的步骤。
<strong>暂时</strong> 测试的目的下我写的 <code class="code">
.travis.yml</code>
大概是下面这样。</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="nt">language</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">python</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nt">python</span><span class="p">:</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="s">"2.7"</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nt">before_install</span><span class="p">:</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">sudo apt-add-repository ppa:chris-lea/node.js -y</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">sudo apt-get update</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">sudo apt-get install nodejs ditaa doxygen parallel</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nt">install</span><span class="p">:</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">sudo pip install pelican</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">sudo pip install jinja2</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">sudo pip install babel</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">sudo pip install beautifulsoup4</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">sudo pip install markdown</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">sudo npm install -g less</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">wget "http://downloads.sourceforge.net/project/plantuml/plantuml.jar?r=&ts=1424308684&use_mirror=jaist" -O plantuml.jar</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">sudo mkdir -p /opt/plantuml</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">sudo cp plantuml.jar /opt/plantuml</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">echo "#! /bin/sh" > plantuml</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">echo 'exec java -jar /opt/plantuml/plantuml.jar "$@"' >> plantuml</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">sudo install -m 755 -D plantuml /usr/bin/plantuml</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">wget https://bintray.com/artifact/download/byvoid/opencc/opencc-1.0.2.tar.gz</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">tar xf opencc-1.0.2.tar.gz</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">cd opencc-1.0.2 && make && sudo make install && cd ..</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">sudo locale-gen zh_CN.UTF-8</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">sudo locale-gen zh_HK.UTF-8</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">sudo locale-gen en_US.UTF-8</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">sudo locale-gen ja_JP.UTF-8</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nt">script</span><span class="p">:</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">git clone --depth 1 https://github.com/farseerfc/pelican-plugins plugins</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">git clone --depth 1 https://github.com/farseerfc/pelican-bootstrap3 theme</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">mkdir output</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">env SITEURL="farseerfc.me" make publish</span></span>
</pre></div>
<p>Travis-CI 提供的虚拟机是比较标准的 Ubuntu 12.04 LTS ,打上了最新的补丁,并且根据你指定的
语言选项会把相应的解释器和编译器升级到最新版(或者指定的版本)。这里用 python 语言的配置,
所以 python 是 2.7 的最新版并且有 pip 可以直接用。
配置中的 before_install 和 install 的区别其实不大,其中任何一个失败的话算作
build errored 而不是 build fail ,而如果在 script 里失败的话算作 build fail 。</p>
<p>为了编译我的模板,还需要比较新的 less.js ,所以添加了 ppa 装了个最新的 nodejs
并用它装上了 less 。
还从源码编译安装上了最新版的 opencc 1.0.2 ,因为 Ubuntu 源里的 opencc 的版本比较老(0.4),
然后 doxygen 作为 opencc 的编译依赖也装上了。
其它安装的东西么,除了 pelican 之外都是插件们需要的。以及我还需要生成 4 个语言的 locale
所以调用了 4 次 locale-gen 。由于是比较标准的 Ubuntu 环境,所以基本上编译的步骤和在本地
Linux 环境中是一样的,同样的这套配置应该可以直接用于本地 Ubuntu 下编译我的博客。</p>
<p>写好 <code class="code">
.travis.yml</code>
之后把它 push 到 github ,然后 travis 这边就会自动 clone
下来开始编译。 travis 上能看到编译的完整过程和输出,一切正常的话编译结束之后
build 的状态就会变成 passing ,比如
<a class="reference external" href="https://travis-ci.org/farseerfc/farseerfc/builds/51344614">我的这次的build</a> 。</p>
</div>
<div class="section" id="travis-ci-github">
<h2><a class="toc-backref" href="#id12">从 Travis-CI 推往 Github</a></h2>
<p>上面的测试编译通过了之后,下一步就是让 travis-ci 编译的结果自动推到 Github Pages
并发布出来。要推往 Github 自然需要设置 Github 用户的身份,在本地设置的时候是把
ssh key 添加到 github 账户就可以了,在编译细节都通过 github repo 公开了的 travis 上
当然不能放推送用的私有 key ,所以我们需要另外一种方案传递密码。</p>
<div class="panel panel-default">
<div class="panel-heading">
Github 上创建 Personal Access Token</div>
<div class="panel-body">
<img alt="Github 上创建 Personal Access Token" class="img-responsive" src="//farseerfc.me/zhs/images/travis-blog-push.png"/>
</div>
</div>
<p>好在 Github 支持通过 <a class="reference external" href="https://github.com/settings/applications">Personal Access Token</a>
的方式验证,这个和 App Token 一样可以随时吊销,同时完全是个人创建的。另一方面 Travis-CI
支持加密一些私密数据,通过环境变量的方式传递给编译脚本,避免公开密码这样的关键数据。</p>
<p>首先创建一个 <a class="reference external" href="https://github.com/settings/applications">Personal Access Token</a>
,这里需要勾选一些给这个 Token 的权限,我只给予了最小的 public_repo 权限,如侧边里的图。
生成之后会得到一长串 Token 的散列码。</p>
<div class="panel panel-default">
<div class="panel-heading">
如果你不能使用 travis 命令</div>
<div class="panel-body">
<div class="label label-warning">
<strong>2015年2月21日更新</strong></div>
<p>使用 <code class="code">
travis encrypt</code>
命令来加密重要数据最方便,不过如果有任何原因,
比如 ruby 版本太低或者安装不方便之类的,那么不用担心,我们直接通过
<a class="reference external" href="http://docs.travis-ci.com/api/#repository-keys">travis api</a>
也能加密数据。</p>
<p>第一步用这个命令得到你的repo的 pubkey :</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="go">curl -H "Accept: application/vnd.travis-ci.2+json" https://api.travis-ci.org/repos/<github-id/repo>/key | python2 -m json.tool | grep key | sed 's/.*"key": "\(.*\)"/\1/' | xargs -0 echo -en | sed 's/ RSA//' > travis.pem</span></span>
</pre></div>
<p>其中的 <github-id/repo> 替换成 github 上的 用户名/repo名, 比如我的是
farseerfc/farseer 。travis api 获得的结果是一个 json ,所以还用 python 的
json 模块处理了一下,然后把其中包含 key 的行用 <code class="code">
grep</code>
提取出来,用
<code class="code">
sed</code>
匹配出 key 的字符串本身,然后 <code class="code">
xargs -0 echo -en</code>
解释掉转义字符,然后删掉其中的 "<空格>RSA" 几个字(否则 openssl 不能读),
最后保存在名为 travis.pem 的文件里。</p>
<p>有了 pubkey 之后用 openssl 加密我们需要加密的东西并用 base64 编码:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="go">echo -n 'GIT_NAME="Jiachen Yang" GIT_EMAIL=farseerfc@gmail.com GH_TOKEN=<Personal Access Token>' | openssl rsautl -encrypt -pubin -inkey travis.pem | base64 -w0</span></span>
</pre></div>
<p>替换了相应的身份信息和token之后,这行得到的结果就是 secure 里要写的加密过的内容。</p>
</div>
</div>
<p>然后我们需要 <code class="code">
travis</code>
命令来加密这个 token , archlinux 用户可以安装
<code class="code">
aur/ruby-travis</code>
,其它用户可以用 gems 安装:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="gp">$</span> gem install travis</span>
</pre></div>
<p>装好之后,在设定了 Travis-CI 的 repo 的目录中执行一下 <code class="code">
travis status</code>
,
命令会指导你登录 Travis-CI 并验证 repo 。正常的话会显示最新的 build 状态。
然后同样在这个 repo 目录下执行:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="gp">$</span> travis encrypt <span class="s1">'GIT_NAME="Jiachen Yang" GIT_EMAIL=farseerfc@gmail.com GH_TOKEN=<Personal Access Token>'</span></span>
</pre></div>
<p>当然上面一行里的相应信息替换为个人的信息,作为这个命令的执行结果会得到另一长串散列码,
把这串散列写入刚才的 <code class="code">
.travis.yml</code>
文件:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="nt">env</span><span class="p">:</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="nt">secure</span><span class="p">:</span> <span class="s">"long</span><span class="nv"> </span><span class="s">secure</span><span class="nv"> </span><span class="s">base64</span><span class="nv"> </span><span class="s">string"</span></span>
</pre></div>
<p>有了这段声明之后, Travis-CI 就会在每次编译之前,设置上面加密的环境变量。
然后在编译脚本中利用这些环境变量来生成博客:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="nt">script</span><span class="p">:</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">git config --global user.email "$GIT_EMAIL"</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">git config --global user.name "$GIT_NAME"</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">git config --global push.default simple</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">git clone --depth 1 https://github.com/farseerfc/pelican-plugins plugins</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">git clone --depth 1 https://github.com/farseerfc/pelican-bootstrap3 theme</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">git clone --depth 1 https://$GH_TOKEN@github.com/farseerfc/farseerfc.github.io output</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">env SITEURL="farseerfc.me" make publish</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nt">after_success</span><span class="p">:</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">cd output</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">git add -A .</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">git commit -m "update from travis"</span></span>
<span class="code-line"> <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">git push --quiet</span></span>
</pre></div>
<div class="alert alert-warning compound">
<p>这里要注意最后 <code class="code">
git push</code>
的时候一定要加上 <code class="code">
--quiet</code>
,因为默认不加的时候会把
代入了 <code class="code">
$GH_TOKEN</code>
的 URL 显示出来,从而上面的加密工作就前功尽弃了……</p>
</div>
<p>根据 <a class="reference external" href="http://docs.travis-ci.com/user/build-lifecycle/">travis 的文档</a>
, after_success 里写的步骤只有在 script 里的全都完全无错执行完之后才会执行,这正是我们
push 的条件。目前 after_success 的成功与否不会影响到 build 的状态。
具体我用的配置见
<a class="reference external" href="https://github.com/farseerfc/farseerfc/blob/master/.travis.yml">这里的最新版</a> 。
在我的 <code class="code">
make github</code>
中
<a class="reference external" href="https://github.com/farseerfc/farseerfc/blob/master/Makefile#L102">调用了</a>
<code class="code">
git push</code>
命令,从而执行了 <code class="code">
make github</code>
之后就会自动部署到 github 上。</p>
</div>
<div class="section" id="web">
<h2><a class="toc-backref" href="#id13">用 Web 编辑并发布静态博客</a></h2>
<p>经过以上设置之后,一切正常的话,每次对主 repo 推送更新的同时, Travis-CI 就会自动
拉来更新然后编译并发布了。可以放置这样的图标 <img alt="travisIcon" class="img-responsive no-responsive" src="https://travis-ci.org/farseerfc/farseerfc.svg?branch=master"/> 在项目的 <code class="code">
Readme.md</code>
中显示编译状态。</p>
<p>这样设置之后的另一个好处就在于可以利用 Github 的 Web 界面编辑文章内容。在 Github 里
编辑和保存之后会自动作为一个 commit 提交,所以也会触发 Travis-CI 的自动编译。</p>
<div class="figure">
<img alt="在 Github 的 Web 界面中直接编辑文章内容" class="img-responsive" src="//farseerfc.me/zhs/images/travis-edit-github-web.png"/>
<p class="caption">在 Github 的 Web 界面中直接编辑文章内容</p>
</div>
<p>以及虽然目前还没有好用的 Github 的手机客户端,不过直接用 Android/iPhone 的浏览器登录
github 并编辑文章的可用性也还不错,所以同样的方式也可以直接在手机上发布博文了。</p>
<p>That is all, happy blogging ~</p>
</div>