Middleman で作った web サイトを Travis + GitHub pages でお手軽に運用する
先日 Middleman を使って sapporojs.org をリニューアルしました。 その際に得られた Middleman での web サイト運用の知見をご紹介します。
Middleman って??
簡単に説明すると、静的 web サイトジェネレータです。 Jekyll をご存知の方であれば、似たようなものをイメージしていただけるとよさそうです。 Middleman の方が優れている点は、 Asset Pipeline や Template Helpers などの便利な機能を利用をすることができることです。
逆に Jekyll の方が有利な点としては、 GitHub pages が使えるためデプロイが楽であるという点があります。
そこで今回は、 Jekyll と同じく Middleman を GitHub pages に簡単にデプロイする方法をご紹介します。
流れ
Middleman のディレクトリ構成はおおまかには以下のようになっています:
. ├── build (生成された html) └── source (人間が編集するファイル)
Middleman で生成した web サイトを GitHub pages で公開するためには、build
ディレクトリを root ディレクトリとして gh-pages ブランチに push する必要があります。
そのため以下のような手順を設定し、デプロイを自動化することにします:
準備
まずは Middleman プロジェクトの用意しましょう。
お使いのプロジェクトがあればそれを、なければ middleman init
したものを利用します。
またデプロイ環境には、GitHub pages を利用するため、GitHub にリポジトリを作成しておきます。
source
の管理は master ブランチ、デプロイ用に gh-pages ブランチを利用することとしてご説明します。
1. Travis でビルドする
まずは、Travis の設定をおこないます。 詳しくは本家サイトを参照してください。
手元で .travis.yml
を作成します。
--- language: ruby script: bundle exec middleman build
これで、GitHub に push した際に Travis でビルドが実行されるようになりました。
2. Travis で commit を作成する
Travis だと Git に user.name
, user.email
の設定がされていないため、そのままだと commit が作れません。
そこで commit を作るために必要な環境変数を設定します。
.travis.yml
に以下を追記します。
env: global: - GIT_COMMITTER_NAME=<名前> - GIT_COMMITTER_EMAIL=<Eメール> - GIT_AUTHOR_NAME=<名前> - GIT_AUTHOR_EMAIL=<Eメール>
(名前、Eメールは適宜設定してください)
では、gh-pages ブランチを clone してきて、 ビルドが成功したあとで commit を重ねるよう設定を行いましょう。
.travis.yml
に以下の内容を追記します。
before_script: - git clone --quiet <リポジトリのURL> build - pushd build - git checkout -b gh-pages - popd after_success: - cd build - git add -A - git commit -m 'Update'
(この時、リポジトリURL には ssh プロトコルを利用しないようにしてください。接続先の fingerprint の確認を求められて先に進むことができなくなります)
これで、Travis で git の commit を作成することができるようになりました。
3. Travis から GitHub pages に push する
Travis から GitHub に push するためには一工夫必要です。 というのは、GitHub の認証を Travis から通過する必要があるからです。
このためには、以下で議論されているように、https プロトコルで GitHub の OAuth トークンを利用する というのがシンプルな方法です。
では、GitHub のトークンを取得しましょう。(すでに利用可能なトークンをお持ちであればこの手順はスキップしてください) 以下を参考に、トークンを取得してください:
この時、 scope に repo が必要なので忘れず設定してください。
上記で取得したトークンを Travis に設定しましょう。
この時、.travis.yml
に書けば GitHub にはアクセス可能になりますが、public な場所に置くと誰でもトークンの権限を利用可能になってしまうので推奨されません。
そこで、Travis の API を利用して安全に設定することにします。
(初回は Travis へのログインを求められます)
$ gem install travis $ travis encrypt -r <リポジトリ名> "GH_TOKEN=<GitHub トークン>"
secure XXX という値が返ってくるので、それをそのまま .travis.yml
の global -> env に追記します。
env: global: - secure: <Travis のセキュアキー>
このトークンを利用して GitHub に push する設定を .travis.yml
に追記します。
after_success: - cd build - git add -A - git commit -m 'Update' + - '[ "$TRAVIS_BRANCH" == "master" ] && [ $GH_TOKEN ] && git push --quiet https://$GH_TOKEN@github.com/<リポジトリ名>.git gh-pages 2> /dev/null'
git push
する際のオプションに気をつけてください。
ここで --quiet
の設定を忘れると、Travis のログに GitHub のトークンが表示されてしまいます。
以上で Travis から GitHub に push する設定は完了です。
これで、 master に push するだけで、Travis 経由で GitHub pages に自動でデプロイされるようになりました。 べんり!!
参考
また、手元からも gh-pages に push したくなるという場合もあるかと思います。
そんな時は Rakefile
に処理を切り出すというのはいかがでしょうか?
参考までに、ぼくが利用しているものをご紹介しておきます:
最後に
以上で Middleman で作った web サイトを Travis + GitHub pages でお手軽に運用する方法の紹介は終わりです。
今回ご紹介した方法が、みなさまの Middleman を利用した web サイト運用の一助になれれば幸いです:-)
(2013.08.27 追記) 今まで、本記事の通りに設定を行なうと、Travis のログに GitHub のトークンが残ってしまうという不具合がありました。 現在は手順を修正してあるので、本記事に従って Travis の自動ビルドを設定を行った方は GitHub のトークンを expire していただけるとありがたいです。
連絡をくださった @azu_re さん、ありがとうございます!