プロジェクトの開発中・リリース直後は想定外のエラーが多発するため、異常はすぐに検知出来た方が開発スピードが上がりますね。
今回はそういったケースでライトにSlackへの通知が出来る、slack-notifier
のご紹介です。
gemインストール
Gemfileにslack-notifier
を追加し、bundle install
#Gemfile gem 'slack-notifier'
Slack側準備
Slack側でアプリケーションの通知を受け取れるよう設定します。
1. まずは下記URLにアクセスします。
https://slack.com/services/new/incoming-webhook
2. 通知先ワークスペースを選択します。ここではmofmofの社内Slackであるj-caw
3. 通知先チャンネルを選択します。ここでは#times_miwa
4. Incoming Webhook インテグレーションの追加
をクリック
- Webhook URLをコピペして保存!
Slackでメッセージを送信する
では、準備が出来たのでアプリからメッセージを送ってみましょう。
下記の様なコードを書けば、メッセージが送信されます。
WEBHOOK_URL = 'https://hooks.slack.com/services/〇〇...〇〇' Slack::Notifier.new(WEBHOOK_URL).ping('メッセージ')
もしくは、ワークスペースのchannelとメッセージ送信者名をRails側で指定することも出来ます。
WEBHOOK_URL = 'https://hooks.slack.com/services/〇〇...〇〇' channel = "#times_miwa" username = "mofmof" Slack::Notifier.new(WEBHOOK_URL, channel: channel, username: username).ping('メッセージ')
ただ、毎回この書き方だと複数箇所でSlack通知を実装するには冗長になってしまいます。
なので、Railsの中であればSlack::Notifier
オブジェクトをどこからでも簡単に呼び出せるようにしましょう。
SlackNotifierクラスの作成
app/models配下に下記ファイルを作成します。
# app/models/slack_notifier class SlackNotifier attr_reader :client # 環境SLACK_WEBHOOK_URLにwebhook urlを格納 WEBHOOK_URL = ENV['SLACK_WEBHOOK_URL'] CHANNEL = "#times_miwa" USER_NAME = "mofmof" def initialize @client = Slack::Notifier.new(webhook_url, channel: CHANNEL, username: USER_NAME) end def send(message) Slack::Notifier.new(WEBHOOK_URL, channel: CHANNEL, username: USER_NAME).ping('message') end end
上記の様に書けば、プロジェクトのどこからでも下記の様にワンライナーでSlack通知を呼び出せます。
SlackNotifier.new.send('Hello') SlackNotifier.new.send('こんにちは') SlackNotifier.new.send('你好')
ただ、メッセージがこれだけだとエラー内容も通知に含めたい場合などは少々使いづらいです。
エラーの場合はエラーだと一目でわかるようにメッセージを装飾したい、という場面もあります。
エラー通知
その場合、Slackのattachmentsを使用すれば良いでしょう。
attachmentsとはSlackのメッセージを装飾するものです。
これを使えば、Slackのメッセージ色などを変えることが出来ます。
そしてattachmentで装飾されたメッセージを送信する場合、Slack::Notifier#post
メソッドを使用します。
SlackNotifier
クラスを書き変えてみましょう。
# app/models/slack_notifier class SlackNotifier attr_reader :client # 環境SLACK_WEBHOOK_URLにwebhook urlを格納 WEBHOOK_URL = ENV['SLACK_WEBHOOK_URL'] CHANNEL = "#times_miwa" USER_NAME = "mofmof" def initialize @client = Slack::Notifier.new(webhook_url, channel: CHANNEL, username: USER_NAME) end def send(title, message) payload = { fallback: "Application raise error", text: message, color: "bad" } client.post text: title, attachments: [payload] end end
SlackNotifierクラスを利用してメッセージを送信します。
SlackNotifier.new.send('エラー', 'エラーが発生しました。')
以下の様なメッセージが送信されます。
こうしておくと、一目でエラー発生していることが分かりますね。
まとめ
いかがでしたでしょうか?Slack通知が案外簡単に作成出来る事をお分り頂けたかと思います。
attachmentは他にもたくさんあるので、是非色々調べて分りやすい通知が出来る様にしてください。