rails runner
セッションをプロらしく拡張する(翻訳)
弊社の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動画コース」以外にもさまざまなコースが新設中です。
概要
原著者の許諾を得て翻訳・公開いたします。
日本語タイトルは内容に即したものにしました。