動機
herokuへのデプロイは、gitを利用します。
git push heroku master
これは開発者の手に馴染んだツールで、開発者がアプリケーションコードを開発する自然な流れの中でデプロイ操作を可能にすることが重要だと考えているからです。
今日、CIツールとの連携でリポジトリにpushすると、単体テストパスし、デプロイが走るようにすることも可能ですが、今回は
1. 最新をローカルへpull
2. heroku環境へpush
3. rake db:migrate
ができればよいので、シェルスクリプトの範囲で解決できそうです。
また、私はステージング環境、本番環境を持っているので引数で指定してそれぞれの環境へデプロイするものを作りました。
仕様
- シェルスクリプトはRailsのアプリケーションルートに'deploy.sh' というファイル名で配置する
- 引数でstaging, productionという文字列を渡してそれぞれのデプロイを行うようにする
- ステージング環境のリポジトリ名は 'staging'にする。developブランチをデプロイする
- 本番環境のリポジトリ名は'production'にする。masterブランチをデプロイする
- herokuのアプリケーション名はここでは便宜的に testapp-staging, testapp-production
- かならずデプロイ後にマイグレーションを実行する
- デプロイ終わったら、git checkout - で直前のブランチに戻る
ソース
#!/bin/bash
# 前提 staging環境のリモートリポイジトリ名 -> staging
# 前提 production環境のリモートリポイジトリ名 -> production
env=$1
if [ $env = "staging" ]; then
echo "deploy to staging"
git checkout develop
git pull origin develop
git push $env develop:master
heroku run rake db:migrate --app testapp-staging
git checkout -
fi
if [ $env = "production" ]; then
echo "deploy to production"
git checkout master
git pull origin master
git push $env master
heroku run rake db:migrate --app testapp-production
git checkout -
fi
実行
bash deploy.sh staging
bash deploy.sh prodution