はじめに
OHEYAGOの開発を行っている田渕です。
早速ですが本題に入ると、Webサービスを開発する上で、表記揺れが問題になることはよくありますね。
レビューで毎回チェックするのも面倒くさい大変なので、機械的にチェックしてしまいたいと思いました。
最低限の機能を自分で簡単に実装して、1時間もかからずにCIにまで組み込んだので、共有します。
要件
- 特定の単語がコミットされた場合に、CIが落ちるようにしたい
- 可能な限り簡単に組み込めて、不要になったら簡単に捨ててしまえる状態にしたい
- dangerというgemで同様のことができそうでしたが、導入コストや設定コストがやや大きいと感じました
例
主にマーケティングチームやPRチームからの要望で、以下のような文言ルールがあります。
- 「物件」ではなく「お部屋」を使う
- 「申込」「申込み」ではなく「申し込み」を使う
- 「OHEYA GO」ではなく「OHEYAGO」を使う(←よく間違われます!!!)
- 「Renosy」ではなく「RENOSY」を使う(←これもよく間違われます!!!!!)
実装
以下のようなRubyのスクリプトを実装しました。(一部省略しています)
# 現在のdevelopブランチの値を設定する。意図せず違反したときにはCIが落ちる。 MAX_ERROR_COUNT = 9 # コメントアウトの中にdisable wording checker in this fileと書いてあるファイルは検査しない COMMENT_FOR_DISABLING = /disable wording checker in this file/.freeze RULES = [ { regexp: /物件/, text: 'お部屋' }, { regexp: /OHEYA GO/, text: 'OHEYAGO' }, { regexp: /申込/, text: '申し込み' } ].freeze # 違反があった場合にtrueが返る def wording_check(file, line) RULES.any? do |rule| match_data = line.match(rule[:regexp]) if match_data puts <<~VIOLATION #{file.path}:#{file.lineno} 「#{match_data[0]}」ではなく「#{rule[:text]}」を使う #{line} VIOLATION true end end end error_count = 0 Dir.glob('app/**/*.{ts,tsx,rb,erb,slim}').each do |path| next if File.directory?(path) File.open(path) do |file| file.each_line do |line| break if line.match(COMMENT_FOR_DISABLING) (error_count += 1) if wording_check(file, line) end end end puts "#{error_count}件の文言ルール違反がありました" exit 1 if error_count > MAX_ERROR_COUNT
このスクリプトを実行すると、以下のように表示されます
「物件」ではなく「お部屋」を使ってください path/to/file.tsx:98 セルフ内見では、物件に取り付けられたスマートロックを、みなさまがお手持ちのスマートフォンから解錠して内見していただきます。 1件の文言ルール違反がありました
チェックが不要なファイルにはコメントアウトを追加します。
また、後述するような例があり、errorを0件にはできないため、MAX_ERROR_COUNTを用いてerrorが増えるのを検知しています。
CIへの追加
OHEYAGOチームでは、CircleCIを使っています。
CI中にこのスクリプトを実行すればよいだけなので、以下のように.circleci/config.ymlに追加しました。
commands: wording-check: steps: - run: name: Wording check command: ruby bin/wording_checker.rb jobs: yourworkflow: steps: - wording-check
課題
正規表現でマッチングするだけなので、以下のような例を検出してしまいます。
- 申込受付くん: 固有名詞(イタンジのサービス)なので、「申し込み」にはできない
- 「おとり物件」: 「おとりお部屋」にはできない
もうちょっと頑張って、ルールを細かく実装することも考えましたが、現状では労力に見合わないと考えました。
この状態でほとんどが正しく検知できており、当初のレビュー効率の改善という点では、効果が十分に出ています。
おわりに
OHEYAGOチームでは、こういった細かい工夫によって、可能な限り品質の高いサービスを開発しようとしています。
興味のある方は、是非OHEYAGOを覗いてみてください!よろしくお願いします!!