お久しぶりです。Perfumeエンジニアの新井です。
前回のPerfumeの3Dデータに関する記事が周りからのリアクションがよかったため、これからはPerfumeのさらなる社内広報も兼ねてこのブログで色々紹介していきたいと思います。
前回の記事のときには、ライブBlu-ray&DVD『Perfume 4th Tour in DOME 「LEVEL3」』の発売カウントダウンしていたPerfumeのグローバルサイトでは、先週のリリースを記念して、新しいコンテンツ「Dome Tour Emulator」が現在公開されています。
「Sleeping Beauty」の時に行なわれた、ライブ当日に撮影した参加者の3Dスキャンを映し出すというパフォーマンスがサイト上で追体験できちゃいます。
このページでは、ライブ当日にスキャンされた参加者の3Dデータがアップされているだけでなく、TwitterやInstagramの写真を代わりに使用できるので、ライブに参加していない人でも楽しめます。とりあえず、めちゃくちゃかっこいいので興味がある方は一度見てみてくださいm(_ _)m
ということで、本題に入ります。
今回は、Github社製のBotフレームワーク『Hubot』とAtlassian社製のチャットサービス『HipChat』を使って、色々遊んでみたいと思います。
Hubotってなに?
Githubが作ってるOSSのBotフレームワークで、Github社で運用の中心的なツールとして使われているらしいです。(Hubot君かわいい…)
http://hubot.github.com
HipChat, Skype, IRCなどのチャットツールにHubotをログインさせ、チャットで話しかけることで、デプロイやらビルドといった共通の運用タスクを自動化してくれるといったことが可能となります。
こんな感じの開発運用スタイルを「ChatOps」というらしいです。
HipChatってなに?
『HipChatは企業やチームのためのホスティング型プライベートチャットサービスのことで、継続的に使えるチャットルーム、チャット履歴の保存、外部サービスとの連携に便利なAPI、などの特徴を持ちます。』とあります。
http://blog.qnyp.com/2013/05/27/hipchat-driven-development/
使い勝手も良く、GitHubやJenkinsなどと連携させて通知を飛ばすこともできたりと便利なツールです。
5ユーザーまで無料で使えるので、社内でも少人数チームでは導入しているとこもあるんですが、ぜひとも全社的に導入したいなと思ってます。。 |ω・`)チラ
(※ 5ユーザーを超えると、$2/ユーザー/月の料金となります)
https://www.atlassian.com/ja/software/hipchat/overview
色々インストールやら準備をしてみる
データ永続化のためのredisをインストール
1 |
% brew install redis |
Hubot(coffee-scriptも合わせて)インストール
1 2 3 |
% npm install -g hubot coffee-script % mkdir hoge % hubot --create hoge |
HipChat用のアダプタをインストール
1 |
% npm install --save hubot-hipchat |
HipChatでアカウントとルームを作成
ここで以下の4つのデータを確認しておきます。
・ルームのOwnerアカウントのAPIアクセストークン
・HubotアカウントのJabber ID
・Hubotアカウントのパスワード
・ルームの名前
起動スクリプトを作成
1 2 3 4 5 6 |
export HUBOT_HIPCHAT_TOKEN="ルームのOwnerアカウントのAPIアクセストークン" export HUBOT_HIPCHAT_JID="HubotアカウントのJabber ID" export HUBOT_HIPCHAT_PASSWORD="Hubotアカウントのパスワード" export HUBOT_HIPCHAT_ROOMS="ルームの名前" exec node_modules/.bin/hubot "$@" -n Hubotの名前 -a hipchat |
こんな感じのシェルスクリプトを用意しておけば、コマンド一発でHubot君が起動してくれます。
実際に動かしてみる
これで準備は整ったんで、実際にHubotを動かしてみましょう。
1 2 3 |
% redis-server /usr/local/etc/redis.conf % redis-cli redis 127.0.0.1:6379> |
こんなコマンドでredisを走らせて、さっき作成したシェルスクリプトを叩くとHubot君がjoined the roomしてくれます。
部屋に入ってきてくれたら、Hubot君にデフォルトでインストールされているコマンドを実行させてみましょう。
ping
1 2 3 |
@Hubot ping PONG |
Hubot ping – Reply with pong
pingと話しかけたら、pongと返すだけのコマンドです。簡単ですね。。
pug me
1 2 |
@Hubot pug me http://25.media.tumblr.com/tumblr_mbnh52cctT1r3ip8io1_500.jpg |
Hubot pug me – Receive a pug
パグの画像を返してくれます。癒されますね。。
map me
1 2 |
@Hubot map me ebisu http://maps.google.com/maps/api/staticmap?markers=ebisu&size=400x400&maptype=roadmap&sensor=false&format=png |
Hubot map me query
.
地図の検索結果を返してくれます。賢いですね。。
animate me
1 2 |
@Hubot animate me かしゆか http://25.media.tumblr.com/tumblr_m57g3degw91qdx3jjo1_500.gif#.png |
Hubot animate me image me
, except adds a few parameters to try to return an animated GIF instead.
キーワードで検索したgif画像を返してくれます。かっこいいですね。。
コマンドを自作してみる
さっきのpingなどのコマンド実行のときに読み込まれているスクリプトはhoge/scripts配下にあります。
このスクリプトはCoffeeScriptで書かれているのですが、試しにping.coffeeファイルを見てみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# Description: # Utility commands surrounding Hubot uptime. # # Commands: # hubot ping - Reply with pong # hubot echo <text> - Reply back with <text> # hubot time - Reply with current time # hubot die - End hubot process module.exports = (robot) -> robot.respond /PING$/i, (msg) -> msg.send "PONG" robot.respond /ADAPTER$/i, (msg) -> msg.send robot.adapterName robot.respond /ECHO (.*)$/i, (msg) -> msg.send msg.match[1] robot.respond /TIME$/i, (msg) -> msg.send "Server time is: #{new Date()}" robot.respond /DIE$/i, (msg) -> msg.send "Goodbye, cruel world." process.exit 0 |
ここにある’respond’とは、Hubotに直接メンションした時のみ(@Hubotみたいに)、コマンドを実行させたい場合に記述します。
チャット上に出現した特定のワードに反応して、コマンドを実行させたい場合は’hear’を使用します。
‘respond’または’hear’のあとに記述されている’/PING$/i’などは、正規表現となってます。
こんな感じでHubotに反応させるワードを指定した後に、実行させたいコマンドを書いてあげれば大丈夫です。
それでは、簡単なコマンドを作ってみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# disco.coffee module.exports = (robot) -> robot.hear /チョコレイト/, (msg) -> robot.brain.data.disco_count = 0 unless robot.brain.data.disco_count robot.brain.data.disco_count += 1 robot.brain.save if robot.brain.data.disco_count < 3 then msg.send "ディスコ!" if robot.brain.data.disco_count == 3 then msg.send "ディスコ!ディスコ!ディスコ!https://www.youtube.com/watch?v=eoM665paLKM" if robot.brain.data.disco_count > 3 then msg.send "ワンルーム・ディスコもいい曲だから、聞いてみて!https://www.youtube.com/watch?v=V3Y90dI0EKk" robot.hear /ワンルーム・ディスコ聞いたよ/, (msg) -> robot.brain.data.disco_count = 0 robot.brain.save msg.send "Resetしといたよ(`・ω・´)キリッ" |
このスクリプトでは’hear’を使っているので、@Hubotと呼びかけなくてもチャットでつぶやくと勝手に反応してくれます。
またredisでチャットのデータを保存してくれているので、それを試してみます。
上記のように、robot.brain.data以下にデータを登録していて、robot.brain.saveをすると永続化されます。実行してみると、きちんとdisco_countがカウントされて保持されているのがわかりますね。
HipChatのiphoneアプリで見ると、こんな感じになります。
Githubに公開されているスクリプトを覗いてみる
Githubでたくさん便利なスクリプトが公開されているので、ぜひ参考にしてみてください。
ここで公開されているtwitter.coffeeというスクリプトが楽しそうなので、実行してみましょう。
このコマンドは、
hubot twitter ‘twitter username’ – Show last tweet from ‘twitter username’
とあるので、指定したtwitterアカウントの最新のtweetを返してくれるみたいです。
(※ こういったコマンドの使い方は@Hubot helpで教えてくれます。)
それではtwitterAPIのアクセストークンやらを準備できたら、アライドのあいおーえす あぷりけーしょん えんじにあ @happy_ryoのツイートをちょっと覗いてみます。。
・・・・・・・・・・∑(; ̄□ ̄
まとめ
今回はHubotで遊んでみましたが、実用的なことはなにもなかったですね。。
上のほうでも書きましたが、Jenkinsとかと連携させたり、ビルドやデプロイなどをchatから行えるようにするのが、Hubotのかっこいい使用方法です。
この記事でHubotやらChatOps的なものに興味を持ったら、ぜひやってみてください。
さて4月になって、うちにも新卒エンジニアが4人入社しました。
もうしばらくしたら、彼らもこのブログに登場するかなと思います。
楽しみに待っていてくださいm(_ _)m
こんにちは。アライドには2013年に新卒で入社しました。 Perfume × ラクロス × エンジニア といった感じです。お手柔らかにお願いしますm(_ _)m