マイネット Advent Calender14日目の記事です。
はじめに
弊社ではスマートフォンゲームの運営を行っておりますが、
日々の運用で定常的に発生する作業があります。
定常作業の例
- 複数プラットフォームの毎日の売上などの情報を管理サイトから引っ張ってきて足し合わせる
- ○月△日 □時になったら管理サイトで集計を行う
etc...
いずれも作業としては単純ですが、手動で行うと面倒なだけではなく、ミスの原因にもなります。
これらの作業はたいてい単純作業ですが、作業をエンジニアしか行うことが出来ない場合があり、非効率なこともあります。
また、自動化の方法はいくらでもありますが、弊社の特徴として買収・協業を行っているタイトルがあり、その中には以下のような制限が存在することもあります。
- sudoが使えない(権限がない、cron仕込めない、ツールも入れられない)
- 勝手にAPIとか追加できない
そこで、本番環境に触れずに自動で作業を行うにあたり、Hubotに目を付けました。
弊社ではコミュニケーションツールとしてchatworkを使っているので、chatworkのAPIを用いて対話可能にしました。
hubotの導入
今回は、CentOS6.5上で環境を構築しました。
あらかじめ、chatworkのアカウントを作り、APIKEYを取得します。
まずは必要なものをインストールします。
git clone git://github.com/creationix/nvm.git ~/.nvm
cd .nvm/
./install.sh
nvm ls-remote | grep iojs
nvm install iojs-v3.3.1
nvm use iojs-v3.3.1
nvm alias default iojs-v3.3.1
cat ~/.nvm/alias/default
nvm ls
npm install -g npm
npm install -g yo generator-hubot coffee-script
npm install forever -g
インストール作業後、適当なディレクトリを作り、hubotの作成を行います。
mkdir hoge-hubot
cd hoge-hubot
yo hubot
いくつか質問項目がありますが、全てEnterキーを押しても動作します。
また、hubotで使用するツールも入れます。
npm install cron --save
npm install hubot-chatwork --save
ひとまず準備が完了です。下記で起動が出来ます。
bin/hubot
以下でPONGが返ってくれば動作しています。
hoge-hubot> hoge-hubot ping
hoge-hubot> PONG
下記のようにchatwork用に環境変数を設定し、foreverでデーモン化します。
export HUBOT_CHATWORK_TOKEN="チャットワークで取得したTOKEN"
export HUBOT_CHATWORK_ROOMS="xxxxxxxx,yyyyyyyy" # 部屋のID(URLのrid以降の数字、複数指定の場合はridカンマ区切りで繋ぐ)
export HUBOT_CHATWORK_API_RATE="500" # 1時間当たりのリクエスト数。多いほどレスポンスが早いが、5分間100回までの制限があるので注意
forever start -c coffee node_modules/.bin/hubot --adapter chatwork
hubot用にスクリプトを書く
基本的にhubotスクリプトはcoffeescriptで記述し、scriptsディレクトリに格納します。
しかし、hubot側でlinuxのコマンドを実行することも可能なので、coffeescriptでrubyやPHPなどを実行すれば他の言語でも対応できます。
hubotによって自動化を行った作業の一例を以下で簡単に紹介します。
売上の情報を管理サイトから引っ張ってくる
前日の売上やユーザー数などの情報を取得するためには管理サイトにログインし、該当のページにアクセスして手動で取得していたものを、hubotで毎朝chatworkに呟くようにしました。
このような機能は、cronを用いることで簡単に実装可能です。また、coffeescriptは書きなれていないので管理サイトへのログイン・データ取得部分はRubyで記述しました。
scripts/cron.coffee
cronJob = require('cron').CronJob
child_process = require 'child_process'
module.exports = (robot) ->
new cronJob('0 0 9 * * *', () =>
envelope = room: "xxxxxxxx"
child_process.exec "ruby external-scripts/get_hoge.rb", (error, stdout, stderr) ->
if !error
output = stdout+''
robot.send envelope, output
else
robot.send envelope,"error"
).start()
coffeescriptでは9時にrubyを実行し、実行結果をchatworkで発言しているだけです。
Rubyのスクリプト部分では、mechanizeを使ってスクレイピングによってデータの取得を行っています。
今後やりたいこと
現在は、管理サイトやテスト環境とchatworkの連携のみを行い、定期的な作業や頻繁に実行するコマンドなどを
cronやchatwork上での発言をトリガとしてhubotで行えるようにしています。
今後はGoogle Apps ScriptやSpreadSheetとも連携して、集計系を完全自動化したいと考えています。