block_given?

ジャングル ブロック ナイ アルノハ jump ダケ。CC-BY-SA 3.0

RubotyでHubotスクリプトが使えるruboty-hubotを公開した

TL; DR;

ruboty-hubotを使うとscriptsディレクトリ以下に置いた単純なHubotスクリプトをRubotyで実行出来る。

経緯

以前、Hubotスクリプトのhubot-sushiyukiをruboty-yasyとして移植した記事のまとめで、HubotスクリプトをRubotyで動かせるのではないかと書いた。

今回はHubotスクリプトを人間が読んで解釈してRubotyにわかるように翻訳した。 Hubotのプラグインインターフェイスはある程度決まっている。 RubotyとHubotスクリプトの間をつなぐようなハンドラーがあれば、HubotスクリプトをそのままRubotyのスクリプトとして動かすことも出来るのではないかと考えている。

実際に可能なのか実験してみた。

くふうしたところ

RubotyとHubotスクリプトをつなぐ

lib/ruboty/hubot/robot.rbでHubotのAPIを実装し、Rubotyから結果を取れるようにした。

Herokuでも動く

heroku/heroku-buildpack-rubyではexecjsが入っている場合、JSの実行環境としてnodeをインストールしてくれる。 ちなみにnpmは入らない。Rubyのビルドパックに加えてnpmも欲しい場合はddollar/heroku-buildpack-multiを使うとよい。

もんだい

  • npmパッケージとして公開されているhubotスクリプトexternal-scripts.jsonに書かれているようなものが実行できない。
  • hubot-scripts.jsonが読み込めない。
  • .coffeeで書かれたhubotスクリプトが実行できない。
  • インターフェイスの互換性がrobot.respondしか実装できていない。(robot.hearrobot.httpがない`
  • requireなどCommonJSっぽい機能はexecjsで使えない。なので外部パッケージに依存するスクリプトは実質動かせない。
    • Hubotのrobotと同じように互換層をruboty-hubot側で用意してあげると実行できるようになりそう。

まとめ

思ったよりも簡単にHubotが動いてしまった。ただし実用するには問題が多々ある。 JSとRubyの境界線に小さい穴をあけて通り抜けるのは簡単だけど自由に行き来できる大きな穴をあけるのは難しい。