最近、GitHub API のWebHookを使っていろいろ自動化をトライしてみてます。なので、少し調べてみた。
WebHook自体は以下のURLを参照ください。
– https://developer.github.com/webhooks/
ここでは、私が実際に行った作業の備忘録かねて残していく、というスタンスで記載します。
WebHookの登録
通常のGitHubなら、SettingのWebhooks & ServicesからWebHookを登録することができます。(2014/07/06時点)
以下が選択式で設定可能なWebHook一覧です。

ざっと見ていると、例えば
- pull requestが作成されたらxxを行う、閉じられたらyyを行う
- issuesが作成されたらxxを行う、閉じられたらyyを行う
ということができるようになることが期待できそう。
上記の他にも、例えば以下のようにコマンドから好きなイベントを登録することができます。GitHub Enterpriseのように、上図のような設定がGUIからは無い場合含め、利用することができます。
require 'octokit' #Ruby向け、GitHub API操作用ライブラリ
client = Octokit::Client.new access_token: ACCESS_TOKEN
client.create_hook(
'target/repository_name',
'web',
{url: 'http://example.com/hook', content_type: 'json' },
{events: ['push', 'pull_request', 'issues'], active: true } )
client.hooks 'target/repository_name' # 登録後状態の確認
eventsで追加可能な内容は以下を参照ください。
他、既存設定の編集、削除も可能ですがここでは明記しません。
WebHookを受け取る側
WebHookの設定をしたら、どうせならそれを受け取って何か操作を実施する側も作りたいですね。
JenkinsやHipChatをはじめとした有名どころはプラグインという形で提供されていますが、例えば自分たちにあった形でより柔軟に処理を変更したいなどあれば、以下のようなhookを仲介するような簡易サーバをたてることが役立つと思います。
例えば、sinatraを使ったRubyで記述すると以下のような形で書けます。
require 'sinatra'
require 'octokit'
require 'json'
post '/hook' do
delivery_id = request.env["HTTP_X_GITHUB_DELIVERY"]
github_event = request.env['HTTP_X_GITHUB_EVENT'] #GitHubのhookしてくるイベントを取得
req_body = JSON.parse(request.body.read) #body部を取得
repository = req_body['repository']['full_name'] # repository名を取得
case github_event
when 'pull_request'
# pull_requestのイベントの時に行う処理
when ...
...
else
'適当な処理'
end
end
こういうのもできそう
ふと思い立つのは、pull requestがあれば機械的に何かする、というものですが、よく見てみるとreleaseのwebhookもあるのですね。
これ使えば、例えば
tagをうつ => Jenkins氏を起動させる => ビルドさせる => 成果物
という流れにできそう。
つまること、開発者はgithubのみに対してアクションすれば、Jenkins氏とのやり取りは気にしなくてよい世界になる、ということ。いいですね。これ。誰でもGithubにタグうつことができれば、成果物を作ることができる世界。
※既存のJeknins向けプラグインでどこまでできるか把握していないので、そこはあしからず・・・
いずれ・・・
いずれ、もしかするとエンジニアはGitHubだけ気にしておけば、その裏でAndroid/iOS/Web問わず処理が走り期待する結果を得ることができる、という世界になりそう。