megayaのブログ

おもしろいと思ったことを書きます。デイリーポータルZでも記事を書いてます。

自己学習のためにRailsとDockerでdevops環境を作った

環境を前置き


(※ こちらは1年ほど前に書いた記事を再編集してまとめております)

 

会社でエンジニアをやっているとどうしても勉強できる範囲が仕事のルーティングワークの中で終わってしまうことがある。「仕事で自分がやらないことしたいなー」と思いたったので、以下のことを意識してサイトを作ってみようと思った。

 

  • devopsを意識して開発環境を整える
  • テストやカバレッジなどの環境もしっかりと整備する
  • つかってない技術/これから使っていくであろう技術を取り入れる

 

細かく書くと主に以下のようなものを使っていた。

 

  • rails5
  • PostgreSQL
  • docker (ローカル環境ではdocker for macを使用)
  • circle ci
  • elasticsearch
  • swagger

 


PostgreSQLにした理由は、業務で使ったことがなかったから。現状だとMysql一択だったので、他のDBも触っておこうと思った。(小規模だとどのDB使っても同じだと思いますが)



newstopics.jp

 

最近ヨッピーさんが作ったRSSサイトのようなものを作っていた。だけど結局運用と改修がめんどくさくなってやめた。「新しい技術使うぞー!!」が目的だったので、少し形になってデプロイした瞬間にやる気がなくなってしまった。本当は運用も含めて続けていかないと技術にならないと思うから自分でもダメだなーとは思う。



どういった構成でやっていたか

 

f:id:megaya0403:20171211183916p:plain

 

 

DevOps風の環境を作りたかったので上記のようにした。デプロイやRailsのテスト環境整えるのにとにかく時間がかかって、ほとんどコード書いた記憶がない。

 

サーバはAwsに使用しようかと思ったのだけど、アクセス数もどうせないだろうし思ってVPSにすることにした。その中でConohaを選んだ。Conohaは中身がopenstackなのでスケールを考慮して選択した。あとこのはちゃんが可愛いから。今だったら使ったことないからAmazon Lightsailとか使うかもしれない。

 

環境をきちんと作ろうと思った理由

 

「cookpadの開発環境は〜」などの記事をたまに読むことがあったのだけど、「へー、いつかやりたいなー」と自分で思うだけで、なかなか業務に組み込むことが出来なかったので、自分のサイト作りで実現しようと思ったのがやろうと思った。

 

前置きは置いておいて、それぞれの使った所感などを書いていこうと思う。

 

docker

dockerがmacでそのまま使用できるのはものすごい便利。docker nativeがでたときに「dockerめっちゃ簡単だな〜」と感動した。そのときまではvagrant+ansibleなどでローカル環境を立てていたのだけど、色んな意味でローカルを立てるには重かったので移行できてよかった。

dokcerで立てたのは以下の4コンテナ。

  • Ruby/Rails
  • PostgreSQL
  • Busybox
  • Elasticsearch


Busyboxは標準UNIXコマンドの主要コマンドをまとめて1つの実行ファイル化したツールで、組み込みLinuxなどによく使われるそうだ。Dockerのコンテナ自体がホストのカーネルを使う仕様なので、Busyboxを使用すると超軽量なコンテナが作れる。

なので、データベースなどのデータを置いておくようなコンテナには向いている。だからBusyboxはPostgreSQLのData Volumeに使用している。

 

また今回はdocker-composeを使用している。というより、素のDockerのコマンド長すぎるので、長期で運用していくんだったら、dokcer-composeは必須だと思う。(多分)


 

RailsとDockerでdevops環境つくったときのメモ

 

 

一つ目がRails用のDockerファイルで、2つ目がdokcer-compose.ymlの中身。

Dockerのコンテナはとにかく容量を小さくするのが良いと言われており、OSもなるべく軽いものを使用すべきだ。だから、今回はAlpineを使用している。これも内部的にはBusyboxが使用されている超軽量なLinuxディストリビューションだ。

 

PostgreSQLやElasticsearchなどは公式のイメージをそのまま利用している。Dockerはlinkでつなぐと、コンテナ同士で簡単に接続できるから、直感的で簡単に設定が完了できて良い。

余談ですが、現状はDocker hubにイメージを預けているのですが、無料プランだとprivateが一つしか使えないので、保存するイメージが増えたときにどうしようか…というのが悩みどころ。自分でレジストリ立ててもいいのですが、それだったらお金払ってECSとかにした方が良い気もする。

 

