Show page source of ScmWebHooks #106569

[[PageNavi(NavigationList)]]

= リポジトリ Web フック

== Web フックについて

コードリポジトリをローカルで使用する場合、各種アクションに対してスクリプトによるフックがかけられます。
これと同じように、OSDN では 「Webフック」を使用することができます。

具体的には push (svn の場合はコミット) が行われた際、その内容を JSON に変換して指定された URL に POST します。
POST 先では JSON を解釈して好きなアクションをすることができます。

== 設定方法

プロジェクトもしくは作業部屋の管理者でログインし、リポジトリブラウザのサブメニュー「フック」から設定してください。

== 送られるデータ

データ構造は[https://help.github.com/articles/post-receive-hooks github の物]に近付けてあります。
ただし、現在のところ push の中に存在する個々のコミット情報は含まれません。

データは通常の HTML フォームと同じく、Content-Disposition: form-data 形式で '''POST''' メソッドで送信され、
"payload" という単一キーを持ち、中身は JSON 形式です。

=== 送信されるデータの例
{{{ code javascript

{
	"after": "6829ef8417b4d6c7cb20f4a34b6ccf4cb97dabe2",
	"before": "6789be548cc0d16a94f6d128ff813b64184ba549",
	"head_commit": {
		"author": {
			"email": "sugi@nemui.org",
			"name": "Tatsuki Sugiura"
		},
		"id": "6829ef8417b4d6c7cb20f4a34b6ccf4cb97dabe2",
		"message": "Test!\n",
		"timestamp": "2013-06-07T17:34:49",
		"url": "http://osdn.net/users/sugi/pf/sugitest/commits/6829ef8417b4d6c7cb20f4a34b6ccf4cb97dabe2"
	},
	"pusher": "sugi",
	"ref": "refs/heads/master",
	"repository": {
		"created_at": 1291198691,
		"description": "<i> test",
		"id": "6",
		"name": "sugitest",
		"pushed_at": 1370594094,
		"type": "git",
		"url": "http://osdn.net/users/sugi/pf/sugitest/"
	}
}
}}}

=== データフィールドと意味
{{{ html
<table class="wikitable">
<tr><th>フィールド </th><th>git</th><th>hg</th><th>svn</th></tr>
<tr><td> after  </td><td> push後のコミットID </td><td> push後(最終)のコミットID  </td><td> コミットしたリビジョン </td></tr>
<tr><td> before </td><td> push前のコミットID </td><td> そのpushに含まれる最初のコミットID </td><td> null </td></tr>
<tr><td> head_commit </td><td> after のIDのコミット情報 </td><td>after のIDのコミット情報 </td><td> コミット情報 </td></tr>
<tr><td> pusher </td><td colspan="3"> OSDNのユーザID </td></tr>
<tr><td> ref </td><td> push 先の ref </td><td> push 先のブランチ名 </td><td> 変更されたディレクトリパス </td></tr>
<tr><td> repository </td><td colspan="3"> リポジトリ情報  </td></tr>
</table>
}}}

== フックのテスト

「テスト」のボタンを押すと、最後に push された情報を使って、実際にフックリクエストを実行します。
[http://requestb.in/ requestbin] などを利用すると実際に送られるデータを確認できます。

== 注意・制限事項

 * Webフックは'''リアルタイムには実行されません'''。
 * 短い時間に連続してpushがあった場合、Webフックの'''実行順序は保証されません'''。
 * システム的には、push (commit) の時点でキューに入れられ、数分以内に実行されます。push の時間が必要な場合は、データ内の repository.pushed_at を参照してください。
 * フックそれぞれに関して、いつでも有効無効を切り替えることができます。無効化されたフックは単純にスキップされます。
 * フックでエラーが発生した場合、再試行は行われず、単にエラーが起きたことが記録されます。
 * 連続して10回以上エラーになった場合、そのフックは自動的に無効化されます。

[[PageNavi(NavigationList)]]