Photo by Alper Çuğun
中村です。
チームで開発している皆さんは、そのチーム内でのコミュニケーションをどのようにとっていますか?
最近、弊社のエンジニアチーム内ではSlackをもっと便利に使おうぜブームが来ているので、実験的に分報を書く取り組みを実施しています。
分報とは何ぞという方はこちら
要は「全部の報告が日報だと遅いときあるよねー、ツイッターでツイートするみたいに、その都度チャットで気軽に報告し合えた方がいいよねー」っていうのが分報です。
今まではSlackにエンジニアチーム用のchannelがあって、そこにみんなで書き込んでいたのですが、スレッドやメッセージのシェアがあるとはいえ、個人のつぶやきを投稿するような感じでは使えていませんでした。
あと、GitHubのプルリクエストでも作業の内容は見れるのですが、そもそもレビュー前にノウハウを共有できた方が効率的ですし、レビューとは違う問題へのアプローチもできそうですよね。
そんな期待を込めて、Slackで分報を集めるBotを作ってみることにしました。
■導入当初の話
初めは、メンバーごとのchannelへの投稿を、Zapierを使って「timeline」というchannelに集めてみました。
Zapierとは
zapier.com
なんかいろんなサービスを連携させていろいろできる便利なやつです。
しかしですね、このZapierを使う方法ではすぐに欠陥が見つかりました。別のメンバーのchannelへの投稿をすると、timelineにはchannelのオーナーの投稿のように見えてしまうのです。(AさんがオーナーのchannelへBさんが投稿すると、timelineにはAさんの投稿として表示されてしまう…という感じです)
そのため返信はtimelineに書いていたのですが、それだと結局後から議論を振り返りたいとなった場合はtimelineをいちいち読み解く必要があって、かなり面倒でした。
そこで、今度はHubotを使って分報の一覧を作っている方のやり方をを真似することにしました。
↓参考記事
qiita.com
ただ、この記事が書かれたときと現在(2017年5月時点)では、Slack APIのバージョンが異なっているため、そのままではうまく動かず、次のような対応をいろいろしてみました。
■Hubotを使って連携させるためにSlack APIの変更に対応する
◆方法の検討
分報用のchannelは `times_foobar` という命名規則を採用しています。前述の参考記事では、その命名規則を利用してコントロールをしていますが、Slack APIの変更に伴い、2017年5月時点では `msg.envelope.room` の結果はIDになっているため、そのままのコードではうまく動作しません。
そこで、いくつか解決策を考えてみました。
- timelineに載せるchannelのIDを、Herokuの環境変数として管理する
- Hubotが招待されているchannel全て(timelineをID指定で除く)という条件にする
- 命名規則でやるためにchannelの名前を取ってくる
…という選択肢が思いつきましたが、1だとメンバーが増えるたびに作業が必要だし、2だとHubotを他の目的に利用できなくなってしまいます。
というわけで、channel名を取得する方法を調べてみました。
◆channelの名前を取得する
Hubotで利用しているadapterで `robot.adapter.client` からSlackのクライアントにアクセスしてみましょう。
Slack APIとしてはrtm.startがありますが、今回はchannel名が欲しいだけです。ユーザー、チャンネルなどの情報はHubot内のSlackクライアントがMemoryDataStoreとしてキャッシュしてくれているので、そちらを使った方がよさげですね。
今回はchannelからの投稿だけを前提にしているので `getChannelById(channelId)` を使います。するとChannelオブジェクトが返却されるので、nameを取り出すことができました。
roomId = msg.envelope.room room = robot.adapter.client.rtm.dataStore.getChannelById(roomId) room.name // => 'times_foobar'
ただ、余談ですがhubot-slack adapter の開発者間で「 robot.adapter.client.rtm.dataStore ではなく robot.brain を使うべき」という議論が出ているようなので、今後はこのやり方は非推奨になるのかもしれません…。
◆動かしてみる
あとは参考記事の通りに動かせますね。
チーム名の部分はHerokuの環境変数を利用しています。今見ると、投稿先のchannel名も環境変数にしてしまえばよかったですね…。
module.exports = (robot) -> robot.hear /.+/, (msg) -> roomId = msg.envelope.room room = robot.adapter.client.rtm.dataStore.getChannelById(roomId) if room.name.match('^times_.+') id = msg.message.id.replace('.','') archiveUrl = "https://#{ process.env.SLACK_TEAM_NAME }.slack.com/archives/#{ room_id }/p#{ id }" robot.send { room: '#timeline' }, archiveUrl
HubotをHerokuにデプロイして動かした結果がこちらになります。
ちなみにHubotのアイコンは、「ぱいじょ!」に登場する霧島京子さんの自作マシン・マーガレットちゃんです。
■まとめ
というわけで、Slackで分報を集めるBotを作ってみました。
分報を導入したいなーという人や、分報に限らずSlackでBotを作りたいなーという人の参考になればと思います。
また今回初めてHubotを触ったので、何かおかしな点などあればご指摘いただけますと嬉しいです。
paizaは、技術を追い続けることが仕事につながり、スキルのある人がきちんと評価される場を作ることで、日本のITエンジニアの地位向上を目指したいと考えています。
自分のスキルを磨いていきたいと考えている方におすすめなのが「paizaラーニング」。オンラインでプログラミングしながらスキルアップできる入門学習コンテンツです。初心者でも楽しくプログラミングの基本を学ぶことができます。
そして、paizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。
スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。