LoginSignup
58

More than 5 years have passed since last update.

BacklogをSlackと連携する際に、通知したい人にSlackのメンションを飛ばす簡単な方法

Last updated at Posted at 2015-06-05

Backlogでwebhookが使えるようになり、Slackに通知できるようになった。

実装方法は下記の二つがとても、とても参考になる。herokuで動かす方法も書いてあるのでほぼこれを真似すれば良い

ただ一つだけ上記リンクのScriptを使うと問題がある

そのままスクリプトをコピペすると発生した課題

Backlogのユーザ名と、Slackのユーザ名が同じだとチケットを作った人にメンションが飛んでしまう。
俗にいうメンション地獄に陥ってしまい、Slackの通知を見なくなってしまい本末転倒なのだ

問題のキャプチャ

a
黄色で強調されているところでメンションが効いている

課題の解決策

API連携してSlackに表示される文字列にSlackユーザ名があると自動的にメンションがつく特性を活かして、
チケットの更新を通知したい人にメンションが飛ぶようにする

Webhook連携できるBacklogのAPIは最近の更新の取得するもので、リンク先のようなJSONをHubotが受け取るのだ

この上記リンクを確認しAPIの仕様を見るとnotificationsにいるユーザを通知したい人にすれば良さそうだ。

Backlogのチケット更新の通知欄にメンションを送りたいユーザを指定し、チケットを更新すると、JSONのnotificationsに通知対象のユーザが入ってくる

Backlogのチケット更新箇所における通知ユーザ設定箇所

a

後述するスクリプトをデプロイして、チケットの通知欄にユーザ名を指定すると下の画像のように連絡したい人にSlack上にメンションが飛ぶようになるのだ

通知したい人にメンション飛んでるキャプチャ

a

対象のHubot スクリプト

基本は冒頭のリンクにあるスクリプトと同じだが、notificationsを取得し送信するように書き換えてある

# Description:
#   Backlog to Slack

module.exports = (robot) ->
  robot.router.post "/room/:room", (req, res) ->
    room = req.params.room
    body = req.body

    console.log 'body type = ' + body.type
    console.log 'room = ' + room

    try
      switch body.type
          when 1
              label = '課題の追加'
          when 2, 3
              # 「更新」と「コメント」は実際は一緒に使うので、一緒に。
              label = '課題の更新'
          else
              # 課題関連以外はスルー
              return

      # 投稿メッセージを整形
      url = "#{process.env.BACKLOG_URL}/view/#{body.project.projectKey}-#{body.content.key_id}"
      if body.content.comment?.id?
          url += "#comment-#{body.content.comment.id}"

      message = "*Backlog #{label}*\n"
      message += "[#{body.project.projectKey}-#{body.content.key_id}] - "

      # ここでチケットを作った作成者のユーザ名がbyの後ろについてしまい、知らせたい人じゃない人にメンションが飛んでしまいがち
      # message += "#{body.content.summary} _by #{body.createdUser.name}_\n>>> "
      message += "#{body.content.summary}"

      # notificatonに通知したい人がいればその名前をメンションしてくれる
      if body.notifications.length > 0
        message += "_to "
        for a in body.notifications
          console.log a.user.name
          message += "#{a.user.name} "

      if body.content.comment?.content?
          message += "#{body.content.comment.content}\n"
      message += "#{url}"

      console.log 'message = ' + message
      # Slack に投稿
      if message?
        robot.messageRoom room, message
        # robot.messageRoom room, message
        res.end "OK"
      else
          robot.messageRoom room, "Backlog integration error."
          res.end "Error"
    catch error
      console.log error
      robot.send

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
58