このブログはOctopressで作っていて、ソース自体はBitbucketで管理しているんだけど、新しい記事を書いてデプロイした後にBitbucketにpushし忘れて、記事のソースを無くしてしまうということをちょいちょいやらかしてしまう。
実は今回も3つぐらい過去の記事を無くしてしまい、既に公開している記事からソースを書き起こした。
そもそも、ソース管理とデプロイを別々のタイミングで行なっていることが問題なので、デプロイを無料のCIサービスである「Wercker」を利用して自動化してみることにした。

前提環境

  • OctopressのソースはBitbucketのプライベートリポジトリ
  • デプロイ先はGithubのGithub Pages
  • 手動でのデプロイ環境は構築済みで一度はデプロイしていること(gh-pagesブランチが作成されていること)
  • Werckerのアカウントを作成済み

wercker.ymlの用意

こんな感じのymlファイルをプロジェクトディレクトリの直下にセットする。

box: wercker/rvm
build:
  steps:
    - rvm-use:
        version: ruby-1.9.3-p545
    - bundle-install
    - script:
        name: make .ssh directory
        code: mkdir -p "$HOME/.ssh"
    - create-file:
        name: write ssh key
        filename: $HOME/.ssh/id_rsa
        overwrite: true
        hide-from-log: true
        content: $WERCKER_SSH_KEY_PRIVATE
    - script:
        name: set permissions for ssh key
        code: chmod 0600 $HOME/.ssh/id_rsa
    - script:
        name: build octopress
        code: |
          git config --global user.email "longkey1@gmail.com"
          git config --global user.name "wercker"
          bundle exec rake generate
    - script:
        name: deploy to github
        code: |
          rm -rf _deploy
          git clone git@github.com:longkey1/blog.git _deploy
          pushd _deploy
          git checkout -t origin/gh-pages
          popd
          bundle exec rake deploy

Werckerでアプリケーション登録する

「Home > My Apps」から「Add an application」をクリックして自分のアプリケーションを登録する。
今回の場合なら、ソースはBitbucketにあるので最初にBitbucketを選択して、リポジトリも選んでってやれば大丈夫。
この辺りは特に迷うことはないと思う。

WerckerのSSHの鍵を設定

「Home > My Apps > [User] > [Application]」から「Settings」を選ぶ。
「SSH keys」という項目があるので、鍵を作成する。

次にPipelineの項目の「Add new variable」をクリック。
nameには「WERCKER_SSH_KEY」と入力。
「SSH Key pair」を選んで、先ほど作成したSSH Keyをセットする。 こうすることで、環境変数の「WERCKER_SSH_KEY_PRIVATE」に秘密鍵がセットされるらしい。
「WERCKER_SSH_KEY_PUBLIC」にも公開鍵がセットされるらしいが、今回は使わない。

GithubにWerckerのSSH公開鍵を設定

先ほど作成した公開鍵をコピペでセット。

テストする

Bitbucketへpushして、無事更新されたらOK。

ハマりどころ

ネット上で今回やりたかったことのそのものズバリってサイトを見つけたんだけど、結局上手く出来なかった。
それはGithubのtokenを使ったやり方なんだけど、Octopressのrakeコマンドとの相性が最悪で、どうにもならなかった。
SSHの鍵を使うこのやり方は、泥臭いけど汎用性が高いと思う。

あと、本来ならbuildとdeployを分けたいところなんだけど、deployを定義せずにbuildですべてを済ませてしまっているのは、buildとdeploy両方でrakeコマンドを使いたかったからだ。
その場合、その都度bundle installしないとダメなので、時間短縮の為一回でまとめしまうことにした。
ま、これもOctopress特有の問題な気がする。

まとめ

初めてWercker使ったけど、UIが分かりやすく使いやすい。
ただ、5分過ぎるとタイムオーバーとかっていってコケていたので、あんまり長いテストとかは任せられないかな。
まあ、有料プランとかだとまた違ってくるのかもしれないけど。
今の使い方でも記事が増えてあんまりビルドが遅くなるとダメだな。
あとたまにデプロイがコケるのはご愛嬌?
有料サービス化するなら、もっと安定感は欲しいところ。

また、自分はデプロイが終了したらSlackにメッセージが書き込まれるようにしたんだけど、これも下記のページを参考に簡単に実装できた。
Slack Notifications!

こういう時海外のサービスを使っていると便利だなと実感するな、いやー便利便利。

これでpushし忘れもなくなると思うので安心だ。
唯一の気がかりは、いつ有料になるかというところなので、時間を見つけて他のCIサービスも試してみたいと思う。

参考サイト
WordpressからGitHub pages+Octopressに移行した - fly1tkg blog
Wercker + Capistrano で自動デプロイ - milk1000cc’s blog