Decorate your runner session like a pro

Paweł described some tricks you could use to tune-up your Rails console. I want to tell you about the runner method you can use to enhance your runner sessions. Decorating runner sessions is a little bit less convenient as we don’t have a module like Rails::ConsoleMethods that is included when runner session is started. So […]

Paweł described some tricks you could use to tune-up your Rails console.
I want to tell you about the runner method you can use to enhance your runner sessions.

Decorating runner sessions is a little bit less convenient as we don’t have a module like Rails::ConsoleMethods that is included when runner session is started. So adding some methods available for runner scripts is not that easy.
However you can still add some code that will be executed at the start and the end of your runner sessions.

For example you can send some notifications so you don’t need to look at the terminal to check if the script evaluation has been finished. You can also measure time or set some Rails Event Store metadata
to easily determine what has been changed during your session.

Here is an example we are using in one of our projects to log the elapsed time, set some RES metadata and send Slack notifications. You can just add it to your 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

With such snippet, each time you run some script (or evaluate some inline Ruby code) with rails runner it will set the metadata for your RES instance and it will send a Slack notification
at the beginning and the end of the runner session.

Source: Arkency