This page looks best with JavaScript enabled
⚠️

『パーフェクトRuby on Rails』9章

 ·   ·  ☕ 3 分で読めます
✏️

9章

コード品質を上げる

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

guard
ローカルで自動テストを行う。

GitHub Actionsについていろいろ。Elasticsearchと連携したり。ちょっとよくわからなかった。

Gemの定期update

Dependabotを用いると自動でPRを作ってくれる。

1
2
3
4
5
6
7
8
9
version: 1
update_configs:
  - package_manager: "ruby:bundler"
    directory: "/"
    update_schedule: "weekly"
    allowed_updates:
      - match:
        update_type: "all"
        version_requirement_updates: "off"
  • PR上からCIの実行結果を確認
  • リリースノートを読んで差分を把握
  • アプリケーションで影響が出そうな機能の当たりをつけ、重要な差分や機能については事前に手動でテスト

静的解析

RuboCop

  • rubocop [ファイル名]
    • 静的解析する
  • rubocop -a
    • 自動修正する
    • 臨むコードに書き換えるとは限らないため、事前にファイルをcommitしておいて差分を確認すべし
    • すべての検出項目に対応しているわけではない
  • rubocops -l
    • Lint copsのみ実行する
    • このような一部のcopsのみ検査するオプションがある

cop
検査するさまざまなルール
詳しくはCops :: RuboCop Docs

コードの該当行に# rubocop:disabel [cop名]コメントを書くことで検査をスキップできる

ルール名 概要
Layout cops インデントやスペースの有無を検査します
Lint cops バグの可能性があるコードを指摘します
ruby -wのワーニング + 独自の静的解析検査
Metrics cops クラスの長さやメソッドの長さなど、コードの複雑さを測定します
Naming cops メソッド名や定数名など、名前に関する検査をします
Security cops 脆弱性につながる可能性がある問題など、セキュリティ観点での検査をします
Style cops コーディング規約に沿っているかを検査します

Railsで使う場合

rubocopの他にrubocop-performance, rubocop-rails(拡張Gem)を入れる。

Gitのコミット前フックを利用する

pre-commitフックでコミット前にRubocopの検査を実行できる。

1
2
#!/bin/sh
bundle exec rubocop

RuboCopを段階的に導入する

bundle exec rubocop --auto-gen-configを実行すると、.rubocop_todo.ymlが作成され、.rubocop.ymlinherit_from: .rubocop_todo.ymlという記述が追記される。
.rubocop_todo.ymlには、検出した項目についてそれを抑制する設定が書いてある。
このファイルがあるとrubocopコマンド実行時にこの設定も適用される。=これ以上検出されなくなる。

.rubocop_todo.ymlを読んで、抑制したままでいい項目は.rubocop.ymlに移行する。
全部移行したら、inherit_from: .rubocop_todo.ymlの記述と.rubocop_todo.ymlを削除する。

Brakeman

Railsアプリケーションの脆弱性を静的解析する。
bundle exec brakemanデフォルトでは検査しない項目もある。全て検査するためには-Aオプションを付ける。軽微な問題まで含める場合は-wlオプションを付ける。

カバレッジ測定

パフォーマンス測定(APM)

  • Skylight
    • シンプルにパフォーマンスを測定して可視化
  • New Relic
    • パフォーマンス測定の他に問題検知もする
  • rack-mini-profiler
    • Railsアプリのパフォーマンスを測定するGem。ローカルで動かせる

本書ではSkylightとrack-mini-profilerの導入について書いている。

Share on

END
END
@aiandrox

 
目次