Ruby や Rails の Deprecation Warning を Slack に通知する

どうも @shutooike です!

インゲージには "内部品質の担保/向上" をミッションとしたQAチーム *1 があります。

今回は Ruby や Rails のバージョンアップ対応で大事な Deprecation Warning を Slack に通知するようにした話です。

こんな感じで Slack に飛んできます。何月何日の4:36なのかは秘密です。

実装

Ruby 編

Ruby 2.4 から提供されている Warning モジュールを使ってフックを書くことができます

以下のようなコードで Slack に通知するようにしました。

同じエラーを一定回数までしか通知しないようにしていたり、正規表現を使ってスキップする通知を設定できるようになっています。

module Warning
  SEEN = Hash.new(0)

  SKIP_PATTERN = Regexp.union(
    /\A\S+:\d+: warning: example message /,
  )

  def self.warn(msg)
    # 同じ警告は一定回数までは Slack に通知して、多すぎたら無視する。
    if SEEN[msg] < 5
      SEEN[msg] += 1
      super
      return if msg.match?(SKIP_PATTERN)
      SlackNotify.ruby_warning_log(msg) # Slack 通知処理
    end
  end
end

Rails 編

Rails の Deprecation Warning も上の warn メソッドの仕組みを使って通知しています。

ActiveSupport::Deprecation.behavior = -> (message, _callstack, _deprecation_horizon, _gem_name) do
  warn message
end


今回のコードはパートナーの方が提案・実装してくれました!感謝 🙏

おわりに

本当はテスト環境だけで Deprecation Warning を全てキャッチできたらカッコいいのですが、そうもいかないので併用しています。

実際に通知で助かったことが結構あるので重宝しています。



宣伝

QAチームは頼もしいメンバーと日々内部品質を担保/向上させています。興味ある人はカジュアル面談しましょう!

チームがどんなことをしているかについて発表したこともあるので興味があれば見てください!

blog.ingage.jp

*1:外部品質は内部品質から作れられると考えているのでQAという名前にしてます