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に追加します。そのために travis
gemをインストールします。 travis
gemをが環境変数の暗号化から.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