参考:https://github.com/github/github-services/blob/master/docs/mqttpub
リポジトリへpushがあったりしたら通知を受け取れるらしいです。
その通知先としてMQTTのbrokerが指定できると聞いて、時雨堂さんのサービス https://sango.shiguredo.jp/ を今なら無料で試用できることだし、早速やってみました。
githubでの設定方法 リポジトリ毎に設定します
- githubの自分のリポジトリを選んで Settings をクリック
- Webhooks & Servicesをクリック
- Add Serviceをクリックして出てくるリストの中からMQTT publishを選ぶ
- 確認のためにパスワードを入力する
- 以下の項目を入力(いくつかは省略可能)
- 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"
]
[]