Slack+Hubot으로 여러 Bot 사이의 파이프라인 구축

2375 단어 슬랙Hubot
초기부터 제공되고 있던 WebAPI에서는 「Bot 경유의 발언을 검지해, 다른 Bot를 실행」같은 일은 할 수 없었습니다만, 작년말에 제공 개시된 Real Time Messaging API 를 사용하면 그들도 포함 라고 여러가지 할 수 있게 되었습니다.

이것이 유용하다면,
1. 開発者がチャンネルで `@hubot app build` とアプリのビルドを実行する
2. アプリBotがビルドを実行後、ビルド完了をチャンネルに通知する
3. Hubotがその通知を受け取り、デプロイBotをチャット経由で実行する
4. デプロイBotがデプロイ完了をチャットに通知する
5. Hubotがその通知を受け取り、 `@channel` を付けてデプロイ完了した旨を通知する

같은 것을 할 수 있게 됩니다.
또, 부차 효과로서 복수의 Bot간의 파이프라인을 구축하는 것으로 각각의 Bot가 느슨하게 결합으로 역할이 명확하게 되어, 코드의 전망도 좋아진다.

그래서 그것을 사용하여 Hubot 측을 어떻게 설정하고 있는지를 소개하는 항목입니다.

다음 예제에서는 "테스트가 떨어진 알림을 받고 committer에 mention을 붙여 알림"이라는 것을 구현합니다.

kobito.1429519136.154316.png

전제


  • Slack에서 Hubot을 움직이고 있습니다
  • hubot-slack 어댑터가 v3.0.0 이상을 사용하고 있습니다.
  • v2→v3 업그레이드는 여기 을 참고


  • 코드 예


    module.exports = (robot) ->
      robot.adapter.client?.on? 'raw_message', (msg) ->
        return if msg.type isnt 'message' || msg.subtype isnt 'bot_message'
        return unless msg.attachments
        match = msg.attachments[0].fallback.match(/Failed:  (.+?)'s build/)
        return if match is null
        commit_user = match[1]
        channel = robot.adapter.client.getChannelByID msg.channel
        # プライベートチャンネルは取得出来ないためundefinedが返される
        return if channel is undefined
        text = "@#{commit_user} テストが落ちたよー!"
        robot.send {room: "##{channel.name}"}, text
    

    이런 식으로 신규 스크립트를 추가하면 움직입니다.

    통상의 Outgoing Webhook의 경우는 msg.text , Attachment 형식의 경우는 msg.attachments 안에 기대하는 텍스트가 들어오므로, 그것들을 정규 표현으로 매치시켜 판정한 후에 임의의 액션을 실행합니다.

    알림을 받는 채널은 사전에 hubot을 invite해야 합니다.
    또, Slack의 사양상 프라이빗 그룹은 채널 ID→채널명의 역방향을 할 수 없기 때문에, Hubot가 프라이빗 그룹내에 있었다고 해도 움직이지 않기 때문에 주의가 필요합니다.

    좋은 웹페이지 즐겨찾기