Backlogの課題が追加されたらHubotからTrelloにカードを追加する

Backlog に新しい課題が追加されると、Hubot を経由して Trello の指定したボードの指定したリストにカードが追加されるようにしました。

カードには、タイトル、Description が入った状態となります。タイトルは「[XXX-1] 課題の名前」という形で入り、Description は該当課題 URL、課題を追加した人の名前、Backlog の「詳細」部分、が入ります。

私は Hubot を Heroku に置いてるので、環境設定は Heroku 側で行っています。

# Trello API Key などの取得

## API Keys を取得
ログインしている状態で https://trello.com/app-key へ行く。
「Developer API Keys」の「Key」をメモ。

## トークンを取得
次の URL へ行って「Allow」を押し、トークンを取得する。
https://trello.com/1/authorize?key=【自分のkey】&name=&expiration=never&response_type=token&scope=read,write
【自分のkey】は先ほど取得した「Developer API Keys」の「Key」。

## カードを追加したい（ボードの）リストの ID を取得

### ボードの ID を取得
次の URL で自分の Trello のボード一覧が JSON で取得できる。カードを追加したいボードの ID をメモ。
https://trello.com/1/members/【自分のTrello名】/boards?key=【自分のkey】&token=【自分のtoken】&fields=name

### リストの ID を取得
次の URL で該当ボードのリスト一覧が JSON で取得できる。カードを追加したいリストの ID をメモ。
https://trello.com/1/boards/【上で取得したBoardのID】/lists?key=【自分のkey】&token=【自分のtoken】&fields=name

# Heroku 側の設定
Heroku の Config Variables に次の内容を設定。それぞれ上で取得したもの。Heroku 管理画面 > Setting からでも、コマンドラインからでも設定可能。

HUBOT_TRELLO_KEY
…Trello の自分の「Developer API Keys」の「Key」

HUBOT_TRELLO_TOKEN
…Trello の自分のトークン

HUBOT_TRELLO_POST_LIST
…Trello の投稿したいリストの ID

コマンドラインで設定するなら `$ heroku config:add HUBOT_TRELLO_KEY=【自分のkey】` といった感じで。

# Hubot スクリプト

node-trello を使うので入れておく。
`$ npm install node-trello --save`

```coffeescript:backlog-to-trello.coffee
#
# Description:
#   Backlog to Trello
#
# Dependencies:
#   "node-trello": "^1.1.1"
#
# Configuration:
#    HUBOT_TRELLO_KEY
#    HUBOT_TRELLO_TOKEN
#    HUBOT_TRELLO_POST_LIST
#    ※heroku 環境設定
#
# Commands:
#   
#

backlogUrl = 'https://<自分のスペース>.backlog.jp/'

module.exports = (robot) ->
  Trello = require("node-trello")
  t = new Trello(process.env.HUBOT_TRELLO_KEY, process.env.HUBOT_TRELLO_TOKEN)

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

    try
      switch body.type
          when 1
              label = '課題の追加'
          else
              # 課題関連以外はスルー
              return

      # 投稿メッセージを整形
      url = "#{backlogUrl}view/#{body.project.projectKey}-#{body.content.key_id}"

      title = "[#{body.project.projectKey}-#{body.content.key_id}] "
      title += "#{body.content.summary}"

      description = "#{url}\n"
      description += "登録者：#{body.createdUser.name}\n\n"
      description += "#{body.content.description}"

      t.post "/1/cards/", {
        name: title
        desc: description
        idList: process.env.HUBOT_TRELLO_POST_LIST_SNK
      }, (err, data) ->
        if (err)
          console.log err
          return

#      # カードを追加したら Slack に投稿したい場合はここを利用
#      if title?
#          robot.messageRoom room, title
#          res.end "OK"
#      else
#          robot.messageRoom room, "Backlog integration error."
#          res.end "Error"

    catch error
      robot.send
      res.end "Error"
```

<自分のスペース>だけ、自分の Backlog のスペースにあわせて変更。

# Backlog の設定
次の場所から Webhook を追加します。
プロジェクト設定 > Webhook > Webhook を追加する

- Webhook 名：分かりやすければなんでも OK。to Trello など。
- 説明：空で OK。
- WebHook URL：https://<自分の heroku appのURL>/trello/<自分の Slack の通知させたい部屋>  
例：https://XXXXX.herokuapp.com/trello/testtest  
slack に通知させなくて良い場合、<自分の Slack の通知させたい部屋> は適当で OK。
- 通知するイベント：「すべて」でOK。（hubot 側で絞るので）

# おわり

社外でのやりとりには Backlog、社内で細かいやりとりには Trello、という環境で都度タスクを Trello に手動登録するのは大変なので hubot に頑張ってもらうようにしました。

Due date も登録できたらな～と思ったんですが、Backlog の最近の更新の取得 API に Due date がないようだったので断念。

# 参考
- [最近の更新の取得 | Backlog API | Nulab Developers](http://developer.nulab-inc.com/ja/docs/backlog/api/2/get-activities)
- [card — Trello documentation](https://trello.com/docs/api/card/index.html#post-1-cards)
- [webhookとHubotを使ってBacklogをslack対応させる - Hacking My Way ～ itogのhack日記](http://d.hatena.ne.jp/itog/20150226/1424939686)
- [【Hubot】BacklogからHubotを経由してChatworkに課題の操作を通知 - Qiita](http://qiita.com/kingpanda/items/4de3c40ed615941bbd5f)
- [Slack + hubot + Trelloでチームのタスクを見える化しよう - Qiita](
http://qiita.com/musclemikiya/items/38586a08df799f6069bf)