簡単な表記揺れチェッカーをCIに組み込んで、レビュー効率を改善した話

はじめに

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を覗いてみてください!よろしくお願いします!!

oheyago.jp