その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

App::GitHubWebhooks2Ikachanが出た

長い名前だ!!! そしてマニアック.
https://metacpan.org/release/App-GitHubWebhooks2Ikachan
https://github.com/moznion/App-GitHubWebhooks2Ikachan

これは何

GitHubのWebhooksを受け取って,いい感じにしてIkachanに投げる君です.
現状,issuespull_requestissue_commentpushの各イベントに対応しています.


雰囲気としてはこんな感じの通知がIRCに飛ぶ.

[issue opened] This is new issue (@moznion) https://github.com/moznion/sandbox/issues/13
[comment (#13)] foobar (@moznion) https://github.com/moznion/sandbox/issues/13#issuecomment-37093289
[push to master] Commit1 (@moznion) https://github.com/moznion/sandbox/commit/b4da12df1bc19d2b20d7ab8a11fe9a4413ddf509
[push to master] Commit2 (@moznion) https://github.com/moznion/sandbox/commit/e2e64cea713dbfb574f1ace80a4be6c55f98433d
[pull request opened] New Pull Request (@moznion) https://github.com/moznion/sandbox/pull/15


GitHubのWebhooksの詳細については以下などを参照いただくと良いでしょう.
http://developer.github.com/webhooks/
http://developer.github.com/v3/activity/events/types/

使い方

まず何はなくともサーバを立ち上げます.
CPAN経由でこのアプリケーションをインストールするとgithubwebhooks2ikachanというコマンドがインストールされるのでそれを使って以下のように立ち上げるのが良いでしょう.

$ githubwebhooks2ikachan --ikachan_url=http://your-ikachan-server.com/notice --port=12345

この時,ikachan_urlは必須です.portはオプショナルです.デフォルトだと5555番ポートが使われます.


次にGitHubのWebhooksを登録します.
リポジトリの設定のところから“Webhooks & Services”を開いてWebhooksの設定を行います.
「どのイベントの時にWebhook送ってほしい?」って部分は“Send me everything”にしておけば良いと思います.

肝心のPayload URLは以下のようになるでしょう.

http://your-githubwebhooks2ikachan-server.com/${path}?subscribe=issues,pull_request&issues=opened,closed&pull_request=opened

${path}の部分は通知を送りたいIRCのチャンネル名になります.
つまり,http://your-githubwebhooks2ikachan-server.com/%23foobarとか書いておくと,#foobarにメッセージが飛びます.

クエリパラメータのsubscribeの部分は通知を飛ばして欲しいイベント名をコンマセパレ―テッドで指定できます.
例えば,subscribe=issues,pull_requestと書くと,issuesイベントとpull_requestイベントだけ通知するようになります.
このパラメータを省略した場合は,対応しているイベントすべて *1 のWebhookが飛んできた時に通知します.

issuespull_requestパラメータは通知を飛ばして欲しいアクション名をコンマセパレ―テッドで指定できます.
例えば,issues=open,closeのように書くと,issueがopenされた時とcloseされた時にだけ通知を飛ばすようになります.
パラメータを省略した場合はすべてのアクションに対して通知します.

いろいろ

本当はissuesやpull_requestとかだけではなく任意のイベントを差し込めたり,NotifierをIkachanだけではなくて他のものに差し替えられたり,出力フォーマットを好みの形に変更できたりする予定だったんですが,複雑性が増す上に利用側に結構な量のconfigを書いてもらわなければならなくなったので,今の形に落ち着きました.

「このイベントが取れないとは何事だ!」みたいなお叱り等ございましたら,Issueなどに登録していただけると対応しますのでよろしくお願いします.

*1:つまりissuespull_requestissue_commentpush