Docker, CircleCI, AWSを使って環境構築していく Day1
はじめに
昨今、Webアプリケーションの開発はDockerコンテナと切っても切り離せなく
なっているみたいなのでここら辺の技術習得を目指して学習したことや、
生じたエラーをまとめていければと思います。
使う教材は技術書典で手に入れたこちらです。
(栃木から行った甲斐があった...!!!)

最終的な到達点
- masterへpush
- CircleCIでCI開始
- CIでイメージをビルド
- イメージをECRへpush
- ECSのタスク定義を更新
- CIでmigration
実行するデプロイ手順はこんな感じになるみたいです。
一通り登場するサービスを使ってシステムを構築してから
個々のサービスの理解度を上げていければと思います。
まぁ使ってみないと分からないこともあるかと思うので
こんな感じの勉強法でいいはず!
Day1 CIの設定
$ rails new circleci $ bundle exec rails db:create $ bundle exec rails db:migrate
アプリの名前はこれで行きます。
次にcircleciの設定ファイルを追加。
$ mkdir .circleci $ touch .circleci/config.yml
設定はこんな感じ。 CircleCIの設定をコピーしただけです。
# Ruby CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-ruby/ for more details
#
version: 2
jobs:
build:
docker:
- image: circleci/ruby:2.5.3-node-browsers
working_directory: ~/CircleCI
steps:
- checkout
- restore_cache:
keys:
- v1-dependencies-{{ checksum "Gemfile.lock" }}
- v1-dependencies-
- run:
name: install dependencies
command: |
bundle install --jobs=4 --retry=3 --path vendor/bundle
- save_cache:
paths:
- ./vendor/bundle
key: v1-dependencies-{{ checksum "Gemfile.lock" }}
# Database setup
- run: bundle exec rake db:create
- run: bundle exec rake db:schema:load
# run tests!
- run:
name: run tests
command: |
mkdir /tmp/test-results
TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | \
circleci tests split --split-by=timings)"
bundle exec rspec \
--format progress \
--format RspecJunitFormatter \
--out /tmp/test-results/rspec.xml \
--format progress \
$TEST_FILES
# collect reports
- store_test_results:
path: /tmp/test-results
- store_artifacts:
path: /tmp/test-results
destination: test-results
これだけで毎回ブランチをpushすると自動でCIが実行されます。
早速pushしていきます!初CIです。
するとこんなビルドエラーが。。。
#!/bin/bash -eo pipefail bundle install --jobs=4 --retry=3 --path vendor/bundle You must use Bundler 2 or greater with this lockfile. Exited with code 20
install dependencies のところが原因で失敗してますね。
Bundlerのversionが原因みたいなので、修正していきます。
まずGemfile.lockを削除
違うversionのbundlerをインストール
$ gem install bundler -v 1.17.3
- 再度gemを入れ直す
$ bundler _1.17.3_ install
生成されたGemfile.lockを確認して
BUNDLED WITH 1.17.3 となっていればOKです。
これで行ける!と思い再度push!
するとお次はこちらのエラーが。
#!/bin/bash -eo pipefail mkdir /tmp/test-results TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | \ circleci tests split --split-by=timings)" bundle exec rspec \ --format progress \ --format RspecJunitFormatter \ --out /tmp/test-results/rspec.xml \ --format progress \ $TEST_FILES Requested historical based timing, but they are not present. Falling back to name based sorting bundler: failed to load command: rspec (/home/circleci/CircleCI/vendor/bundle/ruby/2.5.0/bin/rspec) LoadError: cannot load such file -- rspec_junit_formatter /home/circleci/CircleCI/vendor/bundle/ruby/2.5.0/gems/rspec-core-3.8.0/lib/rspec/core/formatters.rb:231:in `require' /home/circleci/CircleCI/vendor/bundle/ruby/2.5.0/gems/rspec-core-3.8.0/lib/rspec/core/formatters.rb:231:in `rescue in custom_formatter' /home/circleci/CircleCI/vendor/bundle/ruby/2.5.0/gems/rspec-core-3.8.0/lib/rspec/core/formatters.rb:228:in `custom_formatter' /home/circleci/CircleCI/vendor/bundle/ruby/2.5.0/gems/rspec-core-3.8.0/lib/rspec/core/formatters.rb:181:in `find_formatter' /home/circleci/CircleCI/vendor/bundle/ruby/2.5.0/gems/rspec-core-3.8.0/lib/rspec/core/formatters.rb:150:in `add' /home/circleci/CircleCI/vendor/bundle/ruby/2.5.0/gems/rspec-core-3.8.0/lib/rspec/core/configuration.rb:942:in `add_formatter' /home/circleci/CircleCI/vendor/bundle/ruby/2.5.0/gems/rspec-core-3.8.0/lib/rspec/core/configuration_options.rb:118:in `block in load_formatters_into' /home/circleci/CircleCI/vendor/bundle/ruby/2.5.0/gems/rspec-core-3.8.0/lib/rspec/core/configuration_options.rb:118:in `each' /home/circleci/CircleCI/vendor/bundle/ruby/2.5.0/gems/rspec-core-3.8.0/lib/rspec/core/configuration_options.rb:118:in `load_formatters_into' /home/circleci/CircleCI/vendor/bundle/ruby/2.5.0/gems/rspec-core-3.8.0/lib/rspec/core/configuration_options.rb:24:in `configure' /home/circleci/CircleCI/vendor/bundle/ruby/2.5.0/gems/rspec-core-3.8.0/lib/rspec/core/runner.rb:127:in `configure' /home/circleci/CircleCI/vendor/bundle/ruby/2.5.0/gems/rspec-core-3.8.0/lib/rspec/core/runner.rb:97:in `setup' /home/circleci/CircleCI/vendor/bundle/ruby/2.5.0/gems/rspec-core-3.8.0/lib/rspec/core/runner.rb:86:in `run' /home/circleci/CircleCI/vendor/bundle/ruby/2.5.0/gems/rspec-core-3.8.0/lib/rspec/core/runner.rb:71:in `run' /home/circleci/CircleCI/vendor/bundle/ruby/2.5.0/gems/rspec-core-3.8.0/lib/rspec/core/runner.rb:45:in `invoke' /home/circleci/CircleCI/vendor/bundle/ruby/2.5.0/gems/rspec-core-3.8.0/exe/rspec:4:in `<top (required)>' /home/circleci/CircleCI/vendor/bundle/ruby/2.5.0/bin/rspec:23:in `load' /home/circleci/CircleCI/vendor/bundle/ruby/2.5.0/bin/rspec:23:in `<top (required)>' Exited with code 1
これはほぼ答えが書いてあるのすぐに解決出来ました。
LoadError: cannot load such file -- rspec_junit_formatter
これですね〜
調べてみると rspec-junit-formatter というgemが必要みたいなのでインストールして行きます。
gem 'rspec_junit_formatter'
とGemfileに記載してインストール。 これで再度push。

上手く行ってますね!
今日はここまで! 明日はDockerイメージのビルドをやって行きます!
最後に
CIrcleCIを使うのが初めてだったのでとても楽しかったです。
やっぱり新しい技術を触るのは楽しいですしワクワクします。
今日の疑問点
ビルドに失敗してエラーが出るじゃないですか。
んで、それ直すじゃないですか。 pushするじゃないですか。
めんどくさくないですか???
それとも激強エンジニアは一発で成功するのでしょうか。
やはり公式のドキュメントを読み込まないとダメですね〜
英語だからって逃げてばっかじゃダメか。