Ruby2.2.3でKandan+Hubot

今話題のHubotを導入し、日々の業務に少しの癒し（リス）と業務効率化を実現したいなと考えていましたが、導入には大きな障害がありました。
現在の業務ではインターネットとは完全に隔離された特殊なネットワーク環境で行うことが多いので、Hubot導入事例によくあるHipChatやSlackは使えませんでした。

そこで今回はOSSチャットアプリ「Kandan」にHubotを導入する方法をご紹介したいと思います。

# 対象
+ Hubotを手軽に試してみたい人
+ ローカル環境でHubotを導入したい人
+ ~~リスと戯れたい人~~

# 環境
+ OS: CentOS 6.7
+ Ruby: 2.2.3
+ MySQL: 5.1.73
+ Kandan: v1.2
+ Hubot: 2.4.7

# 事前準備
+ 必要なパッケージのインストール

```shell-session
$ sudo yum -y install epel-release
$ sudo yum -y install gcc zlib-devel openssl-devel git gcc-c++ libxml2-devel libxslt-devel nodejs npm
```

+ Ruby 2.2.3のインストール

```shell-session
$ cd /usr/local/src
$ sudo wget https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz
$ sudo tar xvf ruby-2.2.3.tar.gz 
$ cd ruby-2.2.3
$ sudo ./configure
$ sudo make
$ sudo make install
$ sudo /usr/local/bin/gem install bundler
```

+ MySQL 5.1.73のインストール

```shell-session
$ sudo yum -y install mysql mysql-server mysql-devel MySQL-python 
$ sudo chkconfig mysqld on
$ sudo service mysqld start
$ sudo mysql_secure_installation
  Enter current password for root (enter for none): 
  Set root password? [Y/n] Y
  New password: hoge1234
  Re-enter new password: hoge1234
  Remove anonymous users? [Y/n] Y
  Disallow root login remotely? [Y/n] n
  Remove test database and access to it? [Y/n] Y
  Reload privilege tables now? [Y/n] Y
```

# Kandan v1.2のインストール
+ git clone

```shell-session
$ git clone https://github.com/kandanapp/kandan.git
$ cd kandan
```
+ Gemfileの編集
 + 今回はDBにMySQLを使用するのでmysql2のコメントアウトを外す
 + 同様にpgをコメントアウト
 + バージョン明記しないとbundle install時に怒られるので追記

```shell-session
$ vim Gemfile
```

```rb:Gemfile
source 'https://rubygems.org'

# Core gems
gem 'rails', '~> 3.2.21'

# Database adapters
# gem 'pg'

# Uncomment next line when using MySQL database
gem 'mysql2', '0.3.20'

# 後略
```

+ Gemfile.lockの削除
 + 残しておくとエラーが発生するので・・・

```shell-session
$ rm Gemfile.lock
```

+ bundle install

```shell-session
$ bundle install --without development test --path vendor/bundle
```

+ databaseのconfig設定

```shell-session
$ vim config/database.yml
```

```yaml:config/database.yml
production:
  adapter: mysql2
  host: localhost
  database: kandan_production
  pool: 5
  timeout: 5000
  username: root
  password: hoge1234
```

+ DBの作成

```shell-session
$ RAILS_ENV=production bundle exec rake db:create db:migrate kandan:bootstrap
```

+ プリコンパイルの実行

```shell-session
$ vim config/environments/production.rb
```

```rb:config/environments/production.rb
Kandan::Application.configure do
  # Settings specified here will take precedence over those in config/application.rb

  # Code is not reloaded between requests
  config.cache_classes = true

  # Full error reports are disabled and caching is turned on
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true

  # Disable Rails's static asset server (Apache or nginx will already do this)
  config.serve_static_assets = true

# 後略
```

```shell-session
$ RAILS_ENV=production bundle exec rake assets:precompile
```

+ Hubotとの連携のためにソースを一部修正
 + 参考:https://github.com/kandanapp/kandan/pull/445/files

```rb:app/controllers/apis_controller.rb
class ApisController < ApplicationController
  before_filter :authenticate_user_from_token!
  before_filter :authenticate_user!
    
  def active_users
```

```rb:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery
  
  skip_before_filter :verify_authenticity_token, if: -> {request.format.json?}
  before_filter :force_approved_account
  before_filter :redirect_suspended_account
```

```rb:app/controllers/channels_controller.rb
class ChannelsController < ApplicationController
  before_filter :authenticate_user_from_token!
  before_filter :authenticate_user!
  before_filter :find_channel_by_name, :only => :show
  load_and_authorize_resource
```

```rb:config/routes.rb
    :sessions => "sessions"
  }
  devise_scope :user do

    # these are allow to access with auth_token
    get "/active_users" => "apis#active_users"
    get "/me" => "apis#me"

    resources :channels do
      resources :activities
      resources :attachments
    end

    authenticated :user do
      root :to => "main#index"

      get '/search' => "main#search"

      resources :users, :only => [:index, :show]

      get "/users/edit" =>"main#users_edit"
```

+ Kandanの起動
 + デフォルトだと3000ポートで起動

```shell-session
$ bundle exec thin start -p 3000 -e production
```

+ Webからアクセスして動作確認
 + http://localhost:3000/
 + Username: admin
 + Password: kandanappadmin


# Hubot 2.4.7
## 事前準備
+ Kandan側でHubot用のアカウントとアクセストークンを作成する

```shell-session
$ RAILS_ENV=production bundle exec rake kandan:boot_hubot
$ RAILS_ENV=production bundle exec rake kandan:hubot_access_key
Your hubot access key is アクセストークン
```

## インストール
```shell-session
$ git clone https://github.com/github/hubot.git
$ cd hubot
$ git checkout v2.4.7
$ npm install
$ make package
$ cd hubot
```

# Kandan用Hubotアダプタのインストール
+ git clone

```shell-session
$ git clone https://github.com/kandanapp/hubot-kandan.git node_modules/hubot-kandan
```

+ npm install

```shell-session
$ npm install faye ntwitter
```

+ hubot-kandanのバージョンを1.0から1.0.0に変更

```shell-session
$ vim node_modules/hubot-kandan/package.json
```

```json:node_modules/hubot-kandan/package.json
{
  "name":        "hubot-kandan",
  "version":     "1.0.0",
# 後略
```

+ hubot-scripts.jsonの編集
 + "redis-brain.coffee"の削除

```shell-session
$ vim hubot-scripts.json
```

```shell-session
["tweet.coffee", "shipit.coffee"]
```

+ 環境変数の設定

```shell-session
$ vim ~/.bashrc
```

```bash:~/.bashrc
# Kandan Host Name
export HUBOT_KANDAN_HOST=localhost
# Kandan Port
export HUBOT_KANDAN_PORT=3000
# Hubot Kandan Token
export HUBOT_KANDAN_TOKEN=アクセストークン
# Hubot Log Level
export HUBOT_LOG_LEVEL=debug
# Hubot Port
export PORT=3001
```

```shell-session
$ source ~/.bashrc
```

+ Hubotの起動
 + external-scripts.jsonやhubot-scripts.jsonがある階層で実行

```shell-session
$ ./bin/hubot -a kandan
```

+ Kandan上でHubotがconnectされる
+ `@hubot ship it!`とメッセージした際にリスの画像が表示されれば成功
+ そのままで使えるコマンドが少ないので、色々とチューニングが必要です

# 参考にさせていただいた記事
+ [社内でHipChatクローンのKandanとHubotを動かす](http://qiita.com/tenten0213/items/7ed9159b96b1d894ee8b)