LoginSignup
18
18

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-09-12

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

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

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

  1. githubの自分のリポジトリを選んで Settings をクリック
  2. Webhooks & Servicesをクリック
  3. Add Serviceをクリックして出てくるリストの中からMQTT publishを選ぶ
  4. 確認のためにパスワードを入力する
  5. 以下の項目を入力(いくつかは省略可能)
  • 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"
]
[]
18
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
18