WHITEPLUS TechBlog

株式会社ホワイトプラスのエンジニアによる開発ブログです。

ホワプラSlackBot、bb8のご紹介

Advent Calendar 2019

これはWHITEPLUS Advent Calendar 2019の2日目の記事です。

はじめに

こんにちは、ホワイトプラス エンジニアの仲見川です。 「リネット」のフロントエンドからサーバーサイド、NW保守、社内イベントのシステム開発まで幅広く携わってます。

ホラプラで運用しているSlackBotについて、社内から「どんな機能があるか分からない!」と言う声が聞こえてきたので今回はその紹介をしたいと思います。

ホワプラのSlackBotは「bb8」といいまして、どこかで聞いたことがあるような気もしますが、 名前を検討した際に話しかけるときに打ちやすい、覚えやすい名前が良いなということと。
リネットには「ううるくん」というキャラクターもいるのですが、システムからの通知で「ううるくん」がすでに使われていたこと。このあたりの理由から「bb8」という名前にしました。

目次

About bb8

bb8はhubotを用いて開発しており、初期はCoffeeScript、現在は素のJavaScriptで動かしています。
インフラはHerokuでGithubのmasterマージで自動デプロイされるような設定です。

ただ、春頃からなぜか自動でデプロイされなくて、最近Github連携を1度解除してやり直したらできるようになりました。Heroku詳しくないのでなかなか解消できなくて困りました。

SlackBotの開発の流れとしては、リネットの他の開発と同様。ざくっというとブランチを作成して開発完了したらPRを作成し、他のメンバーのレビュー後マージ。

bb8にできること

現在機能として提供しているものをご紹介。

cron(日時指定で動くもの)

リリース担当者抽選

現在リネットでは、特にリリース時間に制限のないものは定時リリースとして1日に1度まとめてリリースしています。 そのリリース作業担当者をランダムで割り当てます。ランダムとは言っても、必ず1巡するように済んだ担当者は記憶しておき、してない人がいる限りは再度割りあたらないようになっています。

未クローズのレビュー依頼一覧

こちらは現在ではPull Remindersもあるので不要かなと思ってはいるのですが、見やすく整形していたり、WIPや🚧が付いたものを表示しないなどの制御をしていて、(個人的に)みやすいので残しています。 ここに残っているものが無いと気分がよいです!

f:id:nakamigawa:20191128105413p:plain

リネット各サービスの外形監視

2018年10月の基盤刷新以前は、サービスにアクセスできない状況を検知するのに重要でした。 刷新後は、インフラ自体の監視がしっかりしているので要らないかなと思いつつ気休め程度に残しています。

f:id:nakamigawa:20191128105533p:plain

週間天気予報

f:id:nakamigawa:20191128105610p:plain

週間天気予報を毎朝お知らせ。マーケティングの担当から相談を受けて、お試しで追加してみた機能です。

Slackの表現力(文字の色を自由に変えられないとか)で見やすくする方法を考えてみたのですが、ひとまずは何もしないのが一覧性が良かったのでシンプルな形になってます。

アドベントカレンダースケジュール通知

f:id:nakamigawa:20191128105643p:plain

Spreadsheetsに日時と通知内容を記載すると、それをみて通知する機能を開発して通知しています。

Spreadsheetsとの連携はGCPのサービスアカウントを用いてアクセスしているため、Spreadsheets側ではサービスアカウント向けに共有する形なのでGASでAPIを作成したりといったことは不要です。便利!

対話型コマンド

リリース担当者スキップ機能

skip on [slackID]  
skip off [slackID]  
skip show  

前述のリリース担当者抽選機能で抽選に当たらなくする機能です。
有給くらいでは使いませんが、夏休みなどの長期休暇の際には何回か当たってしまうので設定します。

Slackユーザーリスト

userlist

f:id:nakamigawa:20191128105715p:plain

Slack上のユーザーのid(SlackID)、display_name、real_name、statusを取得して表示します。 こちらはユーザー数が多くなったので現在は使わずに、後述のユーザー検索を使用しています。

Slackユーザー検索

findUser [検索文字列]

検索文字列がdisplay_nameかreal_nameに含まれる人を検索します。 「仲」という漢字が入っている人は私しかいないようです。

f:id:nakamigawa:20191128105727p:plain

Webhook受信

Github

GithubのWebhookを受け取って加工しSlackへ通知を行っています。

  • PRレビュー依頼通知
    • PRのレビュアーに指定されるとSlackでメンションが来ます
  • コメント通知
    • Github上でメンションを付けるとSlackにコメント内容付きでメンションが来ます
  • PRクローズ通知
    • master向けのPRがクローズされたらPRを作成した人にSlackでメンションが来ます

BackLog

一部の業務でBacklogを使用していますがチェックする頻度が低く、漏れることがあったので。課題が追加されたことをエンジニアのチャンネルに通知しています。

f:id:nakamigawa:20191128105800p:plain


bb8の機能は以上です。 意外とあるような、少ないような微妙なところですね。

bb8の歴史

いままでの経緯などを思い出せる限り書いてみようかと思います。

歴史を遡ってみたところ2017年の7月にローンチ。 当時はAWSのEC2上でDockerを用いて動かしていました。 Githubのリポジトリ名は「chat-ops」となっており、その当時目指していたものがうかがえます。

このときに実装した機能は「リリースロック機能」

この当時、リネットの開発ではリリース時タスク実行中にマージをしてしまうと、意図しないリソースでリリースされてしまう可能性があり。 Slackで「リリース中、マージ禁止!」と通知しておく運用を行っていました。

この定型文を打つのが面倒くさい、というのがbb8誕生の契機でした。(面倒くさがりですね)

その後、「リリース担当者の抽選機能」「サービスの外形監視」機能などを実装しつつ。 BacklogやGithubといったサービスのWebhookを良い塩梅にして通知するといった、エンジニアの生産性を向上するための機能が付加されていきました。

特に「リリース担当者の抽選機能」は、当時は定時リリースとして1日2回昼と夕方リリースしていたのですが、気が付いた人がするという形だったので、リリース作業の負荷を分散するという意味でリネットの開発に大きく貢献しました。

2018年6月当時、インターン中だった新卒エンジニアが、Githubにコメントがあった際に該当のメンバーにSlackメンションが飛ぶようするというアップデートをしてくれました。

このとき合わせてインフラをEC2からHerokuへ変更。EC2当時は再起動毎に記憶喪失(Hubotを使っており永続化していなかったのでBrainという記憶領域が飛んでた)になっていたのが、HerokuのRedisを利用するようになって記憶喪失しなくなりました。

2018年10月に、リネットは基盤をElastic BeanstalkからKubanetes(GKE+Istio)へ刷新し、リリースプロセスも変更され、リリース中にマージしても問題の無い環境となりました。

SlackBotの「リリースロック機能」はこのときに役目を終えました。

最後に

ホワイトプラスのSlackBot、bb8のご紹介でした!

積極的な開発はしていないけど、必要に合わせてエンジニアの生産性を高める機能をそのときどきに合わせて開発しています。

今後もその役割に限らず社内で広く活躍させていきたいと思います!

ホワイトプラスでは「DXもどんどん良くしていこう!」という気概をお持ちのエンジニアを募集しています。

open.talentio.com