Riji + Daiku + Travis CI で GitHub Pages を運用する

まとめ

やりたいこと

「 markdown で記事を書く」「 commit する」「 GitHub に push する」で blog が更新できるようになること

具体的な手順

GitHub Pages を作る

今回は monmon.github.io に作ることにした(ユーザページと呼ばれるやつで [https://github.com/monmon/monmon.github.io:title=.github.io] のリポジトリ作ってmaster branch にpushするやつ )。

設定方法は GitHub Pages のサイトにあるのでその通りやれば良い。

Riji を使うための前準備をする

今回は Travis で publish したい(静的ファイルを作りたい)ので Carton で Riji をインストールする。


0. まず、Carton が入ってない場合には cpanm で入れる

cpanm Carton


1. cpanfile に Riji を書く(ついでに後々必要になる Daiku も)

% cat > cpanfile
requires 'Riji';
requires 'Daiku';


2. Carton でインストール

carton install

これでlocalディレクトリが作れる


3. アーキテクチャの関係上、 Travis で改めて carton install するので、local ディレクトリはgitignoreしちゃう

echo local >> .gitignore

ここまでで一旦commitする


前準備はここまで。簡単。

Riji を使う

RijiPerl で作られた blog ツールで、「 markdown で記事を書く」「 commit する」「その記事を HTML ファイルとして吐き出す」というお手軽作業で記事更新できるもの。
チュートリアルがわかりやすいのでそれをそのまま倣ってていくだけで使える。


1. 事前作業で Riji が使えるようになっているので、まずは setup

carton exec riji setup --force

既にlocalディレクトリがあるので --force が必要


2. 念のためページが見れるか確認

carton exec riji server

表示できれば一旦OK


3. 今後、新しい記事を書くときは以下を叩くだけでOK

carton exec riji new-entry


Rijiについてはこれでおしまい。簡単。

Daiku を使う

DaikuRake みたいなやつの Perl 版。
.travis.yml にズラズラ書くよりも Rake 使ってやるのが良さそうなので Daiku も一緒にインストールすることにした(というか、使ったことないので何となく使ってみたかった)。

Daiku の使い方は Daiku and Daikufile are now production ready | おそらくはそれさえも平凡な日々sample を見るとざっくりわかる。


今回 Daiku で必要な作業は以下の3つ。

  1. master branch を checkout する
    • Travis は最新 commit を checkout してテストをまわすわけだけど、 Riji は publish 用の branch かチェックしている( git symbolic-ref HEAD の値を確認している)ため master に切り替える
  2. publish する
  3. publish したものを git に push する( blog の更新)


ということで、それぞれ以下のようになった。


1. master branch を checkout する

desc 'git を masterに変える';
task checkout_master => sub {
    my ($task, @args) = @_;
    sh qw(git checkout master);
};


2. publish する

desc '記事を作る';
task publish => sub {
    my ($task, @args) = @_;
    sh qw(carton exec riji publish);
};


3. publish したものを git に push する( blog の更新)

desc '作られた記事を github に push';
task push_github => sub {
    my ($task, @args) = @_;


    sh qw(git add -A);
    sh qw(git commit -m), 'Update blog on Travis';


    # Token が出力されないように --quiet & 2> /dev/null
    sh "git push --quiet https://$ENV{GH_TOKEN}\@github.com/monmon/monmon.github.io master 2> /dev/null";
};

最後の--quiet と 2> /dev/null はPersonal access tokenの値が Travis の出力結果に表示されないためのもの。ここだけ文字列で渡している理由は標準エラーにリダイレクトするため( sh は IPC::System::Simple なので、リストで渡してもシェル起動せず、標準エラーを /dev/null にリダイレクト利するためには文字列渡してリダイレクトさせないといけない…んだと思う)。


Daiku についてはここまで。簡単。

Travis を使う

Travis CI はCIサービスで、GitHub に push したらテストまわしたり、必要なシェル実行してくれるやつ。
Perl + Travis CI + Coveralls (PrePANの対応) - $shibayu36->blog; を見て Perl 設定の参考にした。


ここでやることは以下の3つ。

  1. TravisGitHub Pages のリポジトリに push されたものをテストするように設定する
  2. Travisリポジトリに push できるように secure を作る
    • GH_TOKEN をそのまま .travis.yml に書いちゃうと誰でもリポジトリに push できるようになってしまうため secure ってのを作る
  3. Travis の作業内容を .travis.yml に書く


ということで、細かい内容は以下。


1. TravisGitHub Pages のリポジトリに push されたものをテストするように設定する

これは Accountsのページ に行って GitHub Pages のリポジトリを ON にするだけでおしまい


2. Travisリポジトリに push できるように secure を作る

gem install travis
travis encrypt -r <owner>/<repo> "GH_TOKEN=<GitHub  Personal access token>" 

僕の場合なら / のところは monmon/monmon.github.io


3. .travis.yml を書く

language: perl
perl:
  - "5.18"

(5.16 だと Getopt::Long のバージョンが 2.38 でDaiku の求めるバージョンより低くてハマったのでサクッと5.18にしました)

  • branch は master しか使わないので
branches:
  only:
      - master
  • blog 生成部分は Daiku を使うだけ
before_install:
  - cpanm Carton
install:
  - 'carton install --deployment'
before_script:
  - carton exec daiku setup
script:
  - carton exec daiku publish
after_success:
  - '[ "$TRAVIS_BRANCH" == "master" ] && [ "$GH_TOKEN" ] && carton exec daiku push_blog_to_github'
  • 最後に GitHub に push できるように設定するだけ
env:
  global:
    - GIT_COMMITTER_NAME="monmon"
    - GIT_COMMITTER_EMAIL="lesamoureuses@gmail.com"
    - GIT_AUTHOR_NAME="monmon"
    - GIT_AUTHOR_EMAIL="lesamoureuses@gmail.com"
    - secure: "RpupCpR1J/p+JIqdJ7WUk13NnA1LgpxqVPjHpY18XSTrKZy6YAEtzPu3aVqARFFN40iipiyxSCm93mzOSWwdl9FUyV//ythOCSpF3fs9NKSP/9HilGb8x3yIbpastRML2m1voSYmuR5IKOELc4axVEVapYenUoCVlVhcZ0oVXkM="

(COMMITTER と AUTHOR どちらかだけだとダメで両方書かないといけなかったんだけどどこにそのことが書いてあるのか探せなかった)

.travis.ymlのsyntax checkについては Travis が用意している Lint を使えば良いです(日本語が入ってた場合にLintはグリーンだけど Travis 上ではエラーになるとパターンがあってハマったけど)。


Travis についてはここまで。簡単。

できあがり

ということで、できた blog が http://monmon.github.io/blog/ です!
超いろんな所でハマったけど、それらを乗り越えて作ることができました!

最後に

やってみて重要だなと思ったことはネタを作ってからスピーカー登録しようとしてもスピーカー枠は埋まってるということでした!