3
1

More than 5 years have passed since last update.

CircleCIでRailsアプリをAmazon ECRにpushする

Last updated at Posted at 2017-01-20

概要

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
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1