会社でチャットツールとして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 ping
や hubot ship it
などのコマンドはこの時点で使用可能です。
Slack
Adapter
Slack Adapterを入れる必要があります。
の手順に従って 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 ping
や hubot ship it
ができれば完了です。
Hubotを導入してから追加したもの
初期状態だとリスの画像を取ってくるのとgifとYoutube検索するぐらいのことしかできないので、ちゃんと捗る機能を追加してあげる必要があります。
既に多くの機能がプラグインとして提供されているので、まずは自分で実装する前にここを見てみると良いです。
入れたもの
- github-pulls
GitHubのpull requestを出してくれる便利プラグイン。これでわざわざGitHubのWebUIを見に行かなくても、
hubot show org-pulls
でopenになっている社内のpull req一覧が出るようになりました。
- github-issue-link.coffee
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っぽいですね。
またいろいろと進んだら書きます。