backlog→hubot→slack連携


# 概要

backlogでの課題やwikiなどの更新情報をslackに届くようにします。

更新情報がメールにいちいち届いてうっとおしいのを解消できます。

# 環境構成

backlog -> hubotサーバー(兼開発サーバー) -> slack

hubot関連の記事ではherokuを使ったものが多いですが、
自前でhubotサーバーを用意する構成となっています。

# 記事作成時の環境

+ サーバー(CentOS 6.5)
+ node.js(0.10.33)
+ npm(1.3.6)
+ CoffeeScript(1.9.1)
+ yoeman(1.4.6)
+ generator-hubot(0.2.5)
+ hubot(2.11.4)
+ forever(0.14.1)


## 1.slack側の準備

### 1-1
![1.png](https://qiita-image-store.s3.amazonaws.com/0/69774/ce5d4d93-cfab-daf8-ad29-39242227de62.png "1.png")

slackで新しいchannelを作成。
integrationを追加する。

### 1-2
![2.png](https://qiita-image-store.s3.amazonaws.com/0/69774/5b0bb8f4-4413-baf3-e0a3-6f22430cb82e.png "2.png")

integrationの一覧からHubotを選択。

### 1-3
![3.png](https://qiita-image-store.s3.amazonaws.com/0/69774/feda5555-917b-c779-a773-a1e706aa1652.png "3.png")
Hubotの設定画面に遷移するので、追加したいbotのユーザー名を入力する。
ex) hubotとか、backlogとか

### 1-4
![4 2.png](https://qiita-image-store.s3.amazonaws.com/0/69774/51ff965b-9ef0-b608-3798-08e268856edf.png "4 2.png")
トークンが発行されるので、これを後からプログラム側で設定する。
![4 3.png](https://qiita-image-store.s3.amazonaws.com/0/69774/705b408c-5453-2eaf-0027-d81649bffd4e.png "4 3.png")
その他設定情報を確認して、Save Integrationを押す。

### 1-5
![5.png](https://qiita-image-store.s3.amazonaws.com/0/69774/600e6103-01c9-e6a7-09f1-10edad003160.png "5.png")
デフォルトだと、generalにしか参加していないので、先ほど作ったchannelにbotユーザーをinviteしておく。  
これでslack側は準備完了。


## 2.hubot環境構築

### 2-1. 雛形作成
任意のディレクトリで下記をyoコマンドを実行するとhubotの雛形が作成される。

```
mkdir backlog-to-slack
cd backlog-to-slack
yo hubot
```

対話形式で下記のように答える。

```
? Owner: Your Name <your@mail.address> #<-任意
? Bot name: hubot #<-任意
? Description: A simple helpful robot for you #<-任意
? Bot adapter: slack #<-必ずslackにする
```

雛形が作成される。

### 2-2. botスクリプト作成

```scripts/backlog-notification.coffee
# Description:
#   Backlog to Slack
#
# Commands:
#   None

backlogUrl = 'https://your.backlog.jp/'

module.exports = (robot) ->
  robot.router.post "/<任意のパス>/:room", (req, res) ->
    { room } = req.params
    { body } = req
    try

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

      # 投稿メッセージを整形
      url = "#{backlogUrl}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}] - "
      message += "#{body.content.summary} _by #{body.createdUser.name}_\n>>> "
      if body.content.comment?.content?
          message += "#{body.content.comment.content}\n"
      message += "#{url}"

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

### 2-3. 起動スクリプト作成

もともとの起動スクリプトをforeverからデーモン化するように下記のように変更

```bin/hubot
#!/bin/sh

set -e

npm install

export PORT="8081"
export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH"
export HUBOT_SLACK_TOKEN="<hubotアクセストークン>"

forever start -c coffee node_modules/.bin/hubot --name "gitbucket-to-slack" --adapter slack
```

PORTはHubotを実行したいポートを指定。他のプロセスで利用しているポートを指定するとエラーになるので注意。

HUBOT_SLACK_TOKENはslackのほうで発行されたアクセストークンを指定。

--nameは、雛形作成時のnameを指定。

### 2-4. 起動

```
cd <path to hubot>
bin/hubot
```

雛形作成したディレクトリでbin/hubotでプログラム起動。

## 3.backlogでWebhookの設定を行う

![6.png](https://qiita-image-store.s3.amazonaws.com/0/69774/3f1459f5-7ba0-f8e4-7646-20d656cebef9.png "6.png")
プロジェクト設定からhubotの起動しているURLを設定する。

http://server:port/hubot/room

上記の形式でhubotがリクエストを待ち受けている。
それぞれ、
server:サーバーのIPもしくはドメイン
port:起動スクリプトで指定しているポート
hubot:botスクリプトで指定している<任意のパス>
room:飛ばしたいslackのchannel名

あとは、backlog側で課題追加など行えばslackに飛ぶはず！

うまく動作しない場合は、webhookのURLが正しいか、foreverからログを確認して、hubotが正しく起動しているか、slackのアクセストークンが有効かなどを調べる。

## 3.参考URL
http://gihyo.jp/dev/serial/01/hubot/0005
http://qiita.com/mayukojpn/items/a9a9408c21a761adb7d0
http://qiita.com/misopeso/items/1f418dd02e89234499b3
http://www.seeds-std.co.jp/seedsblog/2125.html
http://blog.fumiz.me/2012/08/05/hubot-irc-bot-script/#httphttpd
http://qiita.com/kon_yu/items/cdc452bcd2bb89f85de1