Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

'rails runner' セッションをプロらしく拡張する(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

日本語タイトルは内容に即したものにしました。

rails runnerセッションをプロらしく拡張する(翻訳)

Railsコンソールの思いがけない便利技(翻訳)

弊社のPawełが上の記事でRailsコンソールをチューンナップする方法を紹介していましたが、実はrunnerメソッドでランナーセッションを拡張できることを彼に伝えたいと思います。

ランナーセッションにはRails::ConsoleMethodsのようなモジュールがないので、拡張が少々不便です。そのため、ランナースクリプトで利用可能なメソッドを追加するのはそれほど簡単ではありませんが、ランナーセッションの開始時と終了時に実行されるコードを追加することなら可能です。

たとえば、スクリプトの評価が終了したかどうかをターミナルで確認しなくても済むよう何らかの通知を送信できますし、時間の計測や弊社のRails Event Storeのメタデータを設定すれば、セッション中の変更内容も簡単に確かめられます。

私たちのプロジェクトで使われている例を紹介しましょう。ここでは経過時間を記録し、Rails Event Storeのメタデータを設定し、Slack通知を送信します。これは以下のコードをconfig/application.rb に追加するだけでできます。

runner do
  session_id = SecureRandom.uuid
  script = ARGV.join(" ")
  Rails.configuration.event_store.set_metadata(
    causation_id: session_id,
    correlation_id: session_id,
    script: script,
    locale: I18n.locale.to_s,
  )
  t = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  notify_slack(
    username: "Script runner",
    text: "[#{Rails.env}] Runner script session #{session_id} has started: '#{script}'",
    channel: "notifications",
    icon_emoji: ":robot_face:"
  )

  at_exit do
    notify_slack(
      username: "Script runner",
      text: "[#{Rails.env}] Runner script session #{session_id} has finished: '#{script}' (elapsed: #{Process.clock_gettime(Process::CLOCK_MONOTONIC) - t} seconds)",
      channel: "notifications",
      icon_emoji: ":robot_face:"
    )
  end
end

このスニペットを使えば、rails runnerでスクリプトを実行(あるいはインラインのRubyコードを評価)するたびに、Rails Event Storeインスタンスのメタデータが設定され、runnerセッションの開始時と終了時にSlack通知が送信されるようになります。

お知らせ

ARKADEMY.DEVに参加してArkencyのトップクラス教育プログラムコースにアクセスしましょう!「Railsアーキテクトマスタークラス」「アンチ"IF"コース」「忙しいプログラマーのためのブログ執筆コース」「Async Remoteコース」「TDD動画クラス」「ドメイン駆動Rails動画コース」以外にもさまざまなコースが新設中です。

関連記事

Rails: Zeitwerkオートロードの「1ファイルにクラスを複数置けない」問題を回避する


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。