CI(継続的インテグレーション

 

f:id:megaya0403:20171215092455j:plain 

 

CIはCircleCiを使用した。色々と迷ったが、UIの見やすさやgithubのprivateリポジトリが使える部分などを含めて、無料で一番使いやすそうだなと思ったから。

 

 

f:id:megaya0403:20171215092558j:plain

 

 

他のCIツールをきちんと触ったことがないので分からないが、CircleCIを触っていて便利だと思ったのが、テストしているサーバにsshログインできるところだ。ビルドに失敗して「え?ローカルだと成功してるんだけど…」ってときにsshして原因を特定出来るのはブラックボックスにならずに済むのでありがたい。

 

CircleCiが1.x系のときのDokcerとの連携

 

circle.ymlの設定は上記のようになっている。1年くらいまえだとCircle CIが最新のDockerに対応出来ていなくて、自力で色々と設定を追加する必要があった。

 

circleci.com

 
CircleCI 1.x系だとテストなどをoverridesする必要があったが、2.0からは最新のDockerに対応するみたいなので、上記のように設定をゴリゴリと書かなくてもよくなったみたいだ。


1.0ではCircleCi内のDockerのバージョンが古いので、Docker execなどが使えなかった。なのでcircle.ymlを少し書いて、最新のものを取得する必要があった。(CircleCiが対応していたDockerは1.10が最新だった)

 

あとcircle.ymlにはテストやDBの作成などもオーバライドして、自分の環境に合わせている。Rspecの他にRubocopも回すようにして、コードをキレイに保つように心がけた。(結局運用しなかったので意味はなかったが)

 

 


デプロイ

 

f:id:megaya0403:20171215095618p:plain

(最終的な構成は上記のようにした)

 

githubのmasterにpushされたときにCircleCiでテストを行い、デプロイするようにした。

1. circle ci上でdockerをbuild
2. docker hubにpush
3. 本番サーバでpull
4. スクリプトを流してassetsを作成したりmigrateしたり

 

本番サーバへのログインはCircleCiに秘密鍵を置いてやっているが、これが良い方法かはわからない。というよりか、他に方法がわからなくて苦肉の策でそうした。

Dockerのデプロイ周りが未だにあんまりわかっていない。特にRailsのasetts周りがデプロイ時のみ上手くいかなくて最終的に手動でコマンド打ってコンパイルしてた。勉強不足。

 

 

ここから少しRailsの話し

 

使用しているgem

 

 

RailsとDockerでdevops環境を作ってみたときのGem




テストやカバレッジもきちんと整えるのが今回の一つのテーマだったので、色々と導入して使っている。コードのリファクタリングをrubocop -aで自動で直してくれるので楽で良い。基本的にはcookpadのコード規約を参考にした。

 

github.com

 

あとはsimplecabでテストのカバレッジをだしたり、metric_fuを使用して分析も行うようにした。どちらもrails_helper.rbに設定を足すだけで使えるのでシンプルだ。

 

simplecovとmetric_fuの設定



simplecovはRspecを実行するとcoverage/rcov/index.htmlにファイルが作成され、テストのカバレッジが見られるようになる。metric_fuは`rake metrics:all`でコマンドを実行するとtmp/metric_fu/output/index.htmlにファイルが作成されるようになっている。

 

API

APIはgrapeでコードを書いて、swaggerでドキュメントを整備するようにした。grape-swagger-railsを使用すると、swagger uiが楽に導入できるのでおすすめ。

 

mount GrapeSwaggerRails::Engine => '/swagger'のようにrouteにマウントの設定を書く以外はほぼ設定がないので、ものすごく楽だ。

 

設計関連

trailblazer系のgemをいくつか使ってみた。trailblazerはRailsでビジネスロジックを書くのが楽になるGemだ。


gem 'cells'
gem 'cells-rails'
gem 'cells-slim'
gem 'reform'
gem 'reform-rails'

 

trailblazerはそれぞれ部分的にgemを使用することができ、reformでフォーム層作って、cellsで複雑になりやすいrenderやhelperなどを管理するなど、ビジネスロジックを導入したい箇所のみに適用することもできる。

 

やってみて

かいつまんで思い出しながら書いているだけなので、ただの感想になってしまった…本当はもっとTIPSみたいなの書きたかった。

これをやってdevopsの一端を勉強できてよかったなーとは思う。業務でつかうレベルには達してないと思うけど、やはり詰まるところでは詰まるので、こういった検証レベルの実行は大切だなと思った。

 

1年前にやったことなので、今とは環境はガラリと変わっているかもしれない。久しぶりに何か作りたくなってきたので、何かやろうかなと思う。

 

 

 

ブログ以外にもTwitterもやっています

 

 

 

その他のおすすめ記事

 

 

 

www.megaya.net

 

www.megaya.net

www.megaya.net

www.megaya.net