githubがリポジトリのイベント通知でMQTTに対応していると聞いて


参考：https://github.com/github/github-services/blob/master/docs/mqttpub

リポジトリへpushがあったりしたら通知を受け取れるらしいです。
その通知先としてMQTTのbrokerが指定できると聞いて、時雨堂さんのサービス https://sango.shiguredo.jp/ を今なら無料で試用できることだし、早速やってみました。

## githubでの設定方法 リポジトリ毎に設定します

1. githubの自分のリポジトリを選んで Settings をクリック
1. Webhooks & Servicesをクリック
1. Add Serviceをクリックして出てくるリストの中からMQTT publishを選ぶ
1. 確認のためにパスワードを入力する
1. 以下の項目を入力（いくつかは省略可能）

+ Broker : 省略するとq.m2m.ioを使うとあるが、今は運用してないかもなので、自分は時雨堂さんが公開してくれているsangoのサービスを利用した
+ Port : これは省略すればデフォルトの1883番なので省略しても多分大丈夫
+ Topic : これは好きなものを指定できるが、あとで受け取るときに必要なのでメモしておく。"githubユーザー名/リポジトリ名"のような形なら、subscriber側で選択もできるので、おすすめされています。
+ Clientid : これは省略してもいいが、適当な名前をつけてかまわない
+ User : MQTTサーバー側でユーザー認証している場合に入力
+ Pass : これもMQTTサーバー側でユーザー認証している場合に入力
+ Retain : subscriberが繫ぐ前にとどいていたメッセージをMQTTサーバーが保存していてほしければチェックする
+ Active : これをチェックすれば、今後リポジトリにcommitなどのイベントがあったらMQTTサーバーに通知してくれる。これをオフにすれば、設定は破棄せずに通信を止められる


## Subscribeしておきます

MQTTのclientはshirouさんのmqttcliを利用しました。
https://github.com/shirou/mqttcli


```
$ mqttcli sub -t "githubで指定したトピック"
```


## では、commitをpushしてみましょうかね

```
$ cd git/erlandom
$ vi k.erl
$ git add k.erl
$ git commit -m 'test'
[master 424e392] test
 1 file changed, 1 insertion(+)
 create mode 100644 k.erl
$ git push
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 274 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To https://github.com/kgbu/erlandom.git
   2acc6fb..424e392  master -> master

```


## subscriberが受け取ったデータ

topicは自分のgithubアカウントにリポジトリ名が付いていて、sangoで登録しているものとぴったりマッチ。（topic名を表示したい場合にはmqttcliのsubscriber側で-dのオプションを付けます）

message bodyはこんな感じのデータが飛んできました。4.7KBくらい。（
複雑なコミットだとsangoの無料版の制限の6KB越えてしまうかも。
それはそれ、エラーをチェックしてみたい気も。

```
{"ref":"refs/heads/master","after":"15dde3820b0f9e5e34dc987e51900ee9ea39f6d2","before":"1f2ce6f86d26e796153c8e5934edad3b63c988cb","created":false,"deleted":false,"forced":false,"compare":"https://github.com/kgbu/erlandom/compare/1f2ce6f86d26...15dde3820b0f","commits":[{"id":"15dde3820b0f9e5e34dc987e51900ee9ea39f6d2","distinct":true,"message":"test","timestamp":"2014-09-11T16:52:12+09:00","url":"https://github.com/kgbu/erlandom/commit/15dde3820b0f9e5e34dc987e51900ee9ea39f6d2","author":{"name":"OCAO Kazutaka Ogaki","email":"ocaokgbu@gmail.com"},"committer":{"name":"OCAO Kazutaka Ogaki","email":"ocaokgbu@gmail.com"},"added":["s.erl"],"removed":[],"modified":[]}],"head_commit":{"id":"15dde3820b0f9e5e34dc987e51900ee9ea39f6d2","distinct":true,"message":"test","timestamp":"2014-09-11T16:52:12+09:00","url":"https://github.com/kgbu/erlandom/commit/15dde3820b0f9e5e34dc987e51900ee9ea39f6d2","author":{"name":"OCAO Kazutaka Ogaki","email":"ocaokgbu@gmail.com"},"committer":{"name":"OCAO Kazutaka Ogaki","email":"ocaokgbu@gmail.com"},"added":["s.erl"],"removed":[],"modified":[]}
 :
```

## とりあえず実験中のこと、ログの保存（jqで整形するようにしました)

###注意：subscriberを繫ぎっぱなしにすると、接続を維持するためのパケットがときどき流れます。パケット数に上限がある場合はご注意を。

受け取ったデータをどうするか考えつかなかったので、とりあえずログしています。
subscriberを起動する前にscreenコマンドを使ってコンソールログを```screenlog.0```というファイルに出すようにしておきました。
データを確認したいときはscreenのログファイルの中身を見ます。
また、端末ソフトを開きっぱなしにしなくてもかまいません。


```
$ screen -L
$ mqttcli sub -t "topic"
(ここでCtrl-A, 'd'のキーを打って、screenのコンソールを切り離します）
$ tail -f screenlog.0
```

subscriberのコンソールに再接続したい場合は次のようにします

```
$ screen -r
```

### 例：jqでテキスト整形してみる(2014.9.16追記)

デバッグ情報を止めて、JSONのテキストだけを入力すれば、もっともシンプルなフィルター'.'でもって整形してもらえる。（shirouさんのアドバイスありがとうございました）

```
$ mqttcli sub -t "github用のトピック/#" | jq '.'
```

別端末でgit pushしてみるとJSONデータが送られてきて、今度は見やすく整形されています。

```
{
  "pusher": {
    "email": "ogakikz@jin.gr.jp",
    "name": "kgbu"
  },
  "repository": {
    "master_branch": "master",
    "stargazers": 2,
    "default_branch": "master",
    "watchers": 2,
    "open_issues": 3,
:
```

### 例：author, added, removed, modifiedを取り出す(2014.9.16追記)

subscribe側

```
$ mqttcli sub -t "トピック/#" | jq '.commits  | .[] | .author, .added, .removed, .modified'
```

今度はtest.txtを消してk.srcというファイルを追加してみました

```
$ cd multiBroker
$ vi k.src
$ rm test.txt
$ git rm test.txt
rm 'multiBroker/test.txt'
$ git add k.src
$ git commit -m 'test to k.src'
[master ac0d53f] test to k.src
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename multiBroker/{test.txt => k.src} (100%)
$ git push
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 338 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To https://github.com/kgbu/erlandom.git
   534648b..ac0d53f  master -> master
```


取得結果

```
{
  "email": "ocaokgbu@gmail.com",
  "name": "OCAO Kazutaka Ogaki"
}
[
  "multiBroker/k.src"
]
[
  "multiBroker/test.txt"
]
[]
```