sekaie engineers' blog

セカイエ株式会社が主催するエンジニア勉強会について

セカイエ chatops 始めたってよ #1: 入門編

おはようございます。こんにちは。こんばんわ。

セカイエアドベントカレンダー15日目担当の佐々木です。

qiita.com

今日はセカイエの chatops を始めるまでを記録に残したいと思います。

まだ始めていない方もこれを機に一緒に始めませんか?

はじめに

今回の chatops では hubot を利用してみようと思います。うまくいくかなドキドキ

今日の目的は以下のとおりです

  • ローカル環境に hubot 開発環境を導入する
  • チャットツール (今回は chatwork) と連携する
  • 社内ツールAPIを叩いて chatwork に流す

導入編

Hubot をインストール

まずはこれがないと始まりません。とりあえず入れます。

$ npm install -g hubot coffee-script

つづいて hubot 用ファイルを生成します

$ hubot --create .
'hubot --create' is deprecated. Use the yeoman generator instead:
    npm install -g yo generator-hubot
    mkdir -p .
    cd .
    yo hubot
See https://github.com/github/hubot/blob/master/docs/index.md for more details on getting started.

怒られた。いつの間にか hubot generator は yoeman に移行してたみたいです。流れは早い。

この辺から過去の記憶に頼るのは諦めて、ドキュメントを見ながらちゃんとやりました

https://hubot.github.com/docs/

$ npm install -g yo generator-hubot
$ yo hubot --adapter chatwork

なんか色々生成してたので見てみます

$ ls -l
total 48
-rw-r--r--   1 takuya.sasaki  2028347278    27 12 25 19:19 Procfile
-rw-r--r--   1 takuya.sasaki  2028347278  7895 12 25 19:19 README.md
drwxr-xr-x   4 takuya.sasaki  2028347278   136 12 25 19:19 bin
-rw-r--r--   1 takuya.sasaki  2028347278   213 12 25 19:19 external-scripts.json
-rw-r--r--   1 takuya.sasaki  2028347278     2 12 25 19:19 hubot-scripts.json
drwxr-xr-x  15 takuya.sasaki  2028347278   510 12 25 19:19 node_modules
-rw-r--r--   1 takuya.sasaki  2028347278   633 12 25 19:19 package.json
drwxr-xr-x   3 takuya.sasaki  2028347278   102 12 25 19:19 scripts

起動してみる

sekaie-hubot> sekaie-hubot help
sekaie-hubot> sekaie-hubot adapter - Reply with the adapter
sekaie-hubot animate me <query> - The same thing as `image me`, except adds a few parameters to try to return an animated GIF instead.
sekaie-hubot echo <text> - Reply back with <text>
sekaie-hubot help - Displays all of the help commands that sekaie-hubot knows about.
sekaie-hubot help <query> - Displays all help commands that match <query>.
sekaie-hubot image me <query> - The Original. Queries Google Images for <query> and returns a random top result.
sekaie-hubot map me <query> - Returns a map view of the area returned by `query`.
sekaie-hubot mustache me <url|query> - Adds a mustache to the specified URL or query result.
sekaie-hubot ping - Reply with pong
sekaie-hubot pug bomb N - get N pugs
sekaie-hubot pug me - Receive a pug
sekaie-hubot the rules - Make sure sekaie-hubot still knows the rules.
sekaie-hubot time - Reply with current time
sekaie-hubot translate me <phrase> - Searches for a translation for the <phrase> and then prints that bad boy out.
sekaie-hubot translate me from <source> into <target> <phrase> - Translates <phrase> from <source> into <target>. Both <source> and <target> are optional
ship it - Display a motivation squirrel

動きました

chatwork と連携してみる

ローカルで動くところまでは特に問題なく行きましたので。続いて chatwork と連携してみます。

Hubot には各チャットとのアダプタが用意されているのでそれを利用します。

https://hubot.github.com/docs/adapters/

github.com

このアダプタのREADMEを見ながら環境変数を設定していきます。

export HUBOT_CHATWORK_TOKEN="XXXXX"
export HUBOT_CHATWORK_ROOMS="XXX"
export HUBOT_CHATWORK_API_RATE="350"

そのまま流れるように起動

$ ./bin/hubot -a chat work

起動は成功してるので、チャットルームで発言してみます

f:id:sekaie:20151225194752p:plain

無事起動して、chatwork と連携する所まで来ました。

さて、ここから chatoops 用のコードを書いていきましょう。

chatops に向けて

chatops における hubot の役割

Hubot は chatops における統合ユーザインタフェースとして頑張ってもらうことにしましょう。

社内ツール複数存在しており、それらのツール全てにおいてチャットからアクセス可能な形をとるために hubot には仲介役に入ってもらいます。

f:id:sekaie:20151228144320p:plain

デプロイツールとの連携

今日は社内用デプロイツールがあるので、それと hubot を連携してみましょう

デプロイツールAPI

デプロイツールのサーバサイドは Rails で作られていて、基本的にはどの機能も Web API からアクセス可能です。

なのでまず手始めにデプロイジョブを Hubot から呼べるようにしてみます

デプロイジョブリストのエンドポイントは /api/jobs でアクセス可能です

hubot から API を叩く

社内ツールAPIの準備は出来たので、hubot から API を叩いて見ます。

$ ls -l scripts
total 8
-rw-r--r--  1 takuya.sasaki  2028347278  368 12 26 18:31 deploy.js

$ ls -l class/hubot
total 8
-rw-r--r--  1 takuya.sasaki  2028347278  322 12 26 18:32 deploy.js

scripts/deploy.js

ここは hubot のコントローラ的な立ち位置で、 input とその時の処理 + output だけを記述することにします

var _ = require('underscore');
var hubot_deploy = require('../class/hubot/deploy')

module.exports = function(robot) {
  robot.respond(/deploy\sjobs/, function(msg) {
    hubot_deploy.jobs(function(jobs) {
      _.each(jobs, function(job) {
        msg.send("[" + job.created_at + "] id: " + job.id + ", project: " + job.project.screen_name);
      });
    });
  });
};

class/hubot/deploy.js

ここはサービス層としてモジュール風に記述していきます

ここに前述した社内ツールAPIにアクセスしてそれをコールバックする記述を行います

var request = require('request');

var HubotDeploy = function() {

  HubotDeploy.prototype.jobs =  function(callback) { // {{{
    var host = 'http://XXXXXXXX/api/jobs';

    request.get(host, function(err, res, body) {
      callback(JSON.parse(body));
    });
  }
  // }}}
}

module.exports = new HubotDeploy

chatwork から hubot 叩いてみる

それでは指定のエンドポイントに投げてみます

f:id:sekaie:20151228142725p:plain

無事社内ツールAPIからデータを取ってくる事ができました。

おわりに

今日はセカイエアドベントカレンダー15日目でセカイエの chatops 入門編を紹介しました。

今日は入門編ということで簡単な社内ツールAPIを叩くだけでしたが、hubot を利用していろんなことができるのではないかなと夢が広がります。

ほな!