0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rails6の環境構築を自動でしてくれるシェルスクリプトを作ってみた (2) ~CircleCI導入編~

Last updated at Posted at 2020-06-06

#はじめに

この記事は以前、私が書いた以下記事の改良版となります。

Rails6の環境構築を自動でしてくれるシェルスクリプトを作ってみた (1) ~ローカル起動編~

前回は開発環境構築まででしたが、今回はCircleCIによる自動テストまでをできるようにしました。

私の環境は以下の通りです。

OS 環境
Windows 10 Home 64bit Ubuntu 18.04(WSL2)

#構築する環境

前回から重複する部分が多いですが、構築する環境は以下の通りです。
GitHubにプッシュ → CircleCIで自動テストができるようになることをゴールとします。

項目    使用したもの バージョン
言語 ruby 2.6.6
Webフレームワーク rails 6.0.2
テストフレームワーク rspec 3.9
データベース  MySQL 8.0
Webサーバ Nginx 1.17.10
APサーバ puma 4.3.5

コンテナ構成は以下の通りです。

appコンテナ
ruby
rails
puma
dbコンテナ
MySQL
webコンテナ
Nginx

#できること

GitHubへコードをpushしたら、CircleCIがそれを検知して、自動的にテストを実行してくれます。

circleci.jpg

今回作成したシェルは以下の通りです。

今回作成したシェルスクリプト

まずこちらをローカルに落としてきて、sudoで実行します。
実行権限が付与されていない場合はchmodで実行権限を付与してあげてください。

10分ほど待って、以下状態になったら実行完了です。

app_1  | * Listening on tcp://0.0.0.0:3000
app_1  | * Listening on unix:///myapp/tmp/sockets/puma.sock
app_1  | Use Ctrl-C to stop

↑↑↑↑↑↑↑↑↑前回はここまで↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

自動テストをするために CircleCI ⇔ GitHub のプロジェクト連携が必要です。
CircleCIのアカウントからポチポチすれば簡単に連携できます。

GitHub へ pushするとCIrcleCI側で自動テストを実行してくれます。

2020-06-06 (1).png

#シェルの内容

###CircleCIの自動テストをする上で変更した点
前回記事と同様の部分が多いですが、自動テストをする上で変更した点を重点的に記載していきたいと思います。

主な変更点としては以下の通りです。

  • CircleCI用のコンフィグファイルを作成
  • rspecを導入
  • webpacker のコンフィグファイルを編集
  • public/packs-test への考慮

###フォルダ構成
ホスト側のファルダ構成もほぼ変わっておりません。
CircleCI用フォルダが追加された程度です。

sample
├── docker
│   ├── app
│   │   └── Dockerfile
│   └── web
│       └── Dockerfile
├── docker-compose.yml
├── src
└── .circleci
    └── config.yml

###CircleCI用のコンフィグファイルを作成

CircleCI用コンフィグファイルを作成している部分が以下です。

docker_rails_template.sh
# .circleci/config.yml 作成
echo "make .circleci/config.yml"
mkdir -p .circleci
cat << EOF > .circleci/config.yml
version: 2
jobs:
  test:
    machine:
      image: circleci/classic:edge
    working_directory: ~/repo
    steps:
      - checkout
      - run:
          name: Install Docker Compose
          command: |
            curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` > ~/docker-compose
            chmod +x ~/docker-compose
            sudo mv ~/docker-compose /usr/local/bin/docker-compose
      - run:
          name: docker-compose up --build -d
          command: docker-compose up --build -d
      - run: sleep 30
      - run:
          name: docker-compose run app rails db:create
          command: docker-compose run app rails db:create
      - run:
          name: docker-compose run app rails db:migrate
          command: docker-compose run app rails db:migrate
      - run:
          name: docker-compose run app bundle exec rspec spec
          command: docker-compose run app bundle exec rspec spec
      - run:
          name: docker-compose down
          command: docker-compose down
 
workflows:
  version: 2
  workflows:
    jobs:
      - test
EOF

CircleCIでは、.circleci/config.ymlを読み込んでその通りに処理を実行しています。

今回はCircleCI環境上でdocker-composeをインストールして、それを元にテストを実行していく形を取っています。

これにより、開発環境 ⇔ テスト環境の差異ほほとんどなくなるので
「開発環境では問題なかったのにテスト環境ではうまく動かない~~~」
といったことが減るのではないかなと思います。

設定ファイル上でやっていることは、

イメージビルド → コンテナ立ち上げ → テスト用データベース作成 → 初回マイグレーション → テスト実行

といった形です。

ローカル環境でdocker-composeを操作するのと変わらない形でコマンド実行できるので、イメージしやすいかと思います。

###rspecを導入

今回、テストフレームワークとしてrspecを導入します。
railsではminitestが初期導入されていますが、rspecの方が一般的に使われているそうなので、こちらを採用しました。
また、テストデータを作ってくれるFactoryBotも導入しています。

rspecを導入するためにGemfileに追加します。

追加行

  • gem "rspec-rails"
  • gem "factory_bot_rails"
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem "rspec-rails"
  gem "factory_bot_rails"
end

###webpacker のコンフィグファイル編集

以下処理で、webpackerのコンフィグファイルを編集します。

docker_rails_template.sh
# webpacker.yml を編集
echo "edit webpacker.yml"
cat src/config/webpacker.yml |
    sed 's/check_yarn_integrity: true/check_yarn_integrity: false/' > __tmpfile__
cat __tmpfile__ > src/config/webpacker.yml
rm __tmpfile__

ここでは、check_yarn_integrityの設定を無効にしています。

check_yarn_integrityというのは、railsを起動する時などにyarnが最新バージョンかどうかをチェックしてくれる機能を有効 or 無効にする設定です。

これが有効になっていると、CircleCI上でyarnのバージョンチェックが入り、最新であるのにもかかわらずエラーを吐かれてしまいます。

そのため、この設定を無効にする必要があります。

###public/packs-test への考慮

public/packs-testはWebpackerで生成するアセットの配置場所らしいのですが、こちらがないとCircleCI上でテストが実行できません。

そのため、GitHubへのpush対象として含める必要があります。

シェルスクリプト上で以下処理を実行していますが、これをするとsrc配下に.gitignoreというファイルが自動生成されます。

docker-compose run app rails new . --force --database=mysql --bundle-skip

.gitignoreはその名の通りgit管理しない対象を記載するものですが、デフォルトだとpublic/packs-testが記載されているので、これを削除する必要があります。

また、別方法としてCircleCI上で以下コマンドを実行し、プリコンパイルすればpublic/packs-testが生成されるので、こちらの手段もありだと思います。

rails assets:precompile RAILS_ENV=test

以上になりますが、何かの参考にしていただければ幸いです。

参考記事

以下記事を参考にさせて頂きました。ありがとうございましたm(_ _)m

丁寧すぎるDocker-composeによるrails5 + MySQL on Dockerの環境構築(Docker for Mac)

いまさらだけどCircleCIに入門したので分かりやすくまとめてみた

CircleCIでdocker-composeは最強

RailsアプリへのRspecとFactory_botの導入手順

使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?