ecrにdocker imageを上げるのを毎回手動でやるのは結構疲れます。ですのでtravis-ciを使って自動化しました。
.travis.ymlを作成する
まず、このgistをそのままコピーして.travis.ymlを作成しました。
awsの環境変数を追加する
ecrにdocker imageをpushするためには AWS_ACCESS_KEY_IDと AWS_SECRET_ACCESS_KEYが必要です。これをそのまま.travis.ymlに書くのはまずいので暗号化して.travis.ymlに追加します。そのために travisgemをインストールします。 travisgemをが環境変数の暗号化から.travis.ymlへの追加までうまくやってくれます。便利です。
$ gem install travis
$ travis encrypt AWS_ACCESS_KEY_ID=AKIxxxxx --add
$ travis encrypt AWS_SECRET_ACCESS_KEY=Apxxxxxxxxx --add
これで.travis.ymlに以下のように暗号化された環境変数が追加されました。
env:
  global:
    - secure: xxxxx
    - secure: xxxxx
参考: https://docs.travis-ci.com/user/encryption-keys/
masterにマージされた時だけビルドする
このままではfeatureブランチでもpushされると勝手にbuild&pushされてしまって問題なのでmasterブランチにマージされた時のみbuild&pushされるようにします。
travis-ciでは特定ブランチのみで.travis.ymlに書かれたスクリプトを動かすことができるのですが、これを使うと他のテストも走らなくなってしまいます(https://docs.travis-ci.com/user/customizing-the-build) 。これは問題なので別の手段をとります。
CIが走っているブランチは $TRAVIS_BRANCHという環境変数に格納されているのでこの値をチェックしてコマンドを実行するようなスクリプトを書きます。
# script/travis-docker-setup.sh
if [[ "$TRAVIS_BRANCH" == "master" ]]; then
  docker --version
  pip install --user awscli
  export PATH=$PATH:$HOME/.local/bin
  eval $(aws ecr get-login --region ap-northeast-1)
  docker build -t xxx -f Dockerfile.production .
  docker tag grow_turf:latest 12345.dkr.ecr.ap-northeast-1.amazonaws.com/xxx:latest
  docker push 12345.dkr.ecr.ap-northeast-1.amazonaws.com/xxx:latest
fi
そして.travis.ymlの after_successを以下のようにします。
# .travis.yml
acter_success:
  - ./script/travis-docker-setup.sh
そして最後にsettingsより Build branch updatesをオンにします。
これでmasterのみでdocker buildとdocker pushが走るようになります。
参考: http://stackoverflow.com/questions/34591587/travis-conditional-on-branch-after-success
これであとはslack連携なんかすればいい感じになります。
.travis.yml
最後に、できた.travis.ymlは以下のようになりました。(travis-docker-setup.shは上で書いたやつそのまんまです)
sudo: required
language: ruby
services:
- docker
install:
- echo "install nothing!"
script:
- rspec
after_success:
- "./script/docker-setup.sh"
env:
  global:
  - secure: longString
  - secure: longString