Backlogでwebhookが使えるようになり、Slackに通知できるようになった。
実装方法は下記の二つがとても、とても参考になる。herokuで動かす方法も書いてあるのでほぼこれを真似すれば良い
ただ一つだけ上記リンクのScriptを使うと問題がある
そのままスクリプトをコピペすると発生した課題
Backlogのユーザ名と、Slackのユーザ名が同じだとチケットを作った人にメンションが飛んでしまう。
俗にいうメンション地獄に陥ってしまい、Slackの通知を見なくなってしまい本末転倒なのだ
問題のキャプチャ
課題の解決策
API連携してSlackに表示される文字列にSlackユーザ名があると自動的にメンションがつく特性を活かして、
チケットの更新を通知したい人にメンションが飛ぶようにする
Webhook連携できるBacklogのAPIは最近の更新の取得するもので、リンク先のようなJSONをHubotが受け取るのだ
この上記リンクを確認しAPIの仕様を見るとnotificationsにいるユーザを通知したい人にすれば良さそうだ。
Backlogのチケット更新の通知欄にメンションを送りたいユーザを指定し、チケットを更新すると、JSONのnotificationsに通知対象のユーザが入ってくる
Backlogのチケット更新箇所における通知ユーザ設定箇所
後述するスクリプトをデプロイして、チケットの通知欄にユーザ名を指定すると下の画像のように連絡したい人にSlack上にメンションが飛ぶようになるのだ
通知したい人にメンション飛んでるキャプチャ
対象の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