Travis CI からHerokuへのデプロイを自動化してみた

2013.09.07 追記: keys:clear -> keys:remove に修正

Travis CI でテストを自動化したなら、デプロイも自動化したい。

という訳で、自動化してみた。

参考にしたページ

Deploying to Heroku with Travis CI | Neil Middleton http://www.neilmiddleton.com/deploying-to-heroku-from-travis-ci/

設定方法

まず、HerokuのAPI KEYを環境変数に登録する必要があります。

環境変数の設定
$ heroku auth:token
<your_heroku_key>
$ gem install travis
$ travis encrypt --add HEROKU_API_KEY=<your_heroku_key>

このコマンドで env.global.secure の所が追加されます。

.travis.ymlの設定
language: ruby
rvm:
  - 2.0.0
branches:
  only:
    - master
    - develop
    - feature/travis
bundler_args: --without development --path vendor/bundle
script: "bundle exec rake db:migrate spec"
notifications:
  email: false
env:
  global:
    secure: |-
      WmjPp2Xk3Btg2YB4DaaDSCkkdMdEpThGJVi6Dc4M+W7K2gwHOD7/o4zw/5TD
      fSryEVPfDaXGmzrAOkI4zhsTz/EWp52CLHT/djLcn2d2azuhw6dy0w6lFYMK
      m9CwWnjP8ErDXG5TCd2omPXLEJVUCPpPUu7O7CLfnQro1X8OF8c=
after_success:
  - script/deploy.sh

個人的にbranchesにfeature/travisを入れておくとdevelopにpushしなくても.travis.ymlの設定が確認できるのでオススメ。

デプロイのスクリプトの例
#!/bin/sh
if [ "$TRAVIS_PULL_REQUEST" != "false" ]
then
  echo "This is a pull request. No deployment will be done."
  exit 0
fi
if [ "$TRAVIS_BRANCH" = "master" ]
then
  wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh
  git remote add heroku git@heroku.com:nullpohub.git
  echo "Host heroku.com" >> ~/.ssh/config
  echo "   StrictHostKeyChecking no" >> ~/.ssh/config
  echo "   CheckHostIP no" >> ~/.ssh/config
  echo "   UserKnownHostsFile=/dev/null" >> ~/.ssh/config
  yes | heroku keys:add
  yes | git push heroku master
  heroku run rake db:migrate
  heroku restart
  heroku keys:remove `whoami`@`hostname`
fi

私はdevelopブランチをherokuで動作確認するために

git push heroku develop:master

としています。

あと、毎回 heroku keys:clear をしているため、この自動デプロイが動き始めると自分のローカルPCからデプロイしようとするとエラーになるので、そこだけ注意。