毎日コード書く宣言

勉強したことを書いて行きます

Docker, CircleCI, AWSを使って環境構築していく Day1

はじめに

昨今、Webアプリケーションの開発はDockerコンテナと切っても切り離せなく

なっているみたいなのでここら辺の技術習得を目指して学習したことや、

生じたエラーをまとめていければと思います。

使う教材は技術書典で手に入れたこちらです。

(栃木から行った甲斐があった...!!!)

f:id:tatsuya_oide:20190512161947j:plain

最終的な到達点

  1. masterへpush
  2. CircleCIでCI開始
  3. CIでイメージをビルド
  4. イメージをECRへpush
  5. ECSのタスク定義を更新
  6. 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。

circleci success

上手く行ってますね!

今日はここまで! 明日はDockerイメージのビルドをやって行きます!

最後に

CIrcleCIを使うのが初めてだったのでとても楽しかったです。

やっぱり新しい技術を触るのは楽しいですしワクワクします。

今日の疑問点

ビルドに失敗してエラーが出るじゃないですか。

んで、それ直すじゃないですか。 pushするじゃないですか。

めんどくさくないですか???

それとも激強エンジニアは一発で成功するのでしょうか。

やはり公式のドキュメントを読み込まないとダメですね〜

英語だからって逃げてばっかじゃダメか。