kentana20 技忘録

技術ネタを中心に、セミナー、勉強会、書籍、会社での出来事を綴っていきます。不定期更新。

RubotyをHerokuにデプロイしてSlackで使う

人気のチャットアプリであるSlackと id:r7kamura さんが作ったRuby製Hubotクローンである Ruboty を試してみたかったので、技忘録。

f:id:kentana20:20141103005647p:plain

最近チームメンバーに編成があって、「まゆゆ」というニックネームの仲間が少しの間、旅に出ることになり、とっても寂しいので寂しさを紛らわすために「まゆゆbot」を作ってみることにします。

前提

RubotyはHerokuにデプロイしますので、Herokuアカウントの作成やHeroku Toolbeltのインストールは済ませてあることを前提とします。

Slack側の設定

Gatewayの設定

  • XMPP Gatewayの設定を有効にします
    • こちら からTeam Settingsの画面を開き、Permisssionsタブをクリックして「Gateways」項目から「Enable XMPP gateway (SSL only)」のチェックを入れてSaveします

f:id:kentana20:20141102174946j:plain

Botアカウントを作る

  • AdministrationのManage Your Teamを開き、Invite New Membersから適当なメールアドレスを入力してInvitationメールを送信します

f:id:kentana20:20141102175023p:plain

  • Invationメールが届いたら、Activationして適当に画像を設定しておきます

Ruboty

ruboty-templateをForkする

Rubotyをカスタマイズしますので、r7kamuraさんの ruboty-templateをForkします。

ForkしたRubotyをHeroku上にデプロイする

ForkしたリポジトリのREADMEにあるHerokuボタンを押して、RubotyをHerokuにデプロイします。

デプロイ画面で以下の内容を入力してDeploy for Freeをクリックします

  • SLACK_PASSWORD
    • mayubotアカウントでログインして、Account SettingsのGateway Configurationを開くとXMPPのパスワードがあるので、それを入力
  • SLACK_ROOM
    • botを常駐させたいRoom Nameを入力
  • SLACK_TEAM
    • Team Name(xxx.slack.com のxxx部分)
  • SLACK_USERNAME
    • botアカウントの名前(いまはmayubot)

f:id:kentana20:20141102175110j:plain

これで、HerokuにRubotyがデプロイされます。

f:id:kentana20:20141102175139p:plain

動作確認

Rubotyがデプロイできたら、Slack上で話しかけてみます。

f:id:kentana20:20141102175227p:plain

う、う、うごいた〜!! ここまで、コードは1行も書いてません。オドロキ。

RubotyはHubotとは異なり、Rubyで動作しており、その挙動はすべてGemfileによってGemプラグインとして管理されています。そのため、Botに新しい役割を任せたい・挙動を増やしたい場合には新しくGemを作って公開する必要があります。

Hubotの場合は script ディレクトリ内に .coffee ファイルを置いてBotを再起動すれば挙動が追加できたので、手軽さという意味ではHubotの方が良いかもしれませんが

  • Rubyで挙動が書ける
  • Gemで管理できる(配布のラクさ)

といった点ではRubotyにも良い点はありますね。

プラグインを追加する

GemをGistで作成する

さて、無事SlackとRubotyが連携できたので、自作のプラグインを作って新しい挙動を追加してみます。「まゆゆ」はおさわり探偵小沢里奈なめこが大好きだったので、「@mayubot なめこ」と唱えると、「んふんふ」と返すプラグインを作ってみます。Gemで公開する必要があるので、GistでGemを公開したいと思います。

nfu.gemspec

この2つをGistで作成します。こんな感じです。

Gemfileに追加

続いて、ローカルにCloneしたリポジトリのGemfileに以下を追記して、 bundle install します。

source "https://rubygems.org"

gem "rake"
gem "ruboty-alias"
gem "ruboty-cron"
gem "ruboty-google_image"
gem "ruboty-redis"
gem "ruboty-slack"
gem "nfu", :git => "https://gist.github.com/e0f5147312c921ba6ee0.git” # これを追記

Gemがインストールできたら、herokuへpushしてデプロイします。

$ git add .
$ git commit -m “add nfu gem”
$ git push heroku master

なめこを唱えてみる

デプロイが完了したら、いよいよSlack上で @mayubot へ向けて呪文を発動。

f:id:kentana20:20141102180025p:plain

動いた〜!!!!!カンタンにプラグインを追加できました。

所感

  • Rubyプラグインが作れるのがGood
  • Gemで管理できるのも良い
    • プラグインをGemで管理するのはエレガントというか、スマートなので賛否あると思うけど個人的には好き
  • GistでGemを公開するのはすばらし
    • これもr7kamuraさんのエントリを参考にしました。すばらし。普通Gemを公開するなら、bundle gem して、 gem build して gem push するみたいなことが必要なんですが、省略できます。
  • Herokuボタンすごい
    • Herokuボタン、すごいです。超カンタンにアプリをHeroku上にデプロイできます。
  • Ruboty-Template
    • こいつをForkすれば自分が好きにいじれるのでTravisCIを組み合わせればmaster mergeを契機にデプロイを走らせるみたいなこともできてGoodです
  • Botを擬人化するのがオモロイ
    • 他社で見てて良いと思ってやってみたのですが、実際良かったです。オモロイです。オモロイだけじゃなくて、その人のアイデンティティというか、例えば「まゆゆ」の場合だと、テストや共有が好きなエンジニアだったので、「 @mayubot テストおねがい。STね。」とかお願いすることで、E2EのテストをST環境で実行したりとか、デプロイするときに「デプロイいただきまゆゆ」とかできたら更にオモロくて便利になるな、と思いました。冗談抜きで、卒業するメンバーがいたらBotにするとかは面白いかもと考えていたりします。

おまけ(Herokuの設定)

HerokuアプリをローカルにCloneして、デプロイする

SSH公開鍵の登録

$ heroku keys:add

で公開鍵を登録します。鍵がなければ ssh-keygen コマンドを使って鍵ペアを作成して再度上記コマンドを実行します。

HerokuアプリをCloneする

$ heroku git:clone -a $heroku_project_name

でHerokuアプリをCloneできます。

Herokuアプリをデプロイする

$ git push heroku master

でHerokuへローカルのリポジトリをpushしてデプロイできます。


次回は「RubotyサーバとGitHubを連携して自動デプロイする」をお送りします(仮)。

参考