しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Web Apps で Hubot を Git でデプロイして動かす方法

何となく 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 を有効にしておけば問題無いです。