Hubot에서 Slack의 Channel과 Trello의 Board와 협력

11008 단어 슬랙TrelloHubot
10/31(토) 개최의 카가와대학 공학부제의 실행 위원회가 발족했습니다.
정보계학과의 멤버가 많기 때문에, 슬랙Trello 를 도입해, 탈LINE의 모던한 팀 운영을 목표로 하고 있습니다.

Hubot을 사용하여 Slack의 Channel과 Trello의 Board를 연계시켜 보았으므로 소개합니다.

전제 조건



Slack에서는 「stage(스테이지 기획)」나 「public(홍보)」등, 담당마다 Channel을 나누고 있습니다.
Trello에서는 실행위원회의 Organization을 작성해, 마찬가지로 「Stage」나 「Public」등, 담당마다 Board를 나누고 있습니다.

여기서 말하는 연계란, 「stage」Channel로 Hubot을 사용해 Trello를 조작했을 경우, 「stage」Board에 반영된다고 하는 것입니다.
Hubot에서 Board를 지정할 필요가 없어져, 직관적으로 연계할 수 있을까라고 생각합니다.

구현 방법



Hubot에서 Trello를 조작하기 위해 node-trello을 사용하고 있습니다.
이 절에서는 hubot trello list <list>에서 지정된 목록의 카드 목록을 반환하는 명령을 보여줍니다.
(List는 「Todo」 「Doing」 「Done」의 3단계로 설정하고 있습니다.)

node-trello는 비동기로 결과가 돌아오므로 API마다 함수를 나누어 배열에 쌓아 순서대로 처리하도록 하고 있습니다.
코드에 다소 코멘트를 붙이고 있으므로, 참고로 해 주세요.
trelloAPI = require('node-trello')

module.exports = (robot) ->
  ORG = process.env.HUBOT_TRELLO_ORGANIZATION

  trello = new trelloAPI(
    process.env.HUBOT_TRELLO_API_KEY
    process.env.HUBOT_TRELLO_API_TOKEN
  )

  # OrganizationのBoard一覧を取得
  # https://trello.com/docs/api/organization/index.html#get-1-organizations-idorg-or-name-boards
  getOrganizationsBoards = (msg, args) ->
    url = "/1/organizations/#{ORG}/boards"
    trello.get url, (err, data) =>
      for board in data
        # BoardをChannel名で特定 (Stage, Publicなど)
        if board.name.toLowerCase() is msg.envelope.room
          args['boardID'] = board.id
          return args['callbacks'].shift()(msg, args)

  # BoardのList一覧を取得
  # https://trello.com/docs/api/board/index.html#get-1-boards-board-id-lists
  getBoardsLists = (msg, args) ->
    url = "/1/boards/#{args['boardID']}/lists"
    trello.get url, (err, data) =>
      for list in data
        # Listを名前で特定 (Todo, Doing, Doneなど)
        if list.name.toLowerCase() is args['listName']
          args['listID'] = list.id
          return args['callbacks'].shift()(msg, args)

  # ListのCard一覧を取得
  # https://trello.com/docs/api/list/index.html#get-1-lists-idlist-cards
  getListsCards = (msg, args) ->
    url = "/1/lists/#{args['listID']}/cards"
    trello.get url, (err, data) =>
      names = []
      for card in data
        names.push(card.name)
      msg.reply("```¥n#{names.join('¥n')}¥n```")

  robot.respond /trello\s+list\s+(\S+)$/i, (msg) ->
    # getOrganizationsBoards, getBoardsLists, getListsCardsの順で呼出
    getOrganizationsBoards(msg, {
      callbacks: [getBoardsLists, getListsCards]
      listName: msg.match[1]
    })

Slack으로 움직이면 이렇게됩니다.
(실제로는 easy-table을 사용하여 표 형식으로 Due 및 Members를 표시하고 있습니다.)



카나시



위의 코드는 카나시이라는 Bot으로 작동 중입니다.
그 밖에도, 아래와 같은 Trello와의 제휴 기능을 실장하고 있으므로, 꼭 봐 주세요.
  • kaonashi/trello.coffee at master · hico-horiuchi/kaonashi · GitHub
  • hubot trello list    <list>          - カードの一覧を表示
    hubot trello add     <list> <name>   - カードをリストに追加
    hubot trello move    <list> <card>   - カードをリストに移動
    hubot trello show    <card>          - カードの詳細を表示
    hubot trello archive <card>          - カードをアーカイブ
    hubot trello comment <card> <text>   - カードにコメントを追加
    hubot trello assign  <card> <member> - カードに担当者を追加
    hubot trello due     <card> <date>   - カードに締切を設定
    hubot trello member                  - ボードのメンバーの一覧を表示
    hubot trello member  <name>          - メンバーが担当するカードの一覧を表示
    

    Hubot×ChatOps 공부회



    08/22(토)에 고베에서 제2회 Hubot×ChatOps 공부회 를 개최합니다!
    Hubot이나 ChatOps에 관심이 있는 분, Plugin을 개발하고 있는 분 등, 꼭 와 주세요.
    발표해 주시는 분도 모집중이므로, @히코_호리우치 까지 부담없이 말씀해 주세요.

    좋은 웹페이지 즐겨찾기