月曜日までに考えておきます

ITネタとゲームネタ中心に興味のあること色々書きます。

会社で利用しているSlackにhubotを入れて活用してみた話

会社でチャットツールとしてSlackを使用しています。 Slack自体とても使いやすいチャットツールなのですが、今回その説明は省いて、Hubotを入れてどういうことをできるようにしたかという話をします。

Slackはここ読むといいと思います。

SkypeやYammerよりも使いやすい!チーム向けコミュニケーションツール、Slackが超便利! — Medium

Slack上でHubotを動かすのはとても簡単ですが、Hubotを動かしているサーバのurlが(おそらく)必須なのでローカルのPCではなくサーバに置いて動かす必要があります。HubotはHerokuで動かせるので、Herokuを使うのが一番手っ取り早いですね。

導入

まず

hubot/docs at master · github/hubot

の手順通りですが、

npm install -g hubot coffee-script
hubot --create myhubot
cd myhubot
git init
git add .
git commit -m "Initial commit"

までやって bin/hubot で hubotが動くところまで確認できればOKです。8080番で起動するので、何か他に開発してたりJenkins動かしてたりするとポートがぶつかって起動失敗するので注意です。

hubot pinghubot ship it などのコマンドはこの時点で使用可能です。

Slack

Adapter

Slack Adapterを入れる必要があります。

tinyspeck/hubot-slack

の手順に従って install すればOKです。

ところで、自分はNode.jsのことをよく知らなかったからなのですが、npm install hubot-slack だと自分の環境に入るものの、このHubot Projectが"hubot-slack"を利用する、という情報はどこにも残らないためHerokuにデプロイすると失敗します。npm install hubot-slack --save とやることで、package.json に入ってくれて、必要な依存パッケージとして残るようです。RubyのGemfileとGemfile.lockのようなものなのですね。

Slack上のトークンなど

IntegrationsのところにHubotがあるので、それを選ぶと設定画面にいけます。 ここにtokenを含めたHerokuに設定すべき環境変数が書いてあって至れり尽くせりですね。

Hubot URLのところに、このあとデプロイするHerokuのURLを入れる必要があります。

Heroku

hubot-slackのページにもSlackからもデプロイ手順が書かれていますが、herokuのプロジェクトを作り、

  • HUBOT_SLACK_TOKEN
  • HUBOT_SLACK_TEAM
  • HUBOT_SLACK_BOTNAME

を設定し、

heroku addons:add redistogo:nano

を実施して、(ただし、redistogoを利用するには無料プランであってもクレジットカードの登録が必要)

Procfileに

web: bin/hubot --adapter slack

を書いて、commitしたら

git push heroku master
heroku ps:scale web=1

で動くはずです。 あとは、この作成したHerokuプロジェクトのURLをSlackの方に入力してやれば完了です。 Slackの方から、bin/hubotで立ち上げた時と同じように、hubot pinghubot ship it ができれば完了です。

Hubotを導入してから追加したもの

初期状態だとリスの画像を取ってくるのとgifYoutube検索するぐらいのことしかできないので、ちゃんと捗る機能を追加してあげる必要があります。

既に多くの機能がプラグインとして提供されているので、まずは自分で実装する前にここを見てみると良いです。

Hubot Script Catalog

入れたもの

GitHubのpull requestを出してくれる便利プラグイン。これでわざわざGitHubのWebUIを見に行かなくても、 hubot show org-pulls でopenになっている社内のpull req一覧が出るようになりました。

GitHubのissueを取得してくれるものです。 #10 と打つと、10番のissueのリンクをチャットに貼ってくれます。 "#no."で取ってくるのは設定したプロジェクトのものになります。複数のプロジェクトがあるときは、org/repo/no. という書き方になるのでちょっとめんどくさいですね。 せめてorgだけは省略できるように修正しようかなと思っています。

みんな大好き天気予報です。しかも日本のやつ。上記のカタログ一覧にも天気予報のものがあったのですが、海外の天気予報サービスだし、APIキーを要求されたりしたので日本のやつないかな、と思って探したら作っている方がいました。

hubot 天気 東京 と打つと東京の天気が出ます。

作ったもの

hubotにdevelopからmasterへのpull reqを作らせてデプロイ、ということをやりたくて、これって最近の流行りなのでもう誰か作ってるんじゃないかな、と思って探したのですが見つからなかったので作りました。

自作スクリプトは /scripts に.coffeeファイル置いて、他のプラグインを参考にしつつ書けば動きました。

github-pullsのときに依存関係で入ってきていたのですが、githubotというプラグインが優秀で、これを入れているだけで、github-pullsのときに環境変数に設定したトークンを使ってくれるので、あとはAPIを叩くだけになります。

API仕様書はこれ。API自体もシンプルなうえにドキュメント詳しいので簡単でした。

hubot deploy [repo名] とSlackに打つことで、develop => master へのpull reqを作るプラグインが簡単にできました。 「masterにマージされたらデプロイ」はすでにCircleCIを利用してやっているので、hubotにデプロイ依頼したらpull reqが作成されてボタンひとつでデプロイ、ができるようになりました。

今後の課題とかわかってないことなど

定期的にpull req数を伝えるとか会議時間を伝えるとかやりたいと思ってたら、みんな大好きcronの挙動をしてくれるものがあったのでこれで勝つる感したのですが、まだうまく動かなくて保留中です。使い方が悪いのか、Herokuだと動かないのかの切り分けもまだできていないレベルですね。

あと、hubotディレクトリに hubot-scripts.json と external-scripts.json があってArrayで導入したいscriptを書くみたいなのですがこれの違いもよくわかってないです。

hubot-scriptsは上のカタログに載ってるやつで使いたいのを書けば良くて、external-scriptsはそれ以外のスクリプトで導入したいスクリプトを書くものなのかなぁ、と解釈しててそれでうまく動いている感じです。

つまり、Hubotは

  • /scripts の下にある.coffee
  • hubot-scripts に書いてある、hubot-sciripts 内にある.coffee
  • external-scripts に書かれてある package.json に書かれてある外部モジュール

を読み込むということなんじゃないかと。package.jsonを今読み返すと、"hubot-scripts": ">= 2.5.0 < 3.0.0",が書いてあったので、hubot-scriptsはnpm installされていて、それを読みに行くのがhubot-scriptsっぽいですね。

またいろいろと進んだら書きます。