Posted on 2014-08-30 tags: ruby, github, travis
Middleman は最近よく使われている気がする静的サイトジェネレータ。少し前から静的サイトジェネレータは Middleman 一強感あったので流行に乗り遅れまいと使ってみることにした。この種のソフトウェアで Ruby 製のものは古くから Jekyll が有名でしたが、 Middleman だと Asset Pipeline の概念だったりテンプレートに erb, haml, slim が使えたりといったところで Rails に近いっぽいところが受けているのだとか。
公式のチュートリアルと、その日本語版が充実しているので一通り読めばだいたいのことはできる気がします。以下、ハマったところやちょっとしたカスタマイズだけ。
middleman init
するときに --template=blog
を付けずに実行してしまい
(というかこんなオプションがあるのを知らなかった) 、ある程度サイトを作ってからブログ機能をつけることになってしまった。するとブログテンプレートを使った場合の
config.rb
や他のファイルの中身がわからないので、解説サイトを見ても何のことだかわからない、ということがあった。
middleman-blog/lib/middleman-blog/template にテンプレートファイルが一通り置いてあるので、これをコピーすれば良い。
middleman-livereload という拡張があり、これは記事を書いている途中に保存すると勝手にブラウザがリロードしてくれるものです。使っている rack-livereload がファイルの変更を検知して WebSocket でブラウザ側に伝えて、 JavaScript でリロードとかやっているっぽい。以前似たようなものを書いたことがあるのであーあんな感じだろうなと想像しつつ。
最近は Vagrant で全部 VM の中でやるようにしているのですが、ネットワーク共有をポートフォワードでやっている場合は rack-livereload のデフォルトである 35729 番をフォワードしておく必要があります。あと、 middleman のプレビューのデフォルトである 4567 番もフォワードしておきます。
1 2 | config.vm.network "forwarded_port", guest: 4567, host: 4567 # middleman config.vm.network "forwarded_port", guest: 35729, host: 35729 # livereload |
そして config.rb
に activate :livereload
を書いておく。すると
1 | $ middleman
|
と打つと localhost:4567
でプレビューでき、 livereload もできる。
エディタで書くときは80文字で折り返したいのだけど、日本語の場合それを普通にレンダリングさせてブラウザで見ると改行位置で半角スペースが開いてしまう。それが嫌だったので、 Markdown レンダリングエンジンをいじって改行を取り除く処理をつけている。 Redcarpet での処理。
1 2 3 4 5 | class Redcarpet::Render::HTML def preprocess(text) text.gsub(/([^\x01-\x7E])\n([^\x01-\x7E])/, '\1\2') end end |
これを config.rb
に書いておけば良い。
シンタックスハイライトは Rouge を Gemfile に書いておくだけ。少し使ってみている限りは特に問題なさそう。
GitHub Pages は github.io ドメインで静的なファイルをホスティングできるサービス。 User や Organization のページと Project ごとのページの2種類 あるが、ここでは個人ページを作ることを想定しているので User & Organization のほうを使う。
この場合、 User もしくは Organization に [user or organization].github.io
というリポジトリを作り、その master ブランチに静的ファイルを push することで
https://[user or organization].github.io
にアクセスできるようになる。自分の場合は daimatz.github.io とする。
GitHub Pages で独自ドメインを使う場合やることは以下のとおり:
CNAME
ファイルを置くCNAME を設定する方法と A レコードを設定する方法がある。自分の場合は daimatz.net
を使いたかったので、「apex domain の場合は A レコードを設定せよ」との指示通り A レコードを設定する。
ググると 204.232.175.78
を使うといい、という情報が見つかるのだが、一度それで
push すると「その IP アドレスは deprecated なので公式ページに書いてある正しいものを使ってね」というメールが来た。そこから
A レコードの設定ページに飛ぶと、現時点では
の2つを使えと書いてある。
自分は VALUE DOMAIN を使っているので DNS 設定ページで次のように記入した。
1 2 | a @ 192.30.252.153 a @ 192.30.252.154 |
GitHub Pages リポジトリの master ブランチ直下に CNAME
というファイルを置き、その中に独自ドメインを書く。すると、 http://[user or organization].github.io
にアクセスされたときにそのドメインにリダイレクトしてくれる。
middleman を使う場合、 source/
直下に置いて次のようにするのが良いと思う。
1 | page 'CNAME', layout: false |
Travis CI は言わずと知れたクラウド CI サービスですが、これをデプロイに使おうとすると少し面倒な設定が必要になる。ビルドログがダダ漏れなので認証情報をそのまま書くわけにはいかない。
まず Travis が GitHub リポジトリに push できるようにする方法だが、これはアプリケーション登録して Access Token を設定すれば良い。 自分の設定の Applications ページに行き、 Personal access tokens の Generate new token からトークンを生成する。
さて、そのトークンを Travis に教える方法だが、このために Travis CI に暗号化の仕組みがある。 travis コマンドを使って次のようにする。
1 2 | $ gem install travis $ travis encrypt -r daimatz/daimatz.github.io "GH_TOKEN=<token>" |
そして .travis.yml
に次のように書く。
1 2 3 | env: global: - secure: ".............." |
すると、ビルド時に復号化した GH_TOKEN=<token>
が展開される。もちろんビルドログには表示されない。
[user or organization].github.io
ではデプロイするファイルは master ブランチに置かなければならない。そこで、ソースはすべて source ブランチに置いておき、
source ブランチを push すると Travis が master ブランチに成果物を commit して
push という手順をとることになる。 master に push する用のリポジトリを build というディレクトリで clone してきて、 middleman build
したときに build ディレクトリに入るようにする。具体的には次のような感じ。
1 2 3 4 5 6 7 8 9 | before_script: - git clone --quiet https://github.com/daimatz/daimatz.github.io build script: - bundle exec middleman build after_success: - cd build - git add -A . - git commit -m "Update [ci skip]" - '[ "$TRAVIS_BRANCH" == "source" ] && git push --quiet https://$GH_TOKEN@github.com/daimatz/daimatz.github.io master 2> /dev/null' |
git push
時に --quiet
を付けないとトークンが表示されてしまうので注意。
Travis ではコミットメッセージに
[ci skip]
という文字列を入れておくと、そのコミットについてはビルドしない。こうしないと Travis が master ブランチに push したコミットについてまた CI が走ってしまい、 .travis.yml
がないためビルドが失敗してエラーメールが飛んでくることになる。
ソースを見てもらうのが一番わかりやすい気がする。
comments powered by Disqus