#はじめに
この記事は以前、私が書いた以下記事の改良版となります。
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がそれを検知して、自動的にテストを実行してくれます。
今回作成したシェルは以下の通りです。
まずこちらをローカルに落としてきて、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側で自動テストを実行してくれます。
#シェルの内容
###CircleCIの自動テストをする上で変更した点
前回記事と同様の部分が多いですが、自動テストをする上で変更した点を重点的に記載していきたいと思います。
主な変更点としては以下の通りです。
- CircleCI用のコンフィグファイルを作成
- rspecを導入
- webpacker のコンフィグファイルを編集
- public/packs-test への考慮
###フォルダ構成
ホスト側のファルダ構成もほぼ変わっておりません。
CircleCI用フォルダが追加された程度です。
sample
├── docker
│ ├── app
│ │ └── Dockerfile
│ └── web
│ └── Dockerfile
├── docker-compose.yml
├── src
└── .circleci
└── config.yml
###CircleCI用のコンフィグファイルを作成
CircleCI用コンフィグファイルを作成している部分が以下です。
# .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のコンフィグファイルを編集します。
# 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に入門したので分かりやすくまとめてみた