2013-12-12
■ [ruby] MiddlemanをGitHub Pagesにデプロイしてカスタムドメインを使う
昨日に引き続き、Middleman Advent Calendar 2013の12日目です。
最近、Middlemanを使ってGitHub Pages上に静的サイトをデプロイする作業を何度かやったので、手順をまとめておきます。 実際の利用例は https://github.com/yhara/esolang-book-website と https://github.com/yhara/w.route477.net です。
静的サイトとはいえ、無料でホスティングしてもらって独自ドメインが使えてIssuesまで付いてくるので、軽く申し訳ない気分になります。気が向いたらグッズでも買うと良いと思います。
GitHub Pagesとは
GitHub上のプロジェクトのREADMEなどを、静的サイトとして公開できるサービスです。 READMEに限らず、任意のHTMLが置けます。ドメインは昔はxxx.github.comでしたが、現在はxxx.github.ioに変わっています。
ファイルの置き方
GitHub Pagesには以下の2種類があります。
- User page (例:http://yhara.github.io/ 、ユーザまたはOrganization単位のページ)
- Project page (例:http://yhara.github.io/ember_moon/ 、リポジトリ単位のページ)
ファイルの置き方は、Project pageとUser pageで少し違います。Project pageの場合はリポジトリにgh-pagesというブランチを作り、そこに静的HTMLをpushします。一方、User pageの場合はmasterブランチに直接HTMLを置きます。
MiddlemanをProject pageで運用する場合は、middleman-gh-pages というプラグインを使うと、rake publish
でビルド結果をgh-pagesブランチにpushしてくれてとても便利です。masterにコンパイル前のソースを置き、gh-pagesに生成物を置くという形になります。
一方MiddlemanをUser pageで運用する場合は…、どうするんですかね。ビルド先を./build/
じゃなく./
にすれば良いのかなぁ。masterにHTMLを置くという仕様は静的ファイルジェネレータと相性が悪いので、User pageもgh-pagesブランチを使うというルールの方が嬉しかった気がします。
middleman-gh-pagesの使い方は以下のような感じです。
- Gemfileに
gem "middleman-gh-pages"
を追加 →bundle install
- Rakefileに
require 'middleman-gh-pages'
を追加 rake publish
でデプロイ(= ./build以下にサイトをビルドし、gh-pagesブランチにコミットし、githubのgh-pagesブランチにpush)
カスタムドメインについて
Middlemanとは関係ないのですが、ついでなのでGithub Pagesで独自ドメインを使う方法についても書いておきます。公式ヘルプに情報があります。
まず「CNAME」というファイルを作り、中に「esolang-book.route477.net」みたいにドメイン名を書きます。 middleman-gh-pagesを(Project pageで)使う場合は、masterブランチのsource以下にCNAMEファイルを置きます。こうすることによって、rake publishによりgh-pagesブランチのトップディレクトリにCNAMEファイルがpushされるという寸法です。
で、それができたらDNSの設定を変更します。こっちの手順はUser pageでもProject pageでも同じですが、サブドメインのありなしで作業が違います。
- サブドメインなしの場合(例:example.jp):
example.jp
のAレコードを204.232.175.78
に設定します。(IPは変わる可能性があるので最新情報はヘルプを見て下さい) - サブドメインありの場合(例:www.example.jp):
www.example.jp
のCNAMEレコードを(ユーザ名).github.io.
に設定します。
ドメインを割り当ててしまえばUser pageもProject pageも違いがないと思うので、middleman-gh-pagesが使えるProject pageの方が便利かなと思います。
以上、MiddlemanのGitHub Pagesでの運用方法でした。