42
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Slack+Hubotで複数Bot間のパイプラインを構築

Last updated at Posted at 2015-04-20

初期から提供されていた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がプライベートグループ内に居たとしても動かないので注意が必要です。

42
46
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?