個人開発を支えるRailsにおけるCI環境
概要
一人で開発してると、とにかく自動でいろいろやりたいです。 - コードの静的解析 - テストコード実行 - セキュリティチェック - デプロイ など、手元の環境で毎回行うのはひどく時間がかかるし、めんどくさいの一言に尽きると思います。
自分なりに工夫して設定したCI環境(CircleCI使用)についてやっていることを見直しがてら書いてみます。
CircleCIを使ったCI環境
現在使っているCircleCIの設定をベースに書いていきます。
静的コード解析
使用gem:bbatsov/rubocop - Ruby - GitHub
コードを綺麗に保つことって大事ですよね。 ってことで、コードの静的解析ツールを入れます。
test: pre: - bundle exec rubocop
こんな感じに、testを行う前にやりましょう。 これはとても大事なことで、なぜならテストは失敗する可能性があり、無駄に時間が(相対的に)長いからです。 rubocopの設定は、各自行っていただければと。 実際これは結構厳しいので、ゆるめた方がいいと思います。
https://github.com/yamadagenki/mypage/blob/develop/.rubocop.yml
セキュリティチェック
みなさん、Railsアプリケーションのセキュリティってどうやってチェックしてますか? brakemanというgemはそこそこ紹介されていますが、実際にCIツールと連携して自動でチェックさせるとその効果がより発揮されます。
test: pre: - bundle exec brakeman -4 -A -w 1 -z
上記のように設定することで、 - warning level 1(-w 1)のマックスレベルでチェック - セキュリティ的になにか問題あったらそこでCI失敗させる(-z)
とでき、セキュリティ的にまずかったらCIの実行を失敗させることができます。
他にも、様々なオプションがあるので、プロジェクトに合わせて適宜設定すること。
テスト
使用gem:GitHub - rspec/rspec: RSpec meta-gem that depends on the other components
言わずと知れたテストコードのgemです。 実際CI環境では下記の用に設定すると、設定してやると動きます。
override: - bundle exec rspec --format RspecJunitFormatter --out $CIRCLE_TEST_REPORTS/rspec.xml --format progress: parallel: true files: - spec/**/*_spec.rb
ここで、非常に重要なのが、テストにこだわるならやはりカバレッジレートは気にしなくてはいけません。
https://github.com/colszowka/simplecovを導入し、spec/rails_helper.rbの冒頭に
require 'simplecov' SimpleCov.coverage_dir File.join(ENV['CIRCLE_ARTIFACTS'], 'coverage') if ENV['CIRCLE_ARTIFACTS'] SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([SimpleCov::Formatter::HTMLFormatter]) SimpleCov.start do add_filter '/vendor/' add_filter '/spec/' add_filter '/config/' add_filter '/db/' end
と追加することで https://circleci.com/*/#artifacts のようなディレクトリにどのファイルがどれくらいテストコードによって網羅されているのかを視覚化できます。
これをクリックすると こんなのができて、テストコードを各側のKPIとしても使うことができます。
Mutationテストなど、もっと複雑な指標を持ち出す方法に関してどなたか知っていたら教えていただければ。
デプロイ
ブランチプッシュしたら、正直デプロイするコマンド叩くのもだるいので、デプロイも自動化します。 下記のように書くと、masterブランチがgithubにpushされたら、自動でデプロイしてくれます。
deployment: production: branch: master commands: - bundle exec cap production deploy deploy:restart --trace
但し、 https://circleci.com/gh///edit#ssh のようなところから、サーバーにアクセスするための鍵を設定しなければいけません。
他にも使用する環境変数をCI環境に設定するための画面があり、適宜隠蔽したい情報を環境変数に埋め込むことをおすすめします。
※もともとCircleCIで定義されている環境変数に関しては CircleCI 上で、最初から定義されている環境変数について | Carpe Diemを参照してください。
なお、ブランチによっては、テストとかすっ飛ばしてデプロイだけして欲しかったりします。 そんな時は、CircleCIでは個別に設定できないので spec/rails_helper.rbで
exit if ENV['CIRCLE_BRANCH'] == 'sandbox'
のように冒頭に一行追加しましょう。 rspec側でテストをスキップするのです。
最後に
個人開発していると、本当にいろいろとだるいので、なるべく寝てる間にいろいろと終わってて欲しいです。
怠惰はプログラマとしての最高の美徳だというので、プログラマとしては怠惰になり、 ダーツプレイヤーとしては地道に努力を惜しまず生きていこうと思います。
他にもなにか便利な使い方があったら知りたいです。