[GitLab] WebHook機能から送られてくるデータ形式まとめ

GitLabのWebHook機能で、GitLabから送られてくるデータをまとめてみました。
※ 現時点で不明な部分は判明次第更新予定です。

# 環境

* GitLabのバージョン: **XX**
* GitLab付随のサンプルプログラム( **print_http_body.rb** )を利用
 * print_http_body.rbはGitLabからPOST送信で送られてきたデータをそのまま出力するプログラムです
* サンプルプログラムを実行するサーバのOS: **RHEL6.6**
* サンプルプログラムを実行するサーバのRubyのバージョン: **1.8.7**

# GitLabから送られてくるデータフォーマット

## データ形式

イベント発生時にGitLabから送られてくるデータは **JSON** 形式です。

## イベントの種類

GitLabでは、以下の4つのイベントが発生した際にGitLabからデータを送るように指定できます。

* Push events
* Tag push events
* Issues events
* Merge Request events

GitLabから送られてくるイベントの種類は、送られてきたJSON形式のデータの ```object_kind``` のキーにより判別できます。

|object_kindの値|データの内容|
|---|---|
|push|WebHookを設定したリポジトリに対し、pushした時に発行されるイベント|
|tag_push|WebHookを設定したリポジトリンに対し、tagをpushした時に発行されるイベント|
|issue|WebHookを設定したリポジトリのIssueに変化が起きた時に発行されるイベント|
|merge_request|WebHookを設定したリポジトリに関連する、Merge Requestの操作を行った時に発行されるイベント|


## pushイベント時に送られてくるデータ形式

pushイベント時にGitLabから送られてくるデータ形式を示します。
リポジトリを削除した場合にもpushイベントが発生しますが、キー ```after``` の値が0の羅列であるかで判定可能です。
★は調査中の項目です。

|キー|子キー|孫キー|値|
|---|---|---|---|
|after|||push後の最新のコミットのハッシュ値（リポジトリ削除の場合は0の羅列）|
|before|||push前の最新のコミットのハッシュ値|
|checkout_sha|||★|
|commits|||コミット一覧（配列）|
||author||コミット者の情報|
|||email|コミット者のE-mailアドレス|
|||name|コミット者の名前|
||id||コミットのハッシュ|
||message||コミットメッセージ|
||timestamp||コミット日時|
||url||コミットをGitLab上で確認するためのURL|
|object_kind|||イベントの種類（ ```push``` ）|
|project_id|||プロジェクトのID|
|ref|||コミット先のブランチ|
|repository|||push先のリポジトリ情報|
||description||★|
||git_http_url||リポジトリへHTTPアクセス時に必要となるURI|
||git_ssh_url||リポジトリへSSHアクセス時に必要となるURI|
||homepage||リポジトリのホームページ|
||name||リポジトリ名|
||url||★ *git_ssh_url* と同様|
||visibility_level||★|
|total_commits_count|||pushに含まれるコミット数|
|user_email|||pushを行った人のE-mailアドレス|
|user_id|||pushを行った人のユーザID|
|user_name|||pushを行った人の名前|

### tag_pushイベント時に送られてくるデータ形式

tag_pushイベント時にGitLabから送られてくるデータ形式を示します。
★は調査中の項目です。

|キー|子キー|内容|
|---|---|---|
|after||push後の最新のコミットのハッシュ値|
|before||push前の最新のコミットのハッシュ値（本タグに対する前のコミットはないため確実に0の羅列になる）|
|checkout_sha||push前の最新コミットのハッシュ値（本タグではなく、リポジトリ全体の最新コミットハッシュ値）|
|commits||コミット一覧（常に空の配列）|
|object_kind||イベントの種類（ ```tag_push``` ）|
|project_id||プロジェクトのID|
|ref||コミット先のブランチ（pushしたタグ名を取得可能）|
|repository||push先のリポジトリ情報|
||description|★|
||git_http_url|リポジトリへHTTPアクセス時に必要となるURI|
||git_ssh_url|リポジトリへSSHアクセス時に必要となるURI|
||homepage|リポジトリのホームページ|
||name|リポジトリ名|
||url|★ *git_ssh_url* と同様|
||visibility_level|★|
|total_commits_count||pushに含まれるコミット数（常に0）|
|user_email||pushを行った人のE-mailアドレス|
|user_id||pushを行った人のユーザID|
|user_name||pushを行った人の名前|

★ 名前等からの推測のため、情報提供求

### issueイベント時に送られてくるデータ形式

issueイベント時にGitLabから送られてくるデータ形式を示します。
既存のIssueに対してコメントを行った場合は、イベントは発生しません。
Issueに対して```open```/```close```/```reopen```を発行すると、```update```イベントも同時に発行されます。
★は調査中の項目です。

|キー|子キー|内容|
|---|---|---|
|object_attributes||Issueイベントに関する様々な情報|
||action|Issueに対する操作<br> - ```open```: Issueを発行 <br> - ```update```: Issueを更新 <br> - ```close```: Issueをクローズ <br> - ```reopen```: Issueを再オープン|
||assignee_id|Assign toでIssueの担当者として割り当てられたユーザID|
||author_id|Issue発行者のユーザID|
||branch_name|Issueを発行したブランチ|
||created_at|Issue発行日時|
||description|Issueの説明文|
||id|IssueのID|
||iid|GitLab上で割り当てられたIssue番号（#で始まる番号）|
||milestone_id|関連付けしたMilestoneのID（割り当てないとnull）|
||position|★|
||project_id|プロジェクトのID|
||state|イベント発行後のIssueの状態 <br> - ```opened``` : IssueがOpen状態 <br> - ```closed``` : IssueがClosed状態 <br> - ```reopened``` : 1度closeしたが、再度open状態に変化|
||title|Issueのタイトル|
||updated_at|イベント発行日時|
||url|本IssueのGitLab上でのURL|
|object_kind||イベントの種類（issue）|
|user||イベント発行者の情報|
||avater_url|イベント発行者のアバター画像のURL|
||name|イベント発行者の名前|
||username|イベント発行者のニックネーム|

### merge_requestイベントに送られてくるデータ形式

merge_requestイベント時にGitLabから送られてくるデータ形式を示します。
既存のMerge Requestに対するコメントを行った場合、イベントは発生しません。
Merge Request上でソースを修正してcommitすると、pushイベントが発行されます。
Merge Requestに対して、 ```open``` / ```close``` / ```merge``` を発行すると、merge_requestの ```update``` イベントも同時に発行されます。
★は調査中の項目です。

|キー|子キー|孫キー|曾孫キー|内容|
|---|---|---|---|---|
|object_attributes||||Merge Requestイベントに関する様々な情報|
||action|||Merge Requestに対する操作<br> - ```open``` : Merge Requestを発行 <br> - ```closed``` : Merge Requestをクローズ <br> - ```reopen``` : クローズしたMerge Requestを再オープン|
||assignee_id|||Assign toでMerge Requestの担当者として割り当てられたユーザID|
||author_id|||Merge Request発行者のユーザID|
||created_at|||Merge Request発行日時|
||description|||Merge Requestの説明文|
||id|||Merge RequestのID|
||iid|||GitLab上で割り当てられたMerge Request番号（#で始まる番号）|
||last_commit|||Merge Request内の最終コミットの情報|
|||author||コミット者の情報|
||||email|コミット者のE-mailアドレス|
||||name|コミット者の名前|
|||id||コミットのハッシュ値|
|||message||コミットのメッセージ|
|||timestamp||コミット日時|
|||url||コミットをGitLab上で確認するためのURL|
||locked_at|||★|
||merge_status|||★Merge Requestの状態 <br> - ```unchecked``` : <br> - ```can_be_merged``` : |
||milestone_id|||関連付けしたMilestoneのID（割り当てないとnull）|
||position|||★|
||source|||Merge Request元のリポジトリ情報|
|||http_url||リポジトリへHTTPアクセス時に必要となるURI|
|||name||リポジトリ名|
|||namespace||リポジトリが所属するグループ名|
|||ssh_url||リポジトリへSSHアクセス時に必要となるURI|
|||visibility_level||★|
||source_branch|||Merge Request元のブランチ名|
||source_project_id|||Merge Request元のプロジェクトID|
||state|||イベント発行後のMerge Requestの状態 <br> - ```opened``` : Merge RequestがOpen状態 <br> - ```closed``` : Merge RequestがClose状態 <br> - ```reopened``` : 1度closeしたが、再度open状態に変化 <br> - ```merged``` : Mergeが完了した状態|
||target|||Merge Request先のリポジトリ情報|
|||http_url||リポジトリへHTTPアクセス時に必要となるURI|
|||name||リポジトリ名|
|||namespace||リポジトリが所属するグループ名|
|||ssh_url||リポジトリへSSHアクセス時に必要となるURI|
|||visibility_level||★|
||target_branch|||Merge Request先のブランチ名|
||target_project_id|||Merge Request先のプロジェクトID|
||title|||Merge Requestのタイトル|
||updated_at|||イベント発行日時|
||url|||本Merge RequestのGitLab上でのURL|
|object_kind||||イベントの種類（merge_request）|
|user||||イベント発行者の情報|
||avater_url|||イベント発行者のアバター画像のURL|
||name|||イベント発行者の名前|
||username|||イベント発行者のニックネーム|