概要
railsアプリのテストとECRへのプッシュが目的。
サンプルコード
circle.yml
machine:
services:
- docker
timezone:
Asia/Tokyo
environment:
CIRCLE_ENV: test
dependencies:
pre:
- if [[ -e ~/docker/ruby.tar ]]; then docker load --input ~/docker/ruby.tar; fi
- if [[ -e ~/docker/awesome-app-$CIRCLE_BRANCH.tar ]]; then docker load --input ~/docker/awesome-app-$CIRCLE_BRANCH.tar; fi
- bundle --path=vendor/bundle
- bundle exec rake assets:precompile
cache_directories:
- "~/docker"
- "vendor/bundle"
- "public/assets"
override:
- docker info
- docker build -t $DOCKER_REPOS/awesome-app:$CIRCLE_BRANCH .
- mkdir -p ~/docker
- docker save -o ~/docker/ruby.tar ruby
- docker save -o ~/docker/awesome-app-$CIRCLE_BRANCH.tar $DOCKER_REPOS/awesome-app:$CIRCLE_BRANCH
database:
override:
- bundle exec rake db:create db:schema:load db:migrate rake db:seed_fu
test:
override:
- bundle exec rubocop
- bundle exec rspec
deployment:
hub:
branch: /^(master|staging)$/
commands:
- $(aws ecr get-login --region $AWS_REGION)
- docker push $DOCKER_REPOS/awesome-app:$CIRCLE_BRANCH
dependencies
CircleCIだと、dockerイメージのキャッシュがされないので、
docker save & loadするっていうハックが一般的みたい。
~/docker
に逃してるが、将来docker imageがキャッシュされたら再検討。
bundleも忘れずにキャッシュされるようにしておく。
deployment
deploymentのセクションに関して、
master、stagingブランチの時だけECRにpushしたいという意図がある。
CIRCLE_BRANCH
には、pushされたブランチ名が入るので、正規表現で切り分ける。
ENV
事前にCircleCI側にENVを設定する必要あり。
画面遷移: Setting->BUILD SETTINGS->Environment Variables
- AWS_ACCESS_KEY_ID
- AWS_ACCOUNT_ID
- AWS_REGION
- AWS_SECRET_ACCESS_KEY
- DOCKER_REPOS
- SECRET_KEY_BASE