何となく Hubot を使って @statemachine2 を書き換えようかと思ったので、まずは Azure Web Apps で Hubot をデプロイして動かすところまで試しました。
https://hubot.github.com/
https://hubot.github.com/docs/
Node.js で動くので、当然ながら Windows 向けの Node.js をインストールしておきます。
テンプレートを作成
テンプレートの作成自体は Yeoman を使って行いますが、ドキュメント通りで問題なかったです。
npm install -g yo generator-hubot mkdir statemachinebot & cd statemachinebot yo hubot
Yeoman で Hubot のテンプレート作成中にいろいろ聞かれるので、ボット名や作者など適当に答えます。重要なのは adapter ですが、今回はシンプルに Twitter を使うようにしました。
これで基本的な Bot のテンプレートが完成しましたが、このままだと Web Apps で実行出来ないので、テンプレートのコードを少しだけ修正していきます。
テンプレートを修正
デフォルトでは bin\hubot.cmd に npm install コマンドが入っていますが、Azure Web Apps へ Git デプロイした場合には自動的にインストールされるので、予め削除しておきます。
@echo off node_modules\.bin\hubot.cmd --name "statemachinebot" %*
Hubot は実行に Coffee Script が必要なので、以下のコマンドを実行して package.json に追加しておきます。
npm install coffee-script --save
これでデプロイ時に Coffee Script がインストールされるようになります。
更にデフォルトでは hubot-heroku-keepalive が package.json と external-scripts.json に含まれていますが、このままだとエラーになるので削除しておきます。Azure Web Apps では Always On を有効にするだけです。
起動スクリプトを追加
Azure Web Apps で Node.js アプリを動かす場合には iisnode が使われますが、今回は HttpPlatformHandler を使うので startup.cmd として以下のようなバッチファイルを作成しておきます。
処理としては Procfile を読み込んで実行しているだけです。
@echo off SET DOCUMENT_ROOT=%~dp0 SET PROCFILE=%DOCUMENT_ROOT%Procfile SET PATH=%DOCUMENT_ROOT%node_modules\.bin\;%PATH% cd /d %DOCUMENT_ROOT% IF NOT EXIST %PROCFILE% ( exit 1 ) FOR /f "delims=: tokens=1,2" %%i IN (%PROCFILE%) DO ( IF "%%i" == "web" ( call %%j ) )
Procfile の web で指定されているコマンドを実行するようになってます。
そして startup.cmd を実行するために Web.config を作成し、HttpPlatformHandler の設定を追加します。
<?xml version="1.0"?> <configuration> <system.webServer> <handlers> <add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified"/> </handlers> <httpPlatform processPath="D:\home\site\wwwroot\startup.cmd" startupTimeLimit="120"> <environmentVariables> <environmentVariable name="PORT" value="%HTTP_PLATFORM_PORT%" /> </environmentVariables> </httpPlatform> </system.webServer> </configuration>
Procfile を読み込むように作ったので、多少の汎用性があります。これで特に startup.cmd と Web.config は都度変更する必要は無くなったかと思います。
Azure Web Apps へデプロイ
デプロイ自体は Git を使ってこれまで通りに行うだけなので割愛します。設定に関してはポータルから Twitter のアクセストークンを追加するだけです。
これでブラウザでアクセスすると Node.js が起動するので、Bot 自体も同時に起動します。
簡単にテストとして ping を投げると返事を返してきました。
Azure Web Apps の特性として一定時間アクセスが無い場合サイトが落ちるので、常時立ち上げておく必要がある場合には Always On を有効にしておけば問題無いです。