SlackでHubotとCircleCI使ってHerokuにDeployできるようにしてみた

どうもこんにちは。最近 twitter 再開しました (宣伝)

今日は知り合いが Slack に招待してくれたので Hubot でアレコレしたのをまとめてみます。

Hubotをとりあえず導入

まずは Slack に Hubot を導入する必要があります。今回は Heroku で動かそうと思います。
こちらのページを参考にしました。

Local環境整備

最初に hubot を local で動かすための環境を準備します

$ brew install node redis
$ npm install -g hubot coffee-script

これを入れておけば hubot の application のひな形を作成可能です。試しに作ってみます。

$ hubot --create test_bot
$ cd test_bot
$ ls -l
total 48
-rw-r--r--   1 sasarky  staff    36  6 15 17:40 Procfile
-rw-r--r--   1 sasarky  staff  5903  6 15 17:40 README.md
drwxr-xr-x   4 sasarky  staff   136  6 15 17:40 bin
-rw-r--r--   1 sasarky  staff     3  6 15 17:40 external-scripts.json
-rw-r--r--   1 sasarky  staff    40  6 15 17:40 hubot-scripts.json
-rw-r--r--   1 sasarky  staff   609  6 15 17:40 package.json
drwxr-xr-x  15 sasarky  staff   510  6 15 17:40 scripts

こんな感じで、必要なファイルがある程度出来上がっています。

Localで実行

では先ほど作成した hubot のひな形を実際に実行してみます。
実行するには redis-server を動かして置く必要があります

$ redis-server&

これで hubot が動くはず。
初回起動時にはいろいろインストールしてるので眺めてればOK

$ bin/hubot

Hubot> hubot ping
Hubot> PONG
Hubot>

HerokuへDeploy

これでローカルで動くようになったので、次は Heroku に Deploy してみる
Heroku の登録や ssh key などは省略します。Heroku コマンドを使うために heroku toolbelt みたいなのを予めインストールしておいてください。Heroku のページから download 可能です

まずは Heroku へ application の登録から。

# heroku へログインします。 mail, password を入力すればOK
$ heroku login
# このコマンドでアプリケーションを作成できます
$ heroku create testbot
# おまじないだと思って撃ちこめばOK
$ heroku addons:add redistogo:nano

それといくつかファイルを編集しておく必要があります。↓のとおりにしておけば大丈夫なはず。

  • Procfile
web: bin/hubot --adapter slack
  • ~/.ssh/config
Host heroku.com
    HostName heroku.com
    IdentityFile ~/.ssh/id_rsa
    User git

準備は整いました。下記コマンドで Deploy 完了です。

$ git commit -am "initial commit"
$ git push heroku master
$ heroku ps:scale web=1

Slack連携

この段階で Heroku へデプロイまでが終わっていると思います。
続いては Slack と連携してみましょう。
Slack の integration で Hubot がありますのでそこから Hubot との連携に必要な Token などの情報が確認できます。それを↓のようにして heroku へ設定します。
この時についでに hubot の slack adapter も一緒にインストールします。

# slack と hubot をつないでくれる adapter みたいなやつを install
$ npm install hubot-slack --save

# 各環境変数を設定
$ heroku config:add HEROKU_URL=<url>
$ heroku config:add HUBOT_SLACK_TOKEN=<token>
$ heroku config:add HUBOT_SLACK_TEAM=<team>
$ heroku config:add HUBOT_SLACK_BOTNAME=<botname>

この辺を設定しておけばあとは Slack で発言すれば hubot が反応してくれます

f:id:sasarky:20140615181323p:plain

HubotでDeploy

hubot をいじっていると各々のローカルの環境で 'git push heroku master' とかをしないといけなくてめんどうだなー。とかあったので hubot さんのコマンドで Deploy できないか試行錯誤してみました。

hubotでgithub

まずは Hubot で GithubAPI を叩けるようにしたいです。
今回は githubot を使いました。これを使えば基本的な API を叩くことが可能です。
GithubAPI を叩くためには Github と Heroku の設定で Token の登録だったかをしないといけなかった気がする

これを package.json に追加してあげて

  "dependencies": {
# 略
    "githubot": "*"
  },

こんなかんじのコードを書けば、 githubAPI をつかえます

github.get "#{url_api_base}/repos/#{user}/#{repo}/compare/master...develop", (info) ->

ちなみにこれは master と develop branch の diff を表示してくれるやつ

f:id:sasarky:20140615184644p:plain

githubAPI を使って master へ merge する script を用意して(各々の運用方法によってどうするかは変わると思うけど)あげれば、 slack 上で github の操作が可能になります。

CircleCI でHerokuへDeploy

Hubot から Github を操作することはできるようになりましたが、 Heroku への Deploy も一緒にやってもらって楽をしたいです。
Heroku へ Deploy する方法はいくつかあると思いますが、一番手軽そうな CircleCI を利用しようと思います。 CircleCI は github account で登録可能で、どのリポジトリをどういう風にやるか。みたいな感じのことを設定できて簡単に導入できました。 挙動などの設定はプロジェクトのルートに circle.yml をおいておけばあとは push 時に勝手に動いてくれます。テストとかもガッツリできるんですけど、今回は deploy が目的なので簡単な設定です

  • circle.yml
deployment:
    production:
        branch: master
        heroku:
            appname: <heroku の application name>
test:
    post:
        - echo hoge

この設定は master branch に push があったら heroku に deploy してくれます。
実際に動かしてみると、こんなかんじでやってくれます。

f:id:sasarky:20140615185432p:plain

これで Slack 上で Hubot を介して Heroku に Deploy できるようになりました。

最後に

ブログかくの苦手だってことがわかりました